KeContextFromKframes
VOID __stdcall KeContextFromKframes(_KTRAP_FRAME *TrapFrame, _KTRAP_FRAME *ExceptionFrame, PCONTEXT ContextFrame){
unsigned __int8 CurrentIrql;
unsigned int ContextFlags;
unsigned __int64 Dr7;
__int64 P3Home_low;
_QWORD *SparePtr;
INT64 v11;
unsigned __int8 *v12;
_QWORD *i;
CurrentIrql = KeGetCurrentIrql();
if( !CurrentIrql )
{
KeGetCurrentIrql();
__writecr8(1ui64);
}
ContextFlags = ContextFrame->ContextFlags;
if( (ContextFlags & 0x100001) == 1048577 )
{
ContextFrame->_Rip = TrapFrame->_Rip;
ContextFrame->SegCs = TrapFrame->SegCs;
ContextFrame->SegSs = TrapFrame->SegSs;
ContextFrame->_Rsp = TrapFrame->_Rsp;
ContextFrame->EFlags = TrapFrame->EFlags;
}
if( (ContextFlags & 0x100004) == 1048580 )
{
*(_DWORD *)&ContextFrame->SegDs = 2818091;
*(_DWORD *)&ContextFrame->SegFs = 2818131;
}
if( (ContextFlags & 0x100002) == 1048578 )
{
ContextFrame->_Rax = TrapFrame->_Rax;
ContextFrame->_Rcx = TrapFrame->_Rcx;
ContextFrame->_Rdx = TrapFrame->_Rdx;
ContextFrame->_R8 = TrapFrame->_R8;
ContextFrame->_R9 = TrapFrame->_R9;
ContextFrame->_R10 = TrapFrame->_R10;
ContextFrame->_R11 = TrapFrame->_R11;
ContextFrame->_Rbp = TrapFrame->_Rbp;
ContextFrame->_Rbx = ExceptionFrame->Dr7;
ContextFrame->_Rdi = ExceptionFrame->DebugControl;
ContextFrame->_Rsi = ExceptionFrame->LastBranchToRip;
ContextFrame->_R12 = ExceptionFrame->LastBranchFromRip;
ContextFrame->_R13 = ExceptionFrame->LastExceptionToRip;
ContextFrame->_R14 = ExceptionFrame->LastExceptionFromRip;
ContextFrame->_R15 = *(_QWORD *)&ExceptionFrame->SegDs;
}
if( (ContextFlags & 0x100040) == 1048640 )
{
if( (TrapFrame->SegCs & 1) != 0 )
{
P3Home_low = SLODWORD(ContextFrame[1].P3Home);
SparePtr = KeGetCurrentThread()->WaitBlock[1].SparePtr;
if( SparePtr )
{
for( i = (_QWORD *)*SparePtr; i; i = (_QWORD *)*i )
SparePtr = i;
v11 = SparePtr[5];
}
else
{
v11 = 0i64;
}
v12 = &ContextFrame->FltSave.Reserved4[P3Home_low + 48];
if( v11 )
KiCopyXStateArea((INT64)v12, KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64, v11);
else
RtlXSaveS(
(INT64)v12,
(KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64);
}
ContextFrame->_MxCsr = TrapFrame->_MxCsr;
ContextFrame->FltSave._MxCsr = TrapFrame->_MxCsr;
}
if( (ContextFlags & 0x100008) == 1048584 )
{
if( (TrapFrame->SegCs & 1) != 0 )
_fxsave(&ContextFrame->256);
ContextFrame->_Xmm0 = TrapFrame->_Xmm0;
ContextFrame->_Xmm1 = TrapFrame->_Xmm1;
ContextFrame->_Xmm2 = TrapFrame->_Xmm2;
ContextFrame->_Xmm3 = TrapFrame->_Xmm3;
ContextFrame->_Xmm4 = TrapFrame->_Xmm4;
ContextFrame->_Xmm5 = TrapFrame->_Xmm5;
ContextFrame->_Xmm6 = *(_M128A *)&ExceptionFrame->_Rax;
ContextFrame->_Xmm7 = *(_M128A *)&ExceptionFrame->_Rdx;
ContextFrame->_Xmm8 = *(_M128A *)&ExceptionFrame->_R9;
ContextFrame->_Xmm9 = *(_M128A *)&ExceptionFrame->_R11;
ContextFrame->_Xmm10 = ExceptionFrame->_Xmm0;
ContextFrame->_Xmm11 = ExceptionFrame->_Xmm1;
ContextFrame->_Xmm12 = ExceptionFrame->_Xmm2;
ContextFrame->_Xmm13 = ExceptionFrame->_Xmm3;
ContextFrame->_Xmm14 = ExceptionFrame->_Xmm4;
ContextFrame->_Xmm15 = ExceptionFrame->_Xmm5;
ContextFrame->_MxCsr = TrapFrame->_MxCsr;
ContextFrame->FltSave._MxCsr = TrapFrame->_MxCsr;
}
if( (ContextFlags & 0x100010) == 1048592 )
{
if( (TrapFrame->Dr7 & 0x355) != 0 )
{
ContextFrame->Dr0 = TrapFrame->Dr0;
ContextFrame->Dr1 = TrapFrame->Dr1;
ContextFrame->Dr2 = TrapFrame->Dr2;
ContextFrame->Dr3 = TrapFrame->Dr3;
ContextFrame->Dr6 = TrapFrame->Dr6;
Dr7 = TrapFrame->Dr7;
}
else
{
ContextFrame->Dr0 = 0i64;
ContextFrame->Dr1 = 0i64;
ContextFrame->Dr2 = 0i64;
ContextFrame->Dr3 = 0i64;
ContextFrame->Dr6 = 0i64;
Dr7 = 0i64;
}
ContextFrame->Dr7 = Dr7;
KeCopyLastBranchInformation((INT64)ContextFrame, (INT64)TrapFrame);
}
if( !CurrentIrql )
__writecr8(0i64);
}Referenced by:
KeCopyContextFromUch
KiCaptureUmsThreadContext
KiDispatchException
KiInitializeUserApc
KiSaveProcessorState