HvlInitializeProcessor
NTSTATUS __stdcall HvlInitializeProcessor(_SLIST_HEADER *Prcb, UINT64 ApicId){
NTSTATUS result;
__int64 v4;
VOID *v5;
VOID *v6;
VOID *OverlayPages;
VOID *v8;
UINT64 v9;
_MEMORY_CACHING_TYPE v10;
__int64 IndependentPages;
UINT64 v12;
__int64 v13;
if( !(_BYTE)HvlHypervisorConnected )
return 0;
v4 = 2i64;
if( (HvlpFlags & 2) == 0 || (result = HvlpEnableRootVirtualProcessor((_KPRCB *)Prcb, ApicId), result >= 0) )
{
v5 = 0i64;
v6 = 0i64;
if( (HvlpFlags & 0x80000) != 0 && (HvlpFlags & 2) == 0 )
{
OverlayPages = HvlpAllocateOverlayPages((UINT64)Prcb);
v6 = OverlayPages;
if( !OverlayPages )
return -1073741670;
Prcb[2104].Region = (unsigned __int64)OverlayPages;
}
if( (HvlpFlags & 2) == 0 && (HvlpFlags & 0x8000) != 0 )
{
v8 = HvlpAllocateOverlayPages((unsigned int)HvlpFlags);
v5 = v8;
if( !v8 )
{
LABEL_18:
if( v6 )
{
HvlpFreeOverlayPages(v6, v9, v10);
Prcb[2104].Region = 0i64;
}
if( v5 )
{
HvlpFreeOverlayPages(v5, v9, v10);
Prcb[2123].Region = 0i64;
}
return -1073741670;
}
Prcb[2123].Region = (unsigned __int64)v8;
}
IndependentPages = MmAllocateIndependentPagesEx(
0x6000ui64,
*(unsigned __int16 *)(Prcb[12].Alignment + 146),
0i64,
0);
v12 = IndependentPages;
if( IndependentPages )
{
Prcb[2104].Alignment = IndependentPages;
do
{
LODWORD(v13) = MmGetPhysicalAddress(v12);
*(_QWORD *)(v12 + 16) = v13;
v12 += 4096i64;
--v4;
}
while( v4 );
HvlpSetupCachedHypercallPages((_KPRCB *)Prcb);
return 0;
}
goto LABEL_18;
}
return result;
}Referenced by:
KeStartAllProcessors
KiStartDynamicProcessor