KiInitializeContextThread

unsigned __int64 __fastcall KiInitializeContextThread(INT64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5){
  __int64 v5; 
  unsigned __int64 v7; 
  _QWORD *v8; 
  char *v9; 
  __int64 v10; 
  _OWORD *v11; 
  _CONTEXT *p_ContextRecord; 
  __int128 v13; 
  __int128 v14; 
  __int128 v15; 
  __int128 v16; 
  __int128 v17; 
  __int128 v18; 
  __int128 v19; 
  unsigned __int64 v20; 
  __int128 v21; 
  __int64 *v22; 
  unsigned __int64 v23; 
  __int128 v24; 
  __int128 v25; 
  __int128 v26; 
  CHAR v27; 
  char v28; 
  unsigned __int64 result; 
  unsigned __int64 v30; 
  char *ExtendedFeature2; 
  _KPROCESSOR_MODE PreviousMode; 
  _CONTEXT ContextRecord; 

  v5 = *(_QWORD *)(a1 + 40);
  v7 = (v5 - (unsigned int)KiXSaveAreaLength) & 0xFFFFFFFFFFFFFFC0ui64;
  v8 = (_QWORD *)(v7 - 48);
  memset((VOID *)(v7 - 48), 0i64, v5 - (v7 - 48));
  *v8 = v5;
  v9 = 0i64;
  v8[1] = v5 - (unsigned int)KeKernelStackSize;
  *(_DWORD *)(v7 + 24) = 8064;
  if( a5 )
  {
    v10 = 9i64;
    v11 = (_OWORD *)a5;
    p_ContextRecord = &ContextRecord;
    do
    {
      v13 = v11[1];
      *(_OWORD *)&p_ContextRecord->P1Home = *v11;
      v14 = v11[2];
      *(_OWORD *)&p_ContextRecord->P3Home = v13;
      v15 = v11[3];
      *(_OWORD *)&p_ContextRecord->P5Home = v14;
      v16 = v11[4];
      *(_OWORD *)&p_ContextRecord->ContextFlags = v15;
      v17 = v11[5];
      *(_OWORD *)&p_ContextRecord->SegGs = v16;
      v18 = v11[6];
      *(_OWORD *)&p_ContextRecord->Dr1 = v17;
      v19 = v11[7];
      v11 += 8;
      *(_OWORD *)&p_ContextRecord->Dr3 = v18;
      p_ContextRecord = (_CONTEXT *)((char *)p_ContextRecord + 128);
      *(_OWORD *)&p_ContextRecord[-1].LastExceptionToRip = v19;
      --v10;
    }
    while( v10 );
    v20 = v7 - 448;
    v21 = v11[1];
    v22 = (__int64 *)(v7 - 768);
    *(_OWORD *)&p_ContextRecord->P1Home = *v11;
    v23 = v7 - 832;
    v24 = v11[2];
    *(_OWORD *)&p_ContextRecord->P3Home = v21;
    v25 = v11[3];
    *(_OWORD *)&p_ContextRecord->P5Home = v24;
    v26 = v11[4];
    *(_OWORD *)&p_ContextRecord->ContextFlags = v25;
    *(_OWORD *)&p_ContextRecord->SegGs = v26;
    ContextRecord.ContextFlags = ContextRecord.ContextFlags & 6 | 0x100001;
    ContextRecord.SegCs = 51;
    ContextRecord.SegSs = 43;
    memset((VOID *)(v7 - 768), 0i64, 0x140u);
    memset((VOID *)(v7 - 448), 0i64, 0x190u);
    *(_BYTE *)(v20 + 43) = 1;
    LOBYTE(PreviousMode) = 1;
    KxContextToKframes(
      (PKTRAP_FRAME)(v7 - 448),
      (PKEXCEPTION_FRAME)(v7 - 768),
      &ContextRecord,
      ContextRecord.ContextFlags,
      PreviousMode);
    *v22 = a4;
    v22[1] = a3;
    v22[2] = a2;
    v22[39] = (__int64)KiStartUserThreadReturn;
    *(_QWORD *)(v7 - 832 + 56) = KiStartUserThread;
    *(_WORD *)v7 = 639;
    *(_DWORD *)(v20 + 44) = 8064;
    if( ((unsigned __int64)KeFeatureBits & 0x800000) != 0 )
      *(_QWORD *)(v7 + 512) = 1i64;
    v27 = 0;
  }
  else
  {
    v23 = v7 - 160;
    *(_QWORD *)(v7 - 96) = a4;
    v20 = 0i64;
    v27 = 1;
    *(_QWORD *)(v7 - 88) = a3;
    *(_QWORD *)(v7 - 80) = a2;
    *(_QWORD *)(v7 - 160 + 56) = KxStartSystemThread;
    *(_QWORD *)(v7 - 56) = 0i64;
  }
  KiSetSwitchingNpxState(a1, v27);
  *(_BYTE *)(a1 + 562) = v28;
  result = v20 + 128;
  *(_BYTE *)(v23 + 40) = 1;
  *(_QWORD *)(v23 + 48) = v20 + 128;
  if( KUSER_SHARED_DATA.XState.EnabledFeatures )
  {
    result = KUSER_SHARED_DATA.XState.ControlFlags;
    if( (KUSER_SHARED_DATA.XState._bf_0 & 2) != 0 )
    {
      v30 = 0x8000000000000003ui64;
      *(_QWORD *)(v7 + 520) = 0x8000000000000003ui64;
      if( (*(_DWORD *)(a1 + 116) & 0x100000) != 0 )
      {
        if( (*(_DWORD *)(a5 + 48) & 0x100040) == 1048640 )
        {
          ExtendedFeature2 = RtlLocateExtendedFeature2((_DWORD *)(a5 + 1232), 0xBu, 0xFFFFF780000003D8ui64, 0i64);
          v30 = *(_QWORD *)(v7 + 520);
          v9 = ExtendedFeature2;
        }
        *(_QWORD *)(v7 + 512) |= 0x800ui64;
        *(_QWORD *)(v7 + 520) = v30 | 0x800;
        result = (unsigned __int64)RtlLocateSupervisorFeature((PXSAVE_AREA_HEADER)(v7 + 512), 0xBu);
        *(_OWORD *)result = *(_OWORD *)v9;
      }
    }
  }
  *(_QWORD *)(a1 + 40) = v8;
  *(_QWORD *)(a1 + 88) = v23;
  *(_QWORD *)(a1 + 96) = v7;
  return result;
}

Referenced by:

No references.