KiCaptureUmsThreadContext
NTSTATUS __stdcall KiCaptureUmsThreadContext(INT64 a1, INT64 a2){
__int64 v3;
INT64 v4;
__int64 v5;
_XSAVE_AREA *v6;
_CONTEXT *ContextFrame;
v3 = *(_QWORD *)(a2 + 88);
v4 = *(_QWORD *)(a2 + 80);
if( (*(_BYTE *)(a2 + 72) & 1) != 0 )
{
KeGetCurrentIrql();
__writecr8(1ui64);
}
v5 = **(_QWORD **)(a1 + 496);
ContextFrame = (_CONTEXT *)(v5 + 16);
*(_DWORD *)(v5 + 64) = 1048595;
*(_DWORD *)(v5 + 1264) = *(_DWORD *)(v5 + 1264) & 0xFFFFFFFB | (4 * (*(_DWORD *)(a2 + 72) & 1));
v6 = (_XSAVE_AREA *)((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64);
if( (*(_BYTE *)(a2 + 72) & 1) != 0 )
{
KeContextFromKframes((_KTRAP_FRAME *)v4, (_KTRAP_FRAME *)v3, ContextFrame);
if( KUSER_SHARED_DATA.XState.EnabledFeatures )
{
RtlXSave(v6, KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFDui64);
*(_QWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x200) |= 2ui64;
if( (KUSER_SHARED_DATA.XState._bf_0 & 2) != 0 )
*(_QWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x208) |= 2ui64;
}
else
{
_fxsave(v6);
}
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0xA0) = *(_OWORD *)(v4 + 112);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0xB0) = *(_OWORD *)(v4 + 128);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0xC0) = *(_OWORD *)(v4 + 144);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0xD0) = *(_OWORD *)(v4 + 160);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0xE0) = *(_OWORD *)(v4 + 176);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0xF0) = *(_OWORD *)(v4 + 192);
}
else
{
if( (*(_DWORD *)(v4 + 256) & 0x355i64) != 0 )
{
*(_QWORD *)(v5 + 88) = *(_QWORD *)(v4 + 216);
*(_QWORD *)(v5 + 96) = *(_QWORD *)(v4 + 224);
*(_QWORD *)(v5 + 104) = *(_QWORD *)(v4 + 232);
*(_QWORD *)(v5 + 112) = *(_QWORD *)(v4 + 240);
*(_QWORD *)(v5 + 120) = *(_QWORD *)(v4 + 248);
*(_QWORD *)(v5 + 128) = *(_QWORD *)(v4 + 256);
KeCopyLastBranchInformation((INT64)ContextFrame, v4);
}
else
{
*(_QWORD *)(v5 + 128) = 0i64;
}
*(_QWORD *)(v5 + 136) = *(_QWORD *)(v4 + 48);
*(_QWORD *)(v5 + 176) = *(_QWORD *)(v4 + 344);
*(_QWORD *)(v5 + 264) = *(_QWORD *)(v4 + 360);
*(_QWORD *)(v5 + 168) = *(_QWORD *)(v4 + 384);
*(_QWORD *)(v5 + 160) = *(_QWORD *)(v3 + 256);
*(_QWORD *)(v5 + 192) = *(_QWORD *)(v3 + 264);
*(_QWORD *)(v5 + 184) = *(_QWORD *)(v3 + 272);
*(_QWORD *)(v5 + 232) = *(_QWORD *)(v3 + 280);
*(_QWORD *)(v5 + 240) = *(_QWORD *)(v3 + 288);
*(_QWORD *)(v5 + 248) = *(_QWORD *)(v3 + 296);
*(_QWORD *)(v5 + 256) = *(_QWORD *)(v3 + 304);
KeSaveLegacyFloatingPointControlWord();
}
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x100) = *(_OWORD *)(v3 + 48);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x110) = *(_OWORD *)(v3 + 64);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x120) = *(_OWORD *)(v3 + 80);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x130) = *(_OWORD *)(v3 + 96);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x140) = *(_OWORD *)(v3 + 112);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x150) = *(_OWORD *)(v3 + 128);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x160) = *(_OWORD *)(v3 + 144);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x170) = *(_OWORD *)(v3 + 160);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x180) = *(_OWORD *)(v3 + 176);
*(_OWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x190) = *(_OWORD *)(v3 + 192);
*(_DWORD *)(((v5 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x18) = *(_DWORD *)(v4 + 44);
if( (*(_DWORD *)(v5 + 128) & 0x355i64) != 0 )
_interlockedbittestandset((volatile signed __int32 *)(v5 + 1264), 4u);
else
_interlockedbittestandreset((volatile signed __int32 *)(v5 + 1264), 4u);
if( (*(_BYTE *)(a2 + 72) & 1) != 0 )
__writecr8(0i64);
return 0;
}Referenced by:
KiParkUmsThread