KiSystemStartup
VOID __stdcall __noreturn KiSystemStartup(VOID *LoaderBlock){
unsigned int *Prcb;
unsigned __int64 v3;
unsigned __int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
__int64 v7;
unsigned __int64 v9;
void *v10;
_LOADER_PARAMETER_BLOCK *v11;
_EPROCESS *v12;
_ETHREAD *v13;
VOID *v14;
unsigned __int64 v15;
__int64 v16;
bool v17;
KeLoaderBlock_0 = (_LOADER_PARAMETER_BLOCK *)LoaderBlock;
if( !*(_DWORD *)(*((_QWORD *)LoaderBlock + 17) + 36i64) )
KdInitSystem(0xFFFFFFFFui64, KeLoaderBlock_0);
Prcb = (unsigned int *)KeLoaderBlock_0->Prcb;
_RDX = Prcb - 96;
*((_QWORD *)_RDX + 3) = _RDX;
*((_QWORD *)_RDX + 4) = Prcb;
v3 = __readcr0();
*((_QWORD *)Prcb + 32) = v3;
v4 = __readcr2();
*((_QWORD *)Prcb + 33) = v4;
v5 = __readcr3();
*((_QWORD *)Prcb + 34) = v5;
v6 = __readcr4();
*((_QWORD *)Prcb + 35) = v6;
__sgdt((char *)Prcb + 342);
v7 = *((_QWORD *)Prcb + 43);
*(_QWORD *)_RDX = v7;
__sidt((char *)Prcb + 358);
*((_QWORD *)_RDX + 7) = *((_QWORD *)Prcb + 45);
__asm
{
str word ptr [rdx+2F0h]
sldt word ptr [rdx+2F2h]
}
*Prcb = 8064;
_mm_setcsr(*Prcb);
if( !Prcb[9] )
*(_WORD *)(v7 + 80) = 15360;
if( !VslVsmEnabled )
{
_AX = 0;
__asm { lldt ax }
}
*MK_FP(43, _RDX + 2) = *MK_FP(43, v7 + 66);
*MK_FP(43, (char *)_RDX + 10) = *MK_FP(43, v7 + 68);
*MK_FP(43, (char *)_RDX + 11) = *MK_FP(43, v7 + 71);
*MK_FP(43, _RDX + 3) = *MK_FP(43, v7 + 72);
v9 = (unsigned __int64)_RDX >> 32;
__writemsr(0xC0000101, __PAIR64__(v9, (int)Prcb - 384));
__writemsr(0xC0000102, __PAIR64__(v9, (int)Prcb - 384));
if( !*MK_FP(43, Prcb + 9) )
{
_guard_dispatch_icall_fptr = (__int64(__fastcall *)())&guard_dispatch_icall;
_guard_check_icall_fptr[0] = (__int64(__fastcall *)())guard_check_icall;
}
KiInitializeBootStructures(KeLoaderBlock_0);
if( !*MK_FP(43, *MK_FP(43, &KeLoaderBlock_0->Prcb) + 36i64) )
KdInitSystem(0i64, KeLoaderBlock_0);
KiInitializeXSave(KeLoaderBlock_0, (unsigned int)*MK_FP(43, *MK_FP(43, &KeLoaderBlock_0->Prcb) + 36i64));
__writecr8(0xFui64);
v10 = alloca((unsigned int)KiXSaveAreaLength);
v11 = KeLoaderBlock_0;
v12 = (_EPROCESS *)*MK_FP(43, &KeLoaderBlock_0->Process);
v13 = (_ETHREAD *)*MK_FP(43, &KeLoaderBlock_0->Thread);
if( (KiKvaShadow & 1) != 0 )
{
v14 = (VOID *)*MK_FP(43, *MK_FP(43, &KeGetPcr()->IdtBase) + 4216i64);
__writegsqword(0x9008u, (unsigned __int64)v14);
}
else
{
v14 = (VOID *)*MK_FP(43, *MK_FP(43, &KeGetPcr()->TssBase) + 4i64);
}
__writegsqword(0x1A8u, (unsigned __int64)v14);
KiInitializeKernel(
&v12->Pcb,
&v13->Tcb,
v14,
(_KPRCB *)*MK_FP(43, &v11->Prcb),
*MK_FP(43, *MK_FP(43, &v11->Prcb) + 36i64),
v11);
if( !*MK_FP(43, &KeGetPcr()->Prcb.Number) )
{
v15 = __rdtsc();
v16 = __ROL8__(*(&WheapDeferredInternalLogsEventLock + 88) ^ __ROR8__(v15, 49) ^ v15, 16);
LOWORD(v16) = 0;
*(_QWORD *)&_security_cookie = __ROR8__(v16, 16);
_security_cookie_complement = (PVOID)~*(_QWORD *)&_security_cookie;
}
*MK_FP(43, &KeGetCurrentThread()->WaitBlockFill11[70]) = 2;
do
{
v17 = KiBarrierWait == 0;
_mm_pause();
}
while( !v17 );
KiIdleLoop();
}Referenced by:
No references.