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