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