PspGetContext
VOID __stdcall PspGetContext(_KTRAP_FRAME *TrapFrame, _CONTEXT *ContextRecord){
INT64 v2;
int v3;
INT64 v5;
unsigned __int64 Dr7;
unsigned int v8;
unsigned __int8 ExceptionActive;
int v10;
__int64 v11;
_QWORD *SparePtr;
INT64 v13;
INT64 v14;
_QWORD *v15;
v3 = *(_DWORD *)(v2 + 48);
v5 = v2;
if( (v3 & 0x100001) == 1048577 )
{
*(_QWORD *)(v2 + 248) = TrapFrame->_Rip;
*(_WORD *)(v2 + 56) = TrapFrame->SegCs;
*(_WORD *)(v2 + 66) = TrapFrame->SegSs;
*(_QWORD *)(v2 + 152) = TrapFrame->_Rsp;
*(_DWORD *)(v2 + 68) = TrapFrame->EFlags;
}
if( (v3 & 0x100004) == 1048580 )
{
*(_DWORD *)(v2 + 58) = 2818091;
*(_DWORD *)(v2 + 62) = 2818131;
}
if( (v3 & 0x100002) == 1048578 )
{
*(_QWORD *)(v2 + 120) = TrapFrame->_Rax;
*(_QWORD *)(v2 + 128) = TrapFrame->_Rcx;
*(_QWORD *)(v2 + 136) = TrapFrame->_Rdx;
*(_QWORD *)(v2 + 184) = TrapFrame->_R8;
*(_QWORD *)(v2 + 192) = TrapFrame->_R9;
*(_QWORD *)(v2 + 200) = TrapFrame->_R10;
*(_QWORD *)(v2 + 208) = TrapFrame->_R11;
*(_QWORD *)(v2 + 144) = *(_QWORD *)ContextRecord->_Rsp;
*(_QWORD *)(v2 + 160) = *(_QWORD *)ContextRecord->_Rsi;
*(_QWORD *)(v2 + 168) = *(_QWORD *)ContextRecord->_Rdi;
*(_QWORD *)(v2 + 176) = *(_QWORD *)ContextRecord->_R8;
*(_QWORD *)(v2 + 216) = *(_QWORD *)ContextRecord->_R13;
*(_QWORD *)(v2 + 224) = *(_QWORD *)ContextRecord->_R14;
*(_QWORD *)(v2 + 232) = *(_QWORD *)ContextRecord->_R15;
*(_QWORD *)(v2 + 240) = *(_QWORD *)ContextRecord->_Rip;
}
Dr7 = 0i64;
if( (v3 & 0x100040) == 1048640 )
{
if( (TrapFrame->SegCs & 1) != 0 )
{
v11 = *(int *)(v2 + 1248);
SparePtr = KeGetCurrentThread()->WaitBlock[1].SparePtr;
if( SparePtr )
{
v15 = (_QWORD *)*SparePtr;
if( *SparePtr )
{
do
{
SparePtr = v15;
v15 = (_QWORD *)*v15;
}
while( v15 );
}
v13 = SparePtr[5];
}
else
{
v13 = 0i64;
}
v14 = v5 + v11 + 720;
if( v13 )
KiCopyXStateArea(v14, KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64, v13);
else
RtlXSaveS(
v14,
(KUSER_SHARED_DATA.XState.EnabledFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64);
}
*(_DWORD *)(v5 + 52) = TrapFrame->_MxCsr;
*(_DWORD *)(v5 + 280) = TrapFrame->_MxCsr;
}
if( (v3 & 0x100008) == 1048584 )
{
*(_M128A *)(v5 + 416) = TrapFrame->_Xmm0;
*(_M128A *)(v5 + 432) = TrapFrame->_Xmm1;
*(_M128A *)(v5 + 448) = TrapFrame->_Xmm2;
*(_M128A *)(v5 + 464) = TrapFrame->_Xmm3;
*(_M128A *)(v5 + 480) = TrapFrame->_Xmm4;
*(_M128A *)(v5 + 496) = TrapFrame->_Xmm5;
*(_OWORD *)(v5 + 512) = *(_OWORD *)*(_QWORD *)&ContextRecord->ContextFlags;
*(_OWORD *)(v5 + 528) = *(_OWORD *)*(_QWORD *)&ContextRecord->SegCs;
*(_OWORD *)(v5 + 544) = *(_OWORD *)*(_QWORD *)&ContextRecord->SegGs;
*(_OWORD *)(v5 + 560) = *(_OWORD *)ContextRecord->Dr0;
*(_OWORD *)(v5 + 576) = *(_OWORD *)ContextRecord->Dr1;
*(_OWORD *)(v5 + 592) = *(_OWORD *)ContextRecord->Dr2;
*(_OWORD *)(v5 + 608) = *(_OWORD *)ContextRecord->Dr3;
*(_OWORD *)(v5 + 624) = *(_OWORD *)ContextRecord->Dr6;
*(_OWORD *)(v5 + 640) = *(_OWORD *)ContextRecord->Dr7;
*(_OWORD *)(v5 + 656) = *(_OWORD *)ContextRecord->_Rax;
*(_DWORD *)(v5 + 52) = TrapFrame->_MxCsr;
*(_DWORD *)(v5 + 280) = TrapFrame->_MxCsr;
}
if( (v3 & 0x100010) == 1048592 )
{
if( (TrapFrame->Dr7 & 0x355) != 0 )
{
*(_QWORD *)(v5 + 72) = TrapFrame->Dr0;
*(_QWORD *)(v5 + 80) = TrapFrame->Dr1;
*(_QWORD *)(v5 + 88) = TrapFrame->Dr2;
*(_QWORD *)(v5 + 96) = TrapFrame->Dr3;
*(_QWORD *)(v5 + 104) = TrapFrame->Dr6;
Dr7 = TrapFrame->Dr7;
}
else
{
*(_QWORD *)(v5 + 72) = 0i64;
*(_QWORD *)(v5 + 80) = 0i64;
*(_QWORD *)(v5 + 88) = 0i64;
*(_QWORD *)(v5 + 96) = 0i64;
*(_QWORD *)(v5 + 104) = 0i64;
}
*(_QWORD *)(v5 + 112) = Dr7;
KeCopyLastBranchInformation(v5, (INT64)TrapFrame);
}
if( (v3 & 0x40000000) != 0 )
{
v8 = *(_DWORD *)(v5 + 48) & 0x67FFFFFF | 0x80000000;
*(_DWORD *)(v5 + 48) = v8;
ExceptionActive = TrapFrame->ExceptionActive;
if( ExceptionActive == 1 )
{
v10 = v8 | 0x8000000;
}
else
{
if( ExceptionActive != 2 )
return;
v10 = v8 | 0x10000000;
}
*(_DWORD *)(v5 + 48) = v10;
}
}Referenced by:
PspGetSetContextInternal