PspSetContext

__int64 __fastcall PspSetContext(__int64 a1, __int64 a2, __int64 a3, char a4){
  int v4; 
  int v9; 
  int v10; 
  __int64 v11; 
  __int16 v12; 
  bool v13; 
  __int64 result; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  __int64 v23; 
  INT64 v24; 
  _QWORD *SparePtr; 
  INT64 v26; 
  _QWORD *v27; 

  v4 = *(_DWORD *)(a3 + 48);
  if( (v4 & 0x100001) == 1048577 )
  {
    v9 = *(_DWORD *)(a3 + 68);
    if( a4 )
      v10 = v9 & 0x210DD5 | 0x200;
    else
      v10 = v9 & 0x250FD5;
    *(_DWORD *)(a1 + 376) = v10;
    v11 = *(_QWORD *)(a3 + 248);
    *(_QWORD *)(a1 + 360) = v11;
    *(_QWORD *)(a1 + 384) = *(_QWORD *)(a3 + 152);
    if( a4 == 1 )
    {
      *(_WORD *)(a1 + 392) = 43;
      v12 = 35;
      v13 = *(_WORD *)(a3 + 56) == 51;
      if( *(_WORD *)(a3 + 56) == 51 )
        v12 = 51;
      *(_WORD *)(a1 + 368) = v12;
      if( v13 )
        v11 = v11 << 16 >> 16;
      else
        v11 = (unsigned int)v11;
    }
    else
    {
      *(_WORD *)(a1 + 392) = 0;
      *(_WORD *)(a1 + 368) = 16;
    }
    *(_QWORD *)(a1 + 360) = v11;
  }
  if( (v4 & 0x100002) == 1048578 )
  {
    *(_QWORD *)(a1 + 48) = *(_QWORD *)(a3 + 120);
    *(_QWORD *)(a1 + 56) = *(_QWORD *)(a3 + 128);
    *(_QWORD *)(a1 + 64) = *(_QWORD *)(a3 + 136);
    *(_QWORD *)(a1 + 72) = *(_QWORD *)(a3 + 184);
    *(_QWORD *)(a1 + 80) = *(_QWORD *)(a3 + 192);
    *(_QWORD *)(a1 + 88) = *(_QWORD *)(a3 + 200);
    *(_QWORD *)(a1 + 96) = *(_QWORD *)(a3 + 208);
    **(_QWORD **)(a2 + 152) = *(_QWORD *)(a3 + 144);
    **(_QWORD **)(a2 + 168) = *(_QWORD *)(a3 + 160);
    **(_QWORD **)(a2 + 176) = *(_QWORD *)(a3 + 168);
    **(_QWORD **)(a2 + 184) = *(_QWORD *)(a3 + 176);
    **(_QWORD **)(a2 + 224) = *(_QWORD *)(a3 + 216);
    **(_QWORD **)(a2 + 232) = *(_QWORD *)(a3 + 224);
    **(_QWORD **)(a2 + 240) = *(_QWORD *)(a3 + 232);
    **(_QWORD **)(a2 + 248) = *(_QWORD *)(a3 + 240);
  }
  if( (v4 & 0x100040) == 1048640 && a4 == 1 )
  {
    v24 = *(int *)(a3 + 1248) + a3 + 720;
    SparePtr = KeGetCurrentThread()->WaitBlock[1].SparePtr;
    if( SparePtr )
    {
      v27 = (_QWORD *)*SparePtr;
      if( *SparePtr )
      {
        do
        {
          SparePtr = v27;
          v27 = (_QWORD *)*v27;
        }
        while( v27 );
      }
      v26 = SparePtr[5];
    }
    else
    {
      v26 = 0i64;
    }
    if( v26 )
      KiCopyXStateArea(v26, KUSER_SHARED_DATA.XState.EnabledVolatileFeatures & 0xFFFFFFFFFFFFFFFCui64, v24);
    else
      RtlXRestoreS(
        (PFN_IO_CONNECT_INTERRUPT *)(*(int *)(a3 + 1248) + a3 + 720),
        (_XSTATE_CONFIGURATION *)((KUSER_SHARED_DATA.XState.EnabledVolatileFeatures | KUSER_SHARED_DATA.XState.EnabledUserVisibleSupervisorFeatures) & 0xFFFFFFFFFFFFFFFCui64));
  }
  if( (v4 & 0x100008) == 1048584 )
  {
    *(_OWORD *)(a1 + 112) = *(_OWORD *)(a3 + 416);
    *(_OWORD *)(a1 + 128) = *(_OWORD *)(a3 + 432);
    *(_OWORD *)(a1 + 144) = *(_OWORD *)(a3 + 448);
    *(_OWORD *)(a1 + 160) = *(_OWORD *)(a3 + 464);
    *(_OWORD *)(a1 + 176) = *(_OWORD *)(a3 + 480);
    *(_OWORD *)(a1 + 192) = *(_OWORD *)(a3 + 496);
    *(_OWORD *)*(_QWORD *)(a2 + 48) = *(_OWORD *)(a3 + 512);
    *(_OWORD *)*(_QWORD *)(a2 + 56) = *(_OWORD *)(a3 + 528);
    *(_OWORD *)*(_QWORD *)(a2 + 64) = *(_OWORD *)(a3 + 544);
    *(_OWORD *)*(_QWORD *)(a2 + 72) = *(_OWORD *)(a3 + 560);
    *(_OWORD *)*(_QWORD *)(a2 + 80) = *(_OWORD *)(a3 + 576);
    *(_OWORD *)*(_QWORD *)(a2 + 88) = *(_OWORD *)(a3 + 592);
    *(_OWORD *)*(_QWORD *)(a2 + 96) = *(_OWORD *)(a3 + 608);
    *(_OWORD *)*(_QWORD *)(a2 + 104) = *(_OWORD *)(a3 + 624);
    *(_OWORD *)*(_QWORD *)(a2 + 112) = *(_OWORD *)(a3 + 640);
    *(_OWORD *)*(_QWORD *)(a2 + 120) = *(_OWORD *)(a3 + 656);
    *(_DWORD *)(a1 + 44) = KiMxCsrMask & *(_DWORD *)(a3 + 52);
    *(_DWORD *)(a3 + 280) = _mm_getcsr();
    *(_WORD *)(a3 + 256) &= 0x1F3Fu;
  }
  result = 1048592i64;
  if( (v4 & 0x100010) == 1048592 )
  {
    v15 = *(_QWORD *)(a3 + 72);
    if( a4 )
    {
      v16 = 0i64;
      if( v15 <= 0x7FFFFFFEFFFFi64 )
        v16 = *(_QWORD *)(a3 + 72);
      v15 = v16;
    }
    *(_QWORD *)(a1 + 216) = v15;
    v17 = *(_QWORD *)(a3 + 80);
    if( a4 )
    {
      v18 = 0i64;
      if( v17 <= 0x7FFFFFFEFFFFi64 )
        v18 = *(_QWORD *)(a3 + 80);
      v17 = v18;
    }
    *(_QWORD *)(a1 + 224) = v17;
    v19 = *(_QWORD *)(a3 + 88);
    if( a4 )
    {
      v20 = 0i64;
      if( v19 <= 0x7FFFFFFEFFFFi64 )
        v20 = *(_QWORD *)(a3 + 88);
      v19 = v20;
    }
    *(_QWORD *)(a1 + 232) = v19;
    v21 = *(_QWORD *)(a3 + 96);
    if( a4 )
    {
      v22 = 0i64;
      if( v21 <= 0x7FFFFFFEFFFFi64 )
        v22 = *(_QWORD *)(a3 + 96);
      v21 = v22;
    }
    *(_QWORD *)(a1 + 240) = v21;
    result = 4294902613i64;
    *(_QWORD *)(a1 + 248) = 0i64;
    v23 = *(_DWORD *)(a3 + 112) & 0xFFFF0355;
    *(_QWORD *)(a1 + 256) = v23;
    if( a4 )
    {
      result = (__int64)KeGetCurrentThread();
      if( (v23 & 0x355) != 0 )
        _interlockedbittestandset((volatile signed __int32 *)result, 0x18u);
      else
        _interlockedbittestandreset((volatile signed __int32 *)result, 0x18u);
    }
  }
  return result;
}

Referenced by:

PspGetSetContextInternal