KeCopyContextToUmsContext

NTSTATUS __stdcall KeCopyContextToUmsContext(INT64 a1, INT64 a2){
  __int64 v4; 
  int v5; 
  _OWORD *v6; 
  _OWORD *v7; 
  _WORD *v9; 
  UINT64 ContextFlags; 
  int v11; 

  v11 = *(_DWORD *)(a2 + 48);
  LODWORD(ContextFlags) = v11 & 0x100013;
  RtlpSanitizeContextFlags(&ContextFlags, 1);
  RtlpCopyLegacyContext(1, (_CONTEXT *)(a1 + 16), (unsigned int)ContextFlags, (_CONTEXT *)a2);
  v9 = (_WORD *)((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64);
  v4 = 4i64;
  if( (*(_DWORD *)(a1 + 1264) & 4) == 0 )
  {
    *(_WORD *)(((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 2) = 0;
    *(_BYTE *)(((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 4) = 0;
    if( KUSER_SHARED_DATA.XState.EnabledFeatures )
    {
      memset(v9 + 256, 0i64, 0x40u);
      *(_QWORD *)(((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x200) = 3i64;
    }
  }
  *(_DWORD *)(a1 + 1264) |= 4u;
  v5 = v11;
  if( (v11 & 0x100040) == 1048640 && KUSER_SHARED_DATA.XState.EnabledFeatures )
    KiCopyXStateArea(
      (INT64)v9,
      KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64,
      *(int *)(a2 + 1248) + a2 + 720);
  if( (v5 & 0x100008) == 1048584 )
  {
    v6 = (_OWORD *)((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64);
    v7 = (_OWORD *)(a2 + 256);
    do
    {
      *v6 = *v7;
      v6[1] = v7[1];
      v6[2] = v7[2];
      v6[3] = v7[3];
      v6[4] = v7[4];
      v6[5] = v7[5];
      v6[6] = v7[6];
      v6 += 8;
      *(v6 - 1) = v7[7];
      v7 += 8;
      --v4;
    }
    while( v4 );
    *v9 = *(_WORD *)(a2 + 256) & 0x1F3F;
    *(_DWORD *)(((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x18) = KiMxCsrMask & *(_DWORD *)(a2 + 52);
  }
  if( (v5 & 0x100010) == 1048592 )
  {
    if( (*(_DWORD *)(a1 + 128) & 0x355i64) != 0 )
      _interlockedbittestandset((volatile signed __int32 *)(a1 + 1264), 4u);
    else
      _interlockedbittestandreset((volatile signed __int32 *)(a1 + 1264), 4u);
  }
  return 0;
}

Referenced by:

PspSetUmsThreadContext