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