KiSaveProcessorControlState
VOID __stdcall KiSaveProcessorControlState(_KPROCESSOR_STATE *ProcessorState){
int v1;
unsigned __int64 v2;
unsigned __int64 v3;
unsigned __int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
_KPROCESSOR_STATE *v12;
int v13;
unsigned __int64 v14;
unsigned __int64 v15;
int v16;
unsigned __int64 v17;
v2 = __readcr0();
ProcessorState->SpecialRegisters.Cr0 = v2;
v3 = __readcr2();
ProcessorState->SpecialRegisters.Cr2 = v3;
v4 = __readcr3();
ProcessorState->SpecialRegisters.Cr3 = v4;
v5 = __readcr4();
ProcessorState->SpecialRegisters.Cr4 = v5;
ProcessorState->SpecialRegisters.Cr8 = KeGetCurrentIrql();
ProcessorState->SpecialRegisters.Ldtr = 0;
if( !(BYTE5(Mm64BitPhysicalAddress) | (unsigned __int8)VslVsmEnabled) )
{
__sgdt(&ProcessorState->SpecialRegisters.Gdtr.Limit);
__sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
__asm { str word ptr [rcx+70h] }
}
ProcessorState->SpecialRegisters._MxCsr = _mm_getcsr();
ProcessorState->SpecialRegisters.Xcr0 = 0i64;
if( (ProcessorState->SpecialRegisters.Cr4 & 0x40000) != 0 )
{
LODWORD(ProcessorState->SpecialRegisters.Xcr0) = _xgetbv(0);
HIDWORD(ProcessorState->SpecialRegisters.Xcr0) = v1;
}
v6 = __readdr(0);
v7 = __readdr(1u);
ProcessorState->SpecialRegisters.KernelDr0 = v6;
ProcessorState->SpecialRegisters.KernelDr1 = v7;
v8 = __readdr(2u);
v9 = __readdr(3u);
ProcessorState->SpecialRegisters.KernelDr2 = v8;
ProcessorState->SpecialRegisters.KernelDr3 = v9;
v10 = __readdr(6u);
v11 = __readdr(7u);
ProcessorState->SpecialRegisters.KernelDr6 = v10;
ProcessorState->SpecialRegisters.KernelDr7 = v11;
__writedr(7u, 0i64);
if( (KeGetPcr()->Prcb.FeatureBits & 0x20000) != 0 && (v11 & 0x300) != 0 )
{
if( (KiCpuTracingFlags & 2) != 0 )
{
ProcessorState->SpecialRegisters.LastBranchFromRip = 0i64;
ProcessorState->SpecialRegisters.LastBranchToRip = 0i64;
ProcessorState->SpecialRegisters.LastExceptionFromRip = 0i64;
ProcessorState->SpecialRegisters.LastExceptionToRip = 0i64;
}
else
{
v12 = ProcessorState;
v13 = KiLastBranchTOSMSR;
if( KiLastBranchTOSMSR )
{
v14 = __readmsr(KiLastBranchTOSMSR);
v13 = v14;
}
v15 = __readmsr(v13 + KiLastBranchFromBaseMSR);
LODWORD(ProcessorState->SpecialRegisters.LastBranchFromRip) = v15;
v16 = KiLastBranchToBaseMSR;
HIDWORD(v12->SpecialRegisters.LastBranchFromRip) = HIDWORD(v15);
v12->SpecialRegisters.LastBranchToRip = __readmsr(v13 + v16);
v12->SpecialRegisters.LastExceptionFromRip = __readmsr(KiLastExceptionFromBaseMSR);
v12->SpecialRegisters.LastExceptionToRip = __readmsr(KiLastExceptionToBaseMSR);
v17 = __readmsr(0x1D9u);
__writemsr(0x1D9u, __PAIR64__(HIDWORD(v17), (unsigned int)v17 & 0xFFFFFFFC));
}
}
}Referenced by:
ExpSystemErrorHandler
IopLiveDumpCorralDpc
IopLiveDumpEndMirroringCallback
KdpCommandString
KdpReport
KdpSymbol
KeBugCheckEx
KeSaveStateForHibernate
KiFreezeTargetExecution
KiSaveProcessorState