KiInitializeKernel
VOID __stdcall KiInitializeKernel(
_EPROCESS *Process,
_ETHREAD *Thread,
VOID *IdleStack,
_KPRCB *Prcb,
INT8 Number,
_LOADER_PARAMETER_BLOCK *LoaderBlock){
unsigned int v7;
unsigned __int64 FeatureBits;
_KPRCB *v9;
unsigned int CoresPerPhysicalProcessor;
unsigned int *p_LogicalProcessorsPerCore;
unsigned int v12;
unsigned int v13;
int v14;
unsigned int InitialApicId;
int v16;
unsigned __int64 GroupSetMember;
__int64 v18;
int v19;
_KPRCB *v20;
char v21;
_KPRCB *v22;
unsigned int v23;
unsigned int v24;
int v25;
unsigned __int64 v26;
char XSaveFeatureFlags;
INT64 v28;
unsigned __int64 v29;
void *v30;
_EPROCESS *v31;
_ETHREAD *v32;
_LOADER_PARAMETER_BLOCK *v33;
unsigned __int64 v34;
void *v35;
unsigned __int64 v36;
unsigned __int64 v37;
UINT8 v38;
int v39;
unsigned __int64 v40;
unsigned __int64 v41;
unsigned __int64 v42;
unsigned __int64 v43;
unsigned __int64 v44;
unsigned __int64 v45;
char v46;
char v47;
PVOID BugCheckParameter1;
int v49;
int v50;
_KPRCB *v51;
unsigned int v52;
int v53;
int v54;
unsigned int v55;
unsigned __int64 v56;
_EPROCESS *Processa;
_LOADER_PARAMETER_BLOCK *v58;
_GROUP_AFFINITY GroupAffinity;
_KPRCB *v60;
VOID *KernelStack;
_ETHREAD *Threada;
_ETHREAD *v63;
_KPRCB *v64;
_LOADER_PARAMETER_BLOCK *v65;
_HV_X64_HYPERVISOR_FEATURES HvFeaturesOut;
int v67[128];
KernelStack = IdleStack;
Threada = Thread;
Processa = Process;
v63 = Thread;
v64 = Prcb;
v58 = LoaderBlock;
v65 = LoaderBlock;
GroupAffinity = 0i64;
HvFeaturesOut = 0i64;
v7 = Number;
if( !Number )
HvlPhase0Initialize(LoaderBlock);
FeatureBits = Prcb->FeatureBits;
BugCheckParameter1 = (PVOID)FeatureBits;
if( (unsigned __int8)(Prcb->CpuVendor - 1) <= 2u )
KiSetHardwareSpeculationControlFeatures((__int64)Prcb, FeatureBits);
KiCheckMicrocode((INT64)Prcb);
memset(v67, 0i64, sizeof(v67));
_fxsave(v67);
if( Number )
{
if( KiFpuLeakage )
BugCheckParameter1 = (PVOID)(FeatureBits | 0x20000000000i64);
KiSetPageAttributesTable();
*(_DWORD *)&Prcb->PackageProcessorSet.Count = 1310721;
Prcb->PackageProcessorSet.Reserved = 0;
memset(Prcb->PackageProcessorSet.Bitmap, 0i64, sizeof(Prcb->PackageProcessorSet.Bitmap));
KeAddProcessorAffinityEx(&Prcb->PackageProcessorSet.Count, (unsigned int)Number);
v9 = Prcb;
v51 = Prcb;
CoresPerPhysicalProcessor = Prcb->CoresPerPhysicalProcessor;
p_LogicalProcessorsPerCore = &Prcb->LogicalProcessorsPerCore;
if( CoresPerPhysicalProcessor == 1 && *p_LogicalProcessorsPerCore == 1 )
{
Prcb->CoreProcessorSet = Prcb->GroupSetMember;
Prcb->PackageId = Prcb->InitialApicId;
}
else
{
v12 = *p_LogicalProcessorsPerCore;
v13 = *p_LogicalProcessorsPerCore * CoresPerPhysicalProcessor;
v52 = v13;
v14 = ~(v13 - 1);
v53 = v14;
InitialApicId = Prcb->InitialApicId;
v16 = v14 & InitialApicId;
v54 = v14 & InitialApicId;
Prcb->PackageId = v14 & InitialApicId;
v55 = ~(v12 - 1);
v49 = v55 & InitialApicId;
GroupSetMember = Prcb->GroupSetMember;
v56 = GroupSetMember;
v46 = 0;
v18 = 0i64;
v50 = 0;
if( (_DWORD)KeNumberProcessors_0 )
{
v19 = v49;
do
{
v60 = v9;
v47 = v46;
v20 = *(&KiProcessorBlock + v18);
if( (v20->InitialApicId & v14) == v16 )
{
KeAddProcessorAffinityEx(&Prcb->PackageProcessorSet.Count, (unsigned int)v18);
KeAddProcessorAffinityEx(&v20->PackageProcessorSet.Count, (unsigned int)Number);
v21 = v46;
if( !v46 )
v21 = 1;
v46 = v21;
v22 = v20;
if( v47 )
v22 = v60;
v51 = v22;
v23 = KeCountSetBitsAffinityEx(&v20->PackageProcessorSet.Count);
v13 = v52;
if( v23 > v52 )
KeBugCheckEx(
0x3Eu,
v20,
(PVOID)v23,
(PVOID)v20->CoresPerPhysicalProcessor,
(PVOID)v20->LogicalProcessorsPerCore);
LODWORD(v18) = v50;
GroupSetMember = v56;
v19 = v49;
v14 = v53;
v16 = v54;
v9 = v51;
}
if( (v20->InitialApicId & v55) == v19 && v20->ParentNode == Prcb->ParentNode )
{
GroupSetMember |= v20->GroupSetMember;
v56 = GroupSetMember;
v20->CoreProcessorSet |= GroupSetMember;
}
v18 = (unsigned int)(v18 + 1);
v50 = v18;
}
while( (unsigned int)v18 < (unsigned int)KeNumberProcessors_0 );
}
v24 = KeCountSetBitsAffinityEx(&Prcb->PackageProcessorSet.Count);
if( v24 > v13 )
KeBugCheckEx(
0x3Eu,
Prcb,
(PVOID)v24,
(PVOID)Prcb->CoresPerPhysicalProcessor,
(PVOID)*p_LogicalProcessorsPerCore);
Prcb->CoreProcessorSet = v56;
}
v7 = Number;
v25 = 65471;
}
else
{
KiFpuLeakage = KiDetectFpuLeakage();
if( KiFpuLeakage )
FeatureBits |= 0x20000000000ui64;
if( KiFlushPcid )
{
v34 = __readcr3();
__writecr3(v34);
if( !KeGetCurrentThread()->ApcState.Process->Pcb.AddressPolicy )
KiSetUserTbFlushPending();
}
else
{
v42 = __readcr4();
if( (v42 & 0x20080) != 0 )
{
__writecr4(v42 ^ 0x80);
__writecr4(v42);
}
else
{
v43 = __readcr3();
__writecr3(v43);
}
}
KiSetPageAttributesTable();
if( KUSER_SHARED_DATA.ProcessorFeatures[12] )
v35 = (void *)(FeatureBits | 0x80000000);
else
v35 = (void *)(FeatureBits & 0xFFFFFFFF3FFFFFFFui64 | 0x40000000);
BugCheckParameter1 = v35;
v36 = __readcr4();
__writecr4(v36 | 0x18);
if( KiFlushPcid )
{
v37 = __readcr3();
__writecr3(v37);
if( !KeGetCurrentThread()->ApcState.Process->Pcb.AddressPolicy )
KiSetUserTbFlushPending();
}
else
{
v44 = __readcr4();
if( (v44 & 0x20080) != 0 )
{
__writecr4(v44 ^ 0x80);
__writecr4(v44);
}
else
{
v45 = __readcr3();
__writecr3(v45);
}
}
KiConfigureInitialNodes(Prcb);
KiConfigureProcessorBlock(Prcb, v38);
p_LogicalProcessorsPerCore = &Prcb->LogicalProcessorsPerCore;
Prcb->PackageId = -(Prcb->CoresPerPhysicalProcessor * Prcb->LogicalProcessorsPerCore) & Prcb->InitialApicId;
*(_DWORD *)&Prcb->PackageProcessorSet.Count = 1310721;
Prcb->PackageProcessorSet.Reserved = 0;
memset(Prcb->PackageProcessorSet.Bitmap, 0i64, sizeof(Prcb->PackageProcessorSet.Bitmap));
KeAddProcessorAffinityEx(&Prcb->PackageProcessorSet.Count, 0i64);
Prcb->CoreProcessorSet = Prcb->GroupSetMember;
v51 = Prcb;
v25 = 65471;
v39 = 65471;
if( v67[7] )
v39 = v67[7];
KiMxCsrMask = v39;
KeCompactServiceTable(KiServiceTable, KiArgumentTable, (unsigned int)KiServiceLimit, 0i64, 0x140000000ui64);
}
KiSetCacheInformation();
PoInitializePrcb(Prcb);
Prcb->ProcessorProfileControlArea = 0i64;
Prcb->ProfileEventIndexAddress = &Prcb->ProfileEventIndexAddress;
if( KUSER_SHARED_DATA.XState.EnabledFeatures )
{
v26 = (unsigned __int64)BugCheckParameter1 | 0x800000;
BugCheckParameter1 = (PVOID)((unsigned __int64)BugCheckParameter1 | 0x800000);
XSaveFeatureFlags = KeGetXSaveFeatureFlags();
if( (XSaveFeatureFlags & 8) != 0 )
{
v26 |= 0x8000ui64;
BugCheckParameter1 = (PVOID)v26;
}
if( (XSaveFeatureFlags & 0x10) != 0 )
BugCheckParameter1 = (PVOID)(v26 | 0x4000000000i64);
}
KiSetControlEnforcement((__int64)Prcb, &BugCheckParameter1);
v29 = (unsigned __int64)BugCheckParameter1;
if( v7 )
{
if( v67[7] )
v25 = v67[7];
v30 = (void *)((unsigned __int64)KeFeatureBits & 0xFFFFFFFF37FFFFFFui64 | 0x8000000);
if( ((unsigned int)BugCheckParameter1 & 0x8000000) == 0 )
v30 = (void *)((unsigned __int64)KeFeatureBits & 0xFFFFFFFF37FFFFFFui64);
if( Prcb->CpuVendor == 2 && Prcb->CpuType == 6 && Prcb->CpuModel == 23 && Prcb->CpuStepping == 10 )
{
v29 = (unsigned __int64)BugCheckParameter1 & 0xFFFFFFFFFFEFFFFFui64;
BugCheckParameter1 = (PVOID)((unsigned __int64)BugCheckParameter1 & 0xFFFFFFFFFFEFFFFFui64);
if( (v51->FeatureBits & 0x100000) != 0 )
{
v29 |= 0x100000ui64;
BugCheckParameter1 = (PVOID)v29;
}
}
if( (void *)v29 != v30
|| v25 != KiMxCsrMask
|| KiProcessorBlock->CFlushSize != Prcb->CFlushSize
|| KiProcessorBlock->CoresPerPhysicalProcessor != Prcb->CoresPerPhysicalProcessor
|| KiProcessorBlock->LogicalProcessorsPerCore != *p_LogicalProcessorsPerCore )
{
KeBugCheckEx(0x3Eu, (PVOID)v29, v30, 0i64, 0i64);
}
__writecr8(2ui64);
HvlEnlightenProcessor(0, v28, (INT64)v30, (INT64 *)2);
v31 = Processa;
}
else
{
KeProcessorArchitecture = 9;
KeProcessorLevel = Prcb->CpuType;
KeProcessorRevision = Prcb->CpuStep;
KeFeatureBits = BugCheckParameter1;
__writecr8(1ui64);
KiFreezeExecutionLock = 0i64;
KiInitSystem();
qword_140C319F8 = (__int64)&KiProcessListHead;
KiProcessListHead = (__int64)&KiProcessListHead;
GroupAffinity.Reserved[1] = 0;
GroupAffinity.Reserved[2] = 0;
*(_DWORD *)&GroupAffinity.Group = (unsigned __int16)((unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6);
GroupAffinity.Mask = 1i64 << (KiProcessorIndexToNumberMappingTable[0] & 0x3F);
v31 = Processa;
KeInitializeProcess(Processa, 0i64, &GroupAffinity, 0i64);
v31->Pcb.QuantumReset = 127;
v40 = __rdtsc();
KiWaitNever = __ROR8__(v40 ^ __ROL8__(v40, 43), v40 & 0xF);
v41 = __rdtsc();
KiWaitAlways = __ROL8__(__ROR8__(v41, 47) ^ v41, v41 & 0xF);
HviGetHypervisorFeatures(&HvFeaturesOut);
if( (HvFeaturesOut._bf_8 & 0x100000000000i64) != 0 )
KiNPIEPEnabled = 1;
}
if( KiNPIEPEnabled )
__writemsr(0x40000040u, 0xFui64);
KiEnableXSave();
KUSER_SHARED_DATA.TestRetInstruction = 195i64;
KUSER_SHARED_DATA.ProcessorFeatures[2] = 1;
KUSER_SHARED_DATA.ProcessorFeatures[3] = 1;
KUSER_SHARED_DATA.ProcessorFeatures[6] = 1;
KUSER_SHARED_DATA.ProcessorFeatures[8] = 1;
KUSER_SHARED_DATA.ProcessorFeatures[9] = 1;
KUSER_SHARED_DATA.ProcessorFeatures[10] = 1;
KUSER_SHARED_DATA.ProcessorFeatures[14] = 1;
if( (v29 & 0x80000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[13] = 1;
if( (v29 & 0x4000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[7] = 1;
if( (v29 & 0x800000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[17] = 1;
if( (v29 & 0x10000000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[22] = 1;
if( (v29 & 0x4000000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[20] = 1;
if( (v29 & 0x8000000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[21] = 1;
if( (v29 & 0x100000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[28] = 1;
if( (v29 & 0x400000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[32] = 1;
if( (v29 & 0x800000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[36] = 1;
if( (v29 & 0x1000000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[37] = 1;
if( (v29 & 0x2000000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[38] = 1;
if( (KUSER_SHARED_DATA.XState.EnabledFeatures & 4) != 0 && (v29 & 0x4000000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[39] = 1;
if( (KUSER_SHARED_DATA.XState.EnabledFeatures & 4) != 0 && (v29 & 0x8000000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[40] = 1;
if( (v29 & 0x10000000000000i64) != 0 && (KUSER_SHARED_DATA.XState.EnabledFeatures & 0xE0) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[41] = 1;
KUSER_SHARED_DATA.VirtualizationFlags = byte_140C50A87;
v32 = Threada;
KiInitializeIdleThread(&Threada->Tcb, KernelStack, &v31->Pcb, Prcb);
if( v7 )
{
if( !HalpInitSystemPhase1(0i64) )
KeBugCheck(0x5Cu);
v33 = v58;
}
else
{
v33 = v58;
InitBootProcessor(v58);
}
KiCompleteKernelInit(Prcb, &v32->Tcb, v7);
v33->Prcb = 0i64;
}Referenced by:
KiSystemStartup