KiInitializeKernel
VOID __fastcall KiInitializeKernel(
_EPROCESS *Process,
_ETHREAD *Thread,
VOID *IdleStack,
_KPRCB *Prcb,
UINT64 Number,
_LOADER_PARAMETER_BLOCK *LoaderBlock){
int v7;
ULONG_PTR v8;
_KPRCB *v9;
unsigned int *v10;
int v11;
unsigned int v12;
int v13;
unsigned int v14;
int v15;
INT64 v16;
__int64 v17;
int v18;
ULONG_PTR v19;
char v20;
_KPRCB *v21;
unsigned int v22;
unsigned int v23;
int v24;
ULONG_PTR v25;
char XSaveFeatureFlags;
INT64 v27;
ULONG_PTR v28;
ULONG_PTR v29;
_EPROCESS *v30;
_ETHREAD *v31;
INT64 v32;
int v33;
unsigned __int64 v34;
ULONG_PTR 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;
ULONG_PTR BugCheckParameter4;
UINT64 Flags;
INT64 v48;
char v49;
char v50;
ULONG_PTR BugCheckParameter1;
INT64 v52;
_KPRCB *v53;
INT64 v54;
INT64 v55;
INT64 v56;
_KPROCESS *Processa;
INT64 a15;
INT64 a16[2];
_KPRCB *v60;
VOID *KernelStack;
_KTHREAD *Threada;
INT64 a21;
INT64 a22;
INT64 a23;
INT64 a24[2];
INT64 v67;
INT64 result[3];
CHAR v69;
int v70;
INT64 v71;
INT64 v72;
INT64 v73;
INT64 v74;
INT64 v75;
INT64 v76;
INT64 v77;
INT64 v78;
INT64 v79;
INT16 v80;
KernelStack = IdleStack;
Threada = Thread;
Processa = Process;
a21 = (INT64)Thread;
a22 = (INT64)Prcb;
a15 = (INT64)LoaderBlock;
a23 = (INT64)LoaderBlock;
*(_OWORD *)a16 = 0i64;
*(_OWORD *)a24 = 0i64;
v7 = Number;
if( !(_DWORD)Number )
HvlPhase0Initialize(
(INT64)LoaderBlock,
(INT64)Thread,
(INT64)IdleStack,
(INT64)Prcb,
BugCheckParameter4,
Flags,
v48,
BugCheckParameter1,
v52,
(INT64)v53,
v54,
v55,
v56,
(INT64)Processa,
a15,
a16[0],
a16[1],
(INT64)v60,
(INT64)KernelStack,
(INT64)Threada,
a21,
a22,
a23,
a24[0],
(__m128i *)a24[1],
v67,
result[0],
result[1],
result[2],
v69,
v71,
v72,
v73,
v74,
v75,
v76,
v77,
v78,
v79,
v80);
v8 = *((_QWORD *)Prcb + 4276);
BugCheckParameter1 = v8;
if( (unsigned __int8)(*((_BYTE *)Prcb + 141) - 1) <= 2u )
KiSetHardwareSpeculationControlFeatures((INT64)Prcb, v8);
KiCheckMicrocode((INT64)Prcb);
memset((INT64)result, 0i64);
_fxsave(result);
if( (_DWORD)Number )
{
if( KiFpuLeakage )
BugCheckParameter1 = v8 | 0x20000000000i64;
KiSetPageAttributesTable();
*((_DWORD *)Prcb + 8420) = 1310721;
*((_DWORD *)Prcb + 8421) = 0;
memset((INT64)Prcb + 33688, 0i64);
KeAddProcessorAffinityEx((_WORD *)Prcb + 16840, Number);
v9 = Prcb;
v53 = Prcb;
v10 = (unsigned int *)((char *)Prcb + 156);
if( *((_QWORD *)Prcb + 19) == 0x100000001i64 )
{
*((_QWORD *)Prcb + 4235) = *((_QWORD *)Prcb + 25);
*((_DWORD *)Prcb + 8462) = *((_DWORD *)Prcb + 53);
}
else
{
v11 = *v10;
v12 = *v10 * *((_DWORD *)Prcb + 38);
LODWORD(v54) = v12;
v13 = ~(v12 - 1);
HIDWORD(v54) = v13;
v14 = *((_DWORD *)Prcb + 53);
v15 = v13 & v14;
LODWORD(v55) = v13 & v14;
*((_DWORD *)Prcb + 8462) = v13 & v14;
HIDWORD(v55) = ~(v11 - 1);
v52 = HIDWORD(v55) & v14;
v16 = *((_QWORD *)Prcb + 25);
v56 = v16;
v49 = 0;
v17 = 0i64;
if( (_DWORD)KeNumberProcessors_0 )
{
v18 = v52;
do
{
v60 = v9;
v50 = v49;
v19 = (ULONG_PTR)*(&KiProcessorBlock + v17);
if( (*(_DWORD *)(v19 + 212) & v13) == v15 )
{
KeAddProcessorAffinityEx((_WORD *)Prcb + 16840, v17);
KeAddProcessorAffinityEx((_WORD *)(v19 + 33680), Number);
v20 = v49;
if( !v49 )
v20 = 1;
v49 = v20;
v21 = (_KPRCB *)v19;
if( v50 )
v21 = v60;
v53 = v21;
v22 = KeCountSetBitsAffinityEx((_KAFFINITY_EX *)(v19 + 33680));
v12 = v54;
if( v22 > (unsigned int)v54 )
KeBugCheckEx(0x3Eu, v19, v22, *(unsigned int *)(v19 + 152), *(unsigned int *)(v19 + 156));
LODWORD(v17) = HIDWORD(v52);
v16 = v56;
v18 = v52;
v13 = HIDWORD(v54);
v15 = v55;
v9 = v53;
}
if( (*(_DWORD *)(v19 + 212) & HIDWORD(v55)) == v18 && *(_QWORD *)(v19 + 192) == *((_QWORD *)Prcb + 24) )
{
v16 |= *(_QWORD *)(v19 + 200);
v56 = v16;
*(_QWORD *)(v19 + 33880) |= v16;
}
v17 = (unsigned int)(v17 + 1);
HIDWORD(v52) = v17;
}
while( (unsigned int)v17 < (unsigned int)KeNumberProcessors_0 );
}
v23 = KeCountSetBitsAffinityEx((_KAFFINITY_EX *)((char *)Prcb + 33680));
if( v23 > v12 )
KeBugCheckEx(0x3Eu, (ULONG_PTR)Prcb, v23, *((unsigned int *)Prcb + 38), *v10);
*((_QWORD *)Prcb + 4235) = v56;
}
v7 = Number;
v24 = 65471;
}
else
{
KiDetectFpuLeakage();
KiFpuLeakage = v33;
if( v33 )
v8 |= 0x20000000000ui64;
if( KiFlushPcid )
{
v34 = __readcr3();
__writecr3(v34);
if( !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
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 = v8 | 0x80000000;
else
v35 = v8 & 0xFFFFFFFF3FFFFFFFui64 | 0x40000000;
BugCheckParameter1 = v35;
v36 = __readcr4();
__writecr4(v36 | 0x18);
if( KiFlushPcid )
{
v37 = __readcr3();
__writecr3(v37);
if( !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
KiSetUserTbFlushPending();
}
else
{
v44 = __readcr4();
if( (v44 & 0x20080) != 0 )
{
__writecr4(v44 ^ 0x80);
__writecr4(v44);
}
else
{
v45 = __readcr3();
__writecr3(v45);
}
}
KiConfigureInitialNodes((__int64)Prcb);
KiConfigureProcessorBlock(Prcb, v38);
v10 = (unsigned int *)((char *)Prcb + 156);
*((_DWORD *)Prcb + 8462) = -(*((_DWORD *)Prcb + 38) * *((_DWORD *)Prcb + 39)) & *((_DWORD *)Prcb + 53);
*((_DWORD *)Prcb + 8420) = 1310721;
*((_DWORD *)Prcb + 8421) = 0;
memset((INT64)Prcb + 33688, 0i64);
KeAddProcessorAffinityEx((_WORD *)Prcb + 16840, 0);
*((_QWORD *)Prcb + 4235) = *((_QWORD *)Prcb + 25);
v53 = Prcb;
v24 = 65471;
v39 = 65471;
if( v70 )
v39 = v70;
KiMxCsrMask = v39;
KeCompactServiceTable(KiServiceTable, KiArgumentTable, (unsigned int)KiServiceLimit, 0i64, 0x140000000ui64);
}
KiSetCacheInformation();
PoInitializePrcb(Prcb);
*((_QWORD *)Prcb + 4243) = 0i64;
*((_QWORD *)Prcb + 4244) = (char *)Prcb + 33952;
if( KUSER_SHARED_DATA.XState.EnabledFeatures )
{
v25 = BugCheckParameter1 | 0x800000;
BugCheckParameter1 |= 0x800000ui64;
XSaveFeatureFlags = KeGetXSaveFeatureFlags();
if( (XSaveFeatureFlags & 8) != 0 )
{
v25 |= 0x8000ui64;
BugCheckParameter1 = v25;
}
if( (XSaveFeatureFlags & 0x10) != 0 )
BugCheckParameter1 = v25 | 0x4000000000i64;
}
KiSetControlEnforcement((INT64)Prcb, &BugCheckParameter1);
v28 = BugCheckParameter1;
if( v7 )
{
if( v70 )
v24 = v70;
v29 = KeFeatureBits & 0xFFFFFFFF37FFFFFFui64 | 0x8000000;
if( (BugCheckParameter1 & 0x8000000) == 0 )
v29 = KeFeatureBits & 0xFFFFFFFF37FFFFFFui64;
if( *((_BYTE *)Prcb + 141) == 2
&& *((_BYTE *)Prcb + 64) == 6
&& *((_BYTE *)Prcb + 67) == 23
&& *((_BYTE *)Prcb + 66) == 10 )
{
v28 = BugCheckParameter1 & 0xFFFFFFFFFFEFFFFFui64;
BugCheckParameter1 &= ~0x100000ui64;
if( (*((_DWORD *)v53 + 8552) & 0x100000) != 0 )
{
v28 |= 0x100000ui64;
BugCheckParameter1 = v28;
}
}
if( v28 != v29
|| v24 != KiMxCsrMask
|| *((_DWORD *)KiProcessorBlock + 58) != *((_DWORD *)Prcb + 58)
|| *((_DWORD *)KiProcessorBlock + 38) != *((_DWORD *)Prcb + 38)
|| *((_DWORD *)KiProcessorBlock + 39) != *v10 )
{
KeBugCheckEx(0x3Eu, v28, v29, 0i64, 0i64);
}
__writecr8(2ui64);
HvlEnlightenProcessor(0, v27, v29, (INT64 *)2);
v30 = Processa;
}
else
{
KeProcessorArchitecture = 9;
KeProcessorLevel = *((char *)Prcb + 64);
KeProcessorRevision = *((_WORD *)Prcb + 33);
KeFeatureBits = BugCheckParameter1;
__writecr8(1ui64);
KiFreezeExecutionLock = 0i64;
KiInitSystem();
qword_140C319F8 = (__int64)&KiProcessListHead;
KiProcessListHead = (__int64)&KiProcessListHead;
a16[1] = (unsigned __int16)((unsigned int)KiProcessorIndexToNumberMappingTable[0] >> 6);
a16[0] = 1i64 << (KiProcessorIndexToNumberMappingTable[0] & 0x3F);
LODWORD(Flags) = 1;
v30 = Processa;
KeInitializeProcess((_KPROCESS *)Processa, 0i64, (_GROUP_AFFINITY *)a16, 0i64, 0i64, Flags);
*((_BYTE *)v30 + 641) = 127;
v40 = __rdtsc();
KiWaitNever = __ROR8__(v40 ^ __ROL8__(v40, 43), v40 & 0xF);
v41 = __rdtsc();
KiWaitAlways = __ROL8__(__ROR8__(v41, 47) ^ v41, v41 & 0xF);
HviGetHypervisorFeatures((INT32 *)a24);
if( (a24[1] & 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( (v28 & 0x80000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[13] = 1;
if( (v28 & 0x4000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[7] = 1;
if( (v28 & 0x800000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[17] = 1;
if( (v28 & 0x10000000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[22] = 1;
if( (v28 & 0x4000000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[20] = 1;
if( (v28 & 0x8000000) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[21] = 1;
if( (v28 & 0x100000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[28] = 1;
if( (v28 & 0x400000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[32] = 1;
if( (v28 & 0x800000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[36] = 1;
if( (v28 & 0x1000000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[37] = 1;
if( (v28 & 0x2000000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[38] = 1;
if( (KUSER_SHARED_DATA.XState.EnabledFeatures & 4) != 0 && (v28 & 0x4000000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[39] = 1;
if( (KUSER_SHARED_DATA.XState.EnabledFeatures & 4) != 0 && (v28 & 0x8000000000000i64) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[40] = 1;
if( (v28 & 0x10000000000000i64) != 0 && (KUSER_SHARED_DATA.XState.EnabledFeatures & 0xE0) != 0 )
KUSER_SHARED_DATA.ProcessorFeatures[41] = 1;
KUSER_SHARED_DATA.VirtualizationFlags = KiVirtFlags;
v31 = Threada;
KiInitializeIdleThread((_KTHREAD *)Threada, KernelStack, (_KPROCESS *)v30, Prcb);
if( v7 )
{
if( !HalpInitSystemPhase1(0i64) )
KeBugCheck(0x5Cui64);
v32 = a15;
}
else
{
v32 = a15;
InitBootProcessor((_LOADER_PARAMETER_BLOCK *)a15);
}
KiCompleteKernelInit((__int64)Prcb, (__int64)v31, v7);
*(_QWORD *)(v32 + 136) = 0i64;
}Referenced by:
KiSystemStartup