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