KiInitializeBootStructures

VOID __fastcall KiInitializeBootStructures(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  KPCR *Pcr; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v4; 
  __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  bool v9; 
  __int64 v10; 
  unsigned int ProcessorSignature; 
  unsigned int v12; 
  unsigned int v13; 
  INT64 v14; 
  INT8 v15; 
  __int64 v16; 
  int v17; 
  CHAR *v18; 
  CHAR *v19; 
  CHAR v20; 
  NTSTATUS v21; 
  int v22; 
  void *v23; 
  void *v24; 
  int v25; 
  INT64 a3; 
  INT64 a2; 
  int a4; 
  Pcr = KeGetPcr();
  CurrentPrcb = KeGetCurrentPrcb();
  LODWORD(a2) = 0;
  LODWORD(a3) = 0;
  a4 = 0;
  *((_DWORD *)Pcr + 24) = 65537;
  *((_DWORD *)CurrentPrcb + 34) = 65537;
  *((_BYTE *)CurrentPrcb + 140) = 0;
  v4 = *((unsigned int *)Pcr + 105);
  if( !(_DWORD)v4 )
  {
    InitializeBuildStrings(*((_QWORD *)LoaderBlock + 30));
    v5 = *((_QWORD *)LoaderBlock + 30);
    KiFeatureSettings = *(_DWORD *)(v5 + 3460);
    KiFeatureSimulations = (*(_DWORD *)(v5 + 132) >> 21) & 0x3F;
    *((_QWORD *)LoaderBlock + 18) = KiInitialProcess;
    *((_QWORD *)LoaderBlock + 19) = KiInitialThread;
    LODWORD(KeKernelStackSize) = *((_DWORD *)LoaderBlock + 40);
    v6 = *((_QWORD *)LoaderBlock + 16) + 28672i64;
    *((_QWORD *)CurrentPrcb + 4283) = v6;
    v6 += 28592i64;
    *(_QWORD *)(v6 + 40) = &KiExceptionDispatchOnExceptionStackContinue;
    *((_QWORD *)CurrentPrcb + 4069) = v6;
  }
  *((_QWORD *)CurrentPrcb + 4233) = (char *)CurrentPrcb + 34944;
  v7 = *((_QWORD *)LoaderBlock + 19);
  *((_QWORD *)CurrentPrcb + 2) = 0i64;
  *((_QWORD *)CurrentPrcb + 1) = v7;
  *((_QWORD *)CurrentPrcb + 3) = v7;
  if( !(_DWORD)v4 || PoEnergyEstimationEnabled() )
    _interlockedbittestandset((volatile signed __int32 *)v7, 0x15u);
  *(_QWORD *)(v7 + 184) = *((_QWORD *)LoaderBlock + 18);
  *(_QWORD *)(v7 + 160) = v7 + 152;
  *(_QWORD *)(v7 + 152) = v7 + 152;
  if( !(_DWORD)v4 )
    CmInitBootFeatureConfigurations((INT64)LoaderBlock);
  *(&KiProcessorBlock + v4) = CurrentPrcb;
  v8 = *((_QWORD *)LoaderBlock + 16) - 80i64;
  *(_QWORD *)(v8 + 40) = KiDispatchInterruptContinue;
  v9 = *((_QWORD *)CurrentPrcb + 4280) == 0i64;
  *((_QWORD *)CurrentPrcb + 1570) = v8;
  if( v9 )
  {
    *((_DWORD *)CurrentPrcb + 8562) = 1048587;
    *((_QWORD *)CurrentPrcb + 4280) = (char *)CurrentPrcb + 496;
  }
  v10 = *((_QWORD *)Pcr + 7);
  ProcessorSignature = KiGetProcessorSignature((_BYTE *)CurrentPrcb + 141, &a2, &a3, &a4);
  v12 = a2;
  v13 = ProcessorSignature;
  LOWORD(ProcessorSignature) = a4 | ((_WORD)a3 << 8);
  v9 = *((_BYTE *)CurrentPrcb + 141) == 2;
  *((_BYTE *)CurrentPrcb + 65) = 1;
  *((_BYTE *)CurrentPrcb + 64) = v12;
  *((_WORD *)CurrentPrcb + 33) = ProcessorSignature;
  if( v9 && (v12 >= 0xF || v12 == 6 && (unsigned int)a3 > 0xD) )
    __writemsr(0x1A0u, __readmsr(0x1A0u) & 0xFFFFFFFFFFBFFFFFui64);
  if( !(_DWORD)v4 )
  {
    KiSetProcessorSignature((INT64)CurrentPrcb, v13);
    *(_QWORD *)(v10 + 4208) = Pcr;
    HvlEnableVsmCalls((INT64)LoaderBlock);
    ExRngInitializeSystem();
    KiDetermineRetpolineEnablement((INT64)LoaderBlock, v14, v15);
    MmInitSystem(0xFFFFFFFFui64, LoaderBlock);
    v16 = *((_QWORD *)LoaderBlock + 30);
    v17 = *(_DWORD *)(v16 + 132);
    if( (v17 & 8) != 0 )
    {
      KiBootDebuggerActive = 1;
      v17 = *(_DWORD *)(v16 + 132);
    }
    if( (v17 & 0x100) != 0 )
      KiSystemCallSelector = 1;
    KiInitializeIdt(v10, 0i64);
    HalInitializeBios(0xFFFFFFFFi64, (INT64)LoaderBlock);
    InbvDriverInitialize(0xFFFFFFFFi64, LoaderBlock, 0i64);
    v18 = (CHAR *)*((_QWORD *)LoaderBlock + 27);
    if( v18 )
    {
      v19 = strstr(v18, "GROUPSIZE");
      if( v19 )
      {
        while( 1 )
        {
          v20 = *v19;
          if( !*v19 || v20 == 32 || (unsigned __int8)(v20 - 48) <= 9u )
            break;
          ++v19;
        }
        v21 = atoi(v19);
        KiMaximumGroupSize = v21;
        if( (unsigned int)(v21 - 1) > 0x3F || ((v21 - 1) & v21) != 0 )
          KiMaximumGroupSize = 64;
      }
    }
  }
  *(_WORD *)(*((_QWORD *)Pcr + 1) + 102i64) = 104;
  KiInitializeNXSupport();
  HalInitializeProcessor((unsigned int)v4, LoaderBlock);
  KiSetFeatureBits((INT64)CurrentPrcb);
  v22 = *((_DWORD *)CurrentPrcb + 9);
  v23 = KiSystemCall32;
  v24 = KiSystemCall64;
  if( !v22 )
  {
    KiEnableKvaShadowing((INT64)CurrentPrcb);
    v22 = *((_DWORD *)CurrentPrcb + 9);
  }
  if( (_BYTE)KiKvaShadow )
  {
    v23 = KiSystemCall32Shadow;
    v24 = KiSystemCall64Shadow;
  }
  if( !v22 )
    KiTsxSupportedAtBoot = KiDetectTsx();
  if( *((_QWORD *)CurrentPrcb + 1440) )
    __writemsr(0x122u, *((_QWORD *)CurrentPrcb + 1440));
  if( !*((_DWORD *)CurrentPrcb + 9) )
  {
    v25 = KiDebugTrapIndex;
    qword_140C01650 = (__int64)KiDebugTraps;
    qword_140C01658 = 64i64;
    KiDebugTraps[KiDebugTrapIndex] = (__int64)v24;
    KiDebugTraps[++v25] = (__int64)v23;
    KiDebugTrapIndex = v25 + 1;
  }
  __writemsr(0xC0000081, 0x23001000000000ui64);
  __writemsr(0xC0000083, (unsigned __int64)v23);
  __writemsr(0xC0000082, (unsigned __int64)v24);
  __writemsr(0xC0000084, 0x4700ui64);
  KiInitPrcb((__int64)CurrentPrcb, v4);
  ExInitPoolLookasidePointers();
  if( !(_DWORD)v4 )
  {
    LODWORD(KeNumberProcessors_0) = 1;
    KeNumberProcessorsGroup0[0] = 1;
    KeInitializeAffinityEx(&KeActiveProcessors);
    KeAddProcessorAffinityEx(&KeActiveProcessors, 0);
  }
  KiSaveInitialProcessorControlState((INT64)CurrentPrcb + 256);
}

Referenced by:

KiSystemStartup