HvlInitializeProcessor
NTSTATUS __fastcall HvlInitializeProcessor(_QWORD *a1, int a2){
NTSTATUS result;
__int64 v4;
VOID *v5;
VOID *v6;
VOID *v7;
VOID *v8;
INT64 IndependentPages;
PHYSICAL_ADDRESS *v10;
if( !(_BYTE)HvlHypervisorConnected )
return 0;
v4 = 2i64;
if( (HvlpFlags & 2) == 0 || (result = HvlpEnableRootVirtualProcessor((__int64)a1, a2), result >= 0) )
{
v5 = 0i64;
v6 = 0i64;
if( (HvlpFlags & 0x80000) != 0 && (HvlpFlags & 2) == 0 )
{
LODWORD(v7) = HvlpAllocateOverlayPages((UINT64)a1);
v6 = v7;
if( !v7 )
return -1073741670;
a1[4209] = v7;
}
if( (HvlpFlags & 2) == 0 && (HvlpFlags & 0x8000) != 0 )
{
LODWORD(v8) = HvlpAllocateOverlayPages((unsigned int)HvlpFlags);
v5 = v8;
if( !v8 )
{
LABEL_18:
if( v6 )
{
HvlpFreeOverlayPages(v6);
a1[4209] = 0i64;
}
if( v5 )
{
HvlpFreeOverlayPages(v5);
a1[4247] = 0i64;
}
return -1073741670;
}
a1[4247] = v8;
}
IndependentPages = MmAllocateIndependentPagesEx(0x6000ui64, *(unsigned __int16 *)(a1[24] + 146i64), 0i64, 0i64);
v10 = (PHYSICAL_ADDRESS *)IndependentPages;
if( IndependentPages )
{
a1[4208] = IndependentPages;
do
{
v10[2] = MmGetPhysicalAddress(v10);
v10 += 512;
--v4;
}
while( v4 );
HvlpSetupCachedHypercallPages((_KPRCB *)a1);
return 0;
}
goto LABEL_18;
}
return result;
}Referenced by:
KeStartAllProcessors
KiStartDynamicProcessor