KiInitializeBootStructures

VOID __fastcall KiInitializeBootStructures(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  KPCR *Pcr; 
  struct _KPRCB *CurrentPrcb; 
  __int64 Number; 
  _LOADER_PARAMETER_EXTENSION *Extension; 
  unsigned __int64 v6; 
  unsigned __int64 Thread; 
  unsigned __int64 v8; 
  bool v9; 
  _KIDTENTRY64 *IdtBase; 
  unsigned int ProcessorSignature; 
  unsigned int v12; 
  unsigned int v13; 
  __int64 v14; 
  CHAR v15; 
  _LOADER_PARAMETER_EXTENSION *v16; 
  __int32 bf_84; 
  CHAR v18; 
  char *LoadOptions; 
  char *v20; 
  char v21; 
  NTSTATUS v22; 
  unsigned int v23; 
  void *v24; 
  void *v25; 
  int v26; 
  unsigned int v27; 
  unsigned int v28; 
  int v29; 

  Pcr = KeGetPcr();
  CurrentPrcb = KeGetCurrentPrcb();
  v28 = 0;
  v27 = 0;
  v29 = 0;
  *(_DWORD *)&Pcr->MajorVersion = 65537;
  *(_DWORD *)&CurrentPrcb->MinorVersion = 65537;
  CurrentPrcb->BuildType = 0;
  Number = Pcr->Prcb.Number;
  if( !(_DWORD)Number )
  {
    InitializeBuildStrings((INT64)LoaderBlock->Extension);
    Extension = LoaderBlock->Extension;
    KiFeatureSettings = Extension->ResetReason.AdditionalInfo[7];
    KiFeatureSimulations = ((unsigned __int32)Extension->_bf_84 >> 21) & 0x3F;
    LoaderBlock->Process = (unsigned __int64)&KiInitialProcess;
    LoaderBlock->Thread = (unsigned __int64)&KiInitialThread;
    LODWORD(KeKernelStackSize) = LoaderBlock->KernelStackSize;
    v6 = LoaderBlock->KernelStack + 28672;
    CurrentPrcb->IsrStack = (void *)v6;
    v6 += 28592i64;
    *(_QWORD *)(v6 + 40) = &KiExceptionDispatchOnExceptionStackContinue;
    CurrentPrcb->ExceptionStack = (void *)v6;
  }
  CurrentPrcb->SharedReadyQueue = &CurrentPrcb->LocalSharedReadyQueue;
  Thread = LoaderBlock->Thread;
  CurrentPrcb->NextThread = 0i64;
  CurrentPrcb->CurrentThread = (_ETHREAD *)Thread;
  CurrentPrcb->IdleThread = (_ETHREAD *)Thread;
  if( !(_DWORD)Number || PoEnergyEstimationEnabled() )
    _interlockedbittestandset((volatile signed __int32 *)Thread, 0x15u);
  *(_QWORD *)(Thread + 184) = LoaderBlock->Process;
  *(_QWORD *)(Thread + 160) = Thread + 152;
  *(_QWORD *)(Thread + 152) = Thread + 152;
  if( !(_DWORD)Number )
    CmInitBootFeatureConfigurations((__int64)LoaderBlock);
  *(&KiProcessorBlock + Number) = CurrentPrcb;
  v8 = LoaderBlock->KernelStack - 80;
  *(_QWORD *)(v8 + 40) = KiDispatchInterruptContinue;
  v9 = CurrentPrcb->Context == 0i64;
  CurrentPrcb->DpcStack = (void *)v8;
  if( v9 )
  {
    CurrentPrcb->ContextFlagsInit = 1048587;
    CurrentPrcb->Context = &CurrentPrcb->ProcessorState.ContextFrame;
  }
  IdtBase = Pcr->IdtBase;
  ProcessorSignature = KiGetProcessorSignature(&CurrentPrcb->CpuVendor, (int *)&v28, (int *)&v27, &v29);
  v12 = v28;
  v13 = ProcessorSignature;
  LOWORD(ProcessorSignature) = v29 | ((_WORD)v27 << 8);
  v9 = CurrentPrcb->CpuVendor == 2;
  CurrentPrcb->CpuID = 1;
  CurrentPrcb->CpuType = v12;
  CurrentPrcb->CpuStep = ProcessorSignature;
  if( v9 && (v12 >= 0xF || v12 == 6 && v27 > 0xD) )
    __writemsr(0x1A0u, __readmsr(0x1A0u) & 0xFFFFFFFFFFBFFFFFui64);
  if( !(_DWORD)Number )
  {
    KiSetProcessorSignature((INT64)CurrentPrcb, v13);
    IdtBase[263].Alignment = (unsigned __int64)Pcr;
    HvlEnableVsmCalls((INT64)LoaderBlock);
    ExRngInitializeSystem();
    KiDetermineRetpolineEnablement((__int64)LoaderBlock, v14, v15);
    MmInitSystem(0xFFFFFFFFui64, LoaderBlock);
    v16 = LoaderBlock->Extension;
    bf_84 = v16->_bf_84;
    if( (bf_84 & 8) != 0 )
    {
      KiBootDebuggerActive = 1;
      bf_84 = v16->_bf_84;
    }
    if( (bf_84 & 0x100) != 0 )
      KiSystemCallSelector = 1;
    KiInitializeIdt((UINT32)IdtBase, 0i64);
    HalInitializeBios(0xFFFFFFFFi64, (INT64)LoaderBlock);
    InbvDriverInitialize(0xFFFFFFFFui64, LoaderBlock, 0i64);
    LoadOptions = LoaderBlock->LoadOptions;
    if( LoadOptions )
    {
      strstr((UINT8 *)LoadOptions, (UINT8 *)"GROUPSIZE", v18);
      if( v20 )
      {
        while( 1 )
        {
          v21 = *v20;
          if( !*v20 || v21 == 32 || (unsigned __int8)(v21 - 48) <= 9u )
            break;
          ++v20;
        }
        v22 = atoi(v20);
        KiMaximumGroupSize = v22;
        if( (unsigned int)(v22 - 1) > 0x3F || ((v22 - 1) & v22) != 0 )
          KiMaximumGroupSize = 64;
      }
    }
  }
  *((_WORD *)Pcr->NtTib.StackBase + 51) = 104;
  KiInitializeNXSupport();
  HalInitializeProcessor((unsigned int)Number, LoaderBlock);
  KiSetFeatureBits(CurrentPrcb);
  v23 = CurrentPrcb->Number;
  v24 = KiSystemCall32;
  v25 = KiSystemCall64;
  if( !v23 )
  {
    KiEnableKvaShadowing((INT64)CurrentPrcb);
    v23 = CurrentPrcb->Number;
  }
  if( KiKvaShadow )
  {
    v24 = KiSystemCall32Shadow;
    v25 = KiSystemCall64Shadow;
  }
  if( !v23 )
    KiTsxSupportedAtBoot = KiDetectTsx();
  if( CurrentPrcb->MsrIa32TsxCtrl )
    __writemsr(0x122u, CurrentPrcb->MsrIa32TsxCtrl);
  if( !CurrentPrcb->Number )
  {
    v26 = KiDebugTrapIndex;
    *(&stru_140C00F40 + 226) = KiDebugTraps;
    *(&stru_140C00F40 + 227) = 64i64;
    KiDebugTraps[KiDebugTrapIndex] = v25;
    KiDebugTraps[++v26] = v24;
    KiDebugTrapIndex = v26 + 1;
  }
  __writemsr(0xC0000081, 0x23001000000000ui64);
  __writemsr(0xC0000083, (unsigned __int64)v24);
  __writemsr(0xC0000082, (unsigned __int64)v25);
  __writemsr(0xC0000084, 0x4700ui64);
  KiInitPrcb(CurrentPrcb, (unsigned int)Number);
  ExInitPoolLookasidePointers();
  if( !(_DWORD)Number )
  {
    LODWORD(KeNumberProcessors_0) = 1;
    KeNumberProcessorsGroup0[0] = 1;
    KeInitializeAffinityEx(&KeActiveProcessors);
    KeAddProcessorAffinityEx(&KeActiveProcessors.Count, 0i64);
  }
  KiSaveInitialProcessorControlState((INT64)&CurrentPrcb->ProcessorState);
}

Referenced by:

KiSystemStartup