KeBuildPrimaryThreadContext

NTSTATUS __stdcall KeBuildPrimaryThreadContext(INT64 a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
  __int64 v6; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  int v12; 
  unsigned __int64 v13; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  _QWORD *v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 

  v6 = (int)a4;
  v8 = **(_QWORD **)(a1 + 496);
  v9 = *(_QWORD *)(a1 + 240);
  v10 = *(_QWORD *)(a1 + 544);
  v26 = *(_QWORD *)(v9 + 8);
  v11 = *(_QWORD *)(v9 + 16);
  if( a3 )
  {
    v12 = *(_DWORD *)(a3 + 48) & 0x10001B;
    *(_DWORD *)(a3 + 48) = v12;
    if( (v12 & 0x100001) == 1048577 )
    {
      v13 = *(_QWORD *)(v8 + 168);
      if( (*(_DWORD *)(v10 + 632) & 0x20) != 0 && (v13 < v11 || v13 > v26) )
        return -1073741571;
      *(_QWORD *)(a3 + 152) = v13;
      *(_QWORD *)(a3 + 248) = *(_QWORD *)(v8 + 264);
      *(_QWORD *)(a3 + 160) = *(_QWORD *)(v8 + 176);
      *(_WORD *)(a3 + 56) = 51;
      *(_WORD *)(a3 + 66) = 43;
    }
    if( (v12 & 0x100002) == 1048578 )
    {
      *(_QWORD *)(a3 + 216) = (int)a4;
      *(_QWORD *)(a3 + 224) = a5;
      *(_QWORD *)(a3 + 232) = a6;
    }
    if( (v12 & 0x100008) == 1048584 )
    {
      memset((VOID *)(a3 + 256), 0i64, 0x200u);
      *(_WORD *)(a3 + 256) = 639;
      *(_DWORD *)(a3 + 280) = 8064;
      *(_DWORD *)(a3 + 52) = 8064;
    }
    if( (v12 & 0x100010) == 1048592 )
    {
      *(_QWORD *)(a3 + 112) = *(_DWORD *)(v8 + 128) & 0xFFFF0355;
      *(_QWORD *)(a3 + 104) = 0i64;
      v15 = *(_QWORD *)(v8 + 88);
      if( v15 > 0x7FFFFFFEFFFFi64 )
        v15 = 0i64;
      *(_QWORD *)(a3 + 72) = v15;
      v16 = *(_QWORD *)(v8 + 96);
      if( v16 > 0x7FFFFFFEFFFFi64 )
        v16 = 0i64;
      *(_QWORD *)(a3 + 80) = v16;
      v17 = *(_QWORD *)(v8 + 104);
      if( v17 > 0x7FFFFFFEFFFFi64 )
        v17 = 0i64;
      *(_QWORD *)(a3 + 88) = v17;
      v18 = *(_QWORD *)(v8 + 112);
      if( v18 > 0x7FFFFFFEFFFFi64 )
        v18 = 0i64;
      *(_QWORD *)(a3 + 96) = v18;
    }
  }
  else
  {
    v19 = *(_QWORD *)(a2 + 80);
    v20 = *(_QWORD **)(a2 + 88);
    v21 = *(_QWORD *)(v8 + 168);
    if( (*(_DWORD *)(v10 + 632) & 0x20) != 0 && (v21 < v11 || v21 > v26) )
      return -1073741571;
    *(_QWORD *)(v19 + 360) = (__int64)(*(_QWORD *)(v8 + 264) << 16) >> 16;
    *(_QWORD *)(v19 + 384) = v21;
    *(_QWORD *)(v19 + 344) = *(_QWORD *)(v8 + 176);
    *(_WORD *)(v19 + 368) = 51;
    *(_WORD *)(v19 + 392) = 43;
    v20[35] = v6;
    v20[36] = a5;
    v20[37] = a6;
    *(_DWORD *)(v19 + 44) = 8064;
    if( (*(_DWORD *)(v8 + 128) & 0x355i64) != 0 || (*(_DWORD *)(v19 + 256) & 0x355i64) != 0 )
    {
      *(_QWORD *)(v19 + 256) = *(_DWORD *)(v8 + 88) & 0xFFFF0355;
      *(_QWORD *)(v19 + 248) = 0i64;
      v22 = *(_QWORD *)(v8 + 88);
      if( v22 > 0x7FFFFFFEFFFFi64 )
        v22 = 0i64;
      *(_QWORD *)(v19 + 216) = v22;
      v23 = *(_QWORD *)(v8 + 96);
      if( v23 > 0x7FFFFFFEFFFFi64 )
        v23 = 0i64;
      *(_QWORD *)(v19 + 224) = v23;
      v24 = *(_QWORD *)(v8 + 104);
      if( v24 > 0x7FFFFFFEFFFFi64 )
        v24 = 0i64;
      *(_QWORD *)(v19 + 232) = v24;
      v25 = *(_QWORD *)(v8 + 112);
      if( v25 > 0x7FFFFFFEFFFFi64 )
        v25 = 0i64;
      *(_QWORD *)(v19 + 240) = v25;
    }
  }
  return 0;
}

Referenced by:

KiSwapToUmsThread
PspDisassociateUmsThreadFromPrimary
PspGetSetContextInternal