KiRestoreProcessorControlState
VOID __stdcall KiRestoreProcessorControlState(_KPROCESSOR_STATE *ProcessorState){
unsigned __int64 KernelDr1;
unsigned __int64 KernelDr3;
unsigned __int64 KernelDr7;
int v5;
int v6;
unsigned __int64 v7;
__writecr0(ProcessorState->SpecialRegisters.Cr0);
__writecr3(ProcessorState->SpecialRegisters.Cr3);
__writecr4(ProcessorState->SpecialRegisters.Cr4);
__writecr8(ProcessorState->SpecialRegisters.Cr8);
if( !(BYTE5(Mm64BitPhysicalAddress) | (unsigned __int8)VslVsmEnabled) )
{
__lgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
__lidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
_RAX = (char *)ProcessorState->SpecialRegisters.Gdtr.Base + ProcessorState->SpecialRegisters.Tr;
_RAX[5] &= ~2u;
__asm { ltr word ptr [rcx+70h] }
LOWORD(_RAX) = ProcessorState->SpecialRegisters.Ldtr;
__asm { lldt ax }
}
_mm_setcsr(ProcessorState->SpecialRegisters._MxCsr);
__writedr(7u, 0i64);
KernelDr1 = ProcessorState->SpecialRegisters.KernelDr1;
__writedr(0, ProcessorState->SpecialRegisters.KernelDr0);
__writedr(1u, KernelDr1);
KernelDr3 = ProcessorState->SpecialRegisters.KernelDr3;
__writedr(2u, ProcessorState->SpecialRegisters.KernelDr2);
__writedr(3u, KernelDr3);
KernelDr7 = ProcessorState->SpecialRegisters.KernelDr7;
v5 = 0;
__writedr(6u, 0i64);
__writedr(7u, KernelDr7);
if( (__readgsbyte(0x8722u) & 2) != 0 && (KernelDr7 & 0x300) != 0 && (KiCpuTracingFlags & 2) == 0 )
{
if( (KernelDr7 & 0x200) != 0 )
v5 = 2;
if( (KernelDr7 & 0x100) != 0 )
v5 |= 1u;
v6 = v5;
v7 = __readmsr(0x1D9u);
__writemsr(0x1D9u, __PAIR64__(HIDWORD(v7), v6 | (unsigned int)v7 & 0xFFFFFFFC));
}
}Referenced by:
KdpCommandString
KdpReport
KdpSymbol
KiFreezeTargetExecution
KiRestoreProcessorState