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