KeCopyContextToUch

INT64 __fastcall KeCopyContextToUch(INT64 a1, INT64 a2){
  int v2; 
  INT64 result; 
  __int64 v6; 
  _OWORD *v7; 
  __int64 v8; 
  int v9; 
  __int128 v10; 
  UINT64 ContextFlags; 
  v2 = *(_DWORD *)(a2 + 48);
  LODWORD(ContextFlags) = v2 & 0x100013;
  RtlpSanitizeContextFlags(&ContextFlags, 1);
  KeContextToKframes(
    *(_KTRAP_FRAME **)(a1 + 80),
    *(_KEXCEPTION_FRAME **)(a1 + 88),
    (_CONTEXT *)a2,
    (unsigned int)ContextFlags,
    1);
  if( (v2 & 0x100040) == 1048640 && KUSER_SHARED_DATA.XState.EnabledFeatures && (*(_BYTE *)(a1 + 72) & 1) != 0 )
    KiCopyXStateArea(
      *(_QWORD *)(a1 + 64),
      KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64,
      *(int *)(a2 + 1248) + a2 + 720);
  result = 1048584i64;
  if( (v2 & 0x100008) == 1048584 )
  {
    if( (*(_BYTE *)(a1 + 72) & 1) != 0 )
    {
      v6 = *(_QWORD *)(a1 + 64);
      v7 = (_OWORD *)(a2 + 256);
      v8 = 4i64;
      v9 = *(_DWORD *)(v6 + 24);
      do
      {
        *(_OWORD *)v6 = *v7;
        *(_OWORD *)(v6 + 16) = v7[1];
        *(_OWORD *)(v6 + 32) = v7[2];
        *(_OWORD *)(v6 + 48) = v7[3];
        *(_OWORD *)(v6 + 64) = v7[4];
        *(_OWORD *)(v6 + 80) = v7[5];
        *(_OWORD *)(v6 + 96) = v7[6];
        v6 += 128i64;
        v10 = v7[7];
        v7 += 8;
        *(_OWORD *)(v6 - 16) = v10;
        --v8;
      }
      while( v8 );
      *(_DWORD *)(*(_QWORD *)(a1 + 64) + 24i64) = v9;
      *(_OWORD *)(*(_QWORD *)(a1 + 80) + 112i64) = *(_OWORD *)(a2 + 416);
      *(_OWORD *)(*(_QWORD *)(a1 + 80) + 128i64) = *(_OWORD *)(a2 + 432);
      *(_OWORD *)(*(_QWORD *)(a1 + 80) + 144i64) = *(_OWORD *)(a2 + 448);
      *(_OWORD *)(*(_QWORD *)(a1 + 80) + 160i64) = *(_OWORD *)(a2 + 464);
      *(_OWORD *)(*(_QWORD *)(a1 + 80) + 176i64) = *(_OWORD *)(a2 + 480);
      *(_OWORD *)(*(_QWORD *)(a1 + 80) + 192i64) = *(_OWORD *)(a2 + 496);
    }
    **(_WORD **)(a1 + 64) = *(_WORD *)(a2 + 256) & 0x1F3F;
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 48i64) = *(_OWORD *)(a2 + 512);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 64i64) = *(_OWORD *)(a2 + 528);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 80i64) = *(_OWORD *)(a2 + 544);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 96i64) = *(_OWORD *)(a2 + 560);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 112i64) = *(_OWORD *)(a2 + 576);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 128i64) = *(_OWORD *)(a2 + 592);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 144i64) = *(_OWORD *)(a2 + 608);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 160i64) = *(_OWORD *)(a2 + 624);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 176i64) = *(_OWORD *)(a2 + 640);
    *(_OWORD *)(*(_QWORD *)(a1 + 88) + 192i64) = *(_OWORD *)(a2 + 656);
    result = *(_QWORD *)(a1 + 80);
    *(_DWORD *)(result + 44) = KiMxCsrMask & *(_DWORD *)(a2 + 52);
  }
  return result;
}

Referenced by:

PspSetUmsThreadContext