HvlStartBootLogicalProcessors
INT64 __fastcall HvlStartBootLogicalProcessors(INT64 a1){
unsigned int MaximumProcessorCount;
__int64 v3;
UINT64 v4;
UINT64 v5;
UINT64 v6;
INT64 v7;
UINT16 *v8;
signed int ApicIdAndNumaNode;
struct _KPRCB *CurrentPrcb;
unsigned int v11;
UINT16 *v12;
int v13;
char *v14;
WCHAR *LpcbByApicId;
char v16;
int v17;
int *v18;
INT64 v19;
LONGLONG *v20;
__int16 v21;
__int16 v22;
_BYTE v23[40];
INT64 result[8];
UINT8 v25[3264];
int v26;
v26 = a1;
memset((INT64)result, 0i64);
if( (HvlpFlags & 2) == 0 )
return 0i64;
v26 = 0;
if( ((int(__fastcall *)(__int64, __int64, INT64 *, int *))off_140C00A68[0])(11i64, 64i64, result, &v26) >= 0
&& v26 == 64 )
{
HvlpQueryProcessorNode = result[1];
HvlpQueryProximityId = result[5];
HvlpQueryProximityNode = (__int64(__fastcall *)(_QWORD, _QWORD))result[3];
HvlpQueryNodeDistance = (__int64(__fastcall *)(_QWORD, _QWORD, _QWORD))result[7];
}
else
{
HvlpQueryProcessorNode = 0i64;
HvlpQueryProximityId = 0i64;
HvlpQueryProximityNode = 0i64;
HvlpQueryNodeDistance = 0i64;
}
MaximumProcessorCount = HalQueryMaximumProcessorCount();
v3 = MaximumProcessorCount;
v4 = 40 * MaximumProcessorCount;
MmAllocateIndependentPages(v4, 0xFFFFFFFFui64, v5, v6);
v8 = (UINT16 *)v7;
if( v7 )
{
memset(v7, 0i64);
CurrentPrcb = KeGetCurrentPrcb();
dword_140D032E4[0] = 0;
ApicIdAndNumaNode = HvlpQueryApicIdAndNumaNode(0i64, &ApicId, &NodeNumber);
if( ApicIdAndNumaNode < 0 )
goto LABEL_39;
word_140D032EE = *(_WORD *)(*((_QWORD *)&KeNodeBlock + NodeNumber) + 148i64);
qword_140D03300 = *((_QWORD *)CurrentPrcb + 4202);
dword_140D032F8 = *((_DWORD *)CurrentPrcb + 9);
HvlpCpuVendor = *((_BYTE *)CurrentPrcb + 141);
HvlpDiscoverTopologyLocal((unsigned __int16)word_140D032EE, (unsigned int)ApicId, &PackageId, &CoreId);
LODWORD(HvlpLogicalProcessorCount) = 1;
*(_DWORD *)&HvlpLogicalProcessorRegions = 1;
ApicIdAndNumaNode = HvlpSelectLpSet((unsigned int)v3, (UINT64)v8);
if( ApicIdAndNumaNode < 0 )
goto LABEL_39;
v11 = 1;
if( (unsigned int)v3 > 1 )
{
v12 = v8 + 24;
do
{
if( *((_BYTE *)v12 - 7) )
{
if( (int)HvlpEnableNextLogicalProcessor(*((unsigned int *)v12 - 1), *v12) < 0 )
break;
LODWORD(HvlpLogicalProcessorCount) = HvlpLogicalProcessorCount + 1;
*((_BYTE *)v12 - 6) = 1;
}
++v11;
v12 += 20;
}
while( v11 < (unsigned int)v3 );
}
ApicIdAndNumaNode = HvlpSelectVpSet((unsigned int)v3, (UINT64)v8);
if( ApicIdAndNumaNode < 0 )
goto LABEL_39;
v13 = 0;
if( (_DWORD)v3 )
{
v14 = (char *)v8 + 1;
do
{
if( *v14 || v14[2] )
{
LpcbByApicId = HvlpGetLpcbByApicId(*(_DWORD *)(v14 + 3));
if( v16 )
{
*((_DWORD *)LpcbByApicId + 12) = 1;
++v13;
}
if( v14[2] )
{
++HvlpActiveProcessorCount;
*((_BYTE *)LpcbByApicId + 112) = 1;
}
}
v14 += 40;
--v3;
}
while( v3 );
}
if( v13 == (_DWORD)HvlpLogicalProcessorCount )
{
if( (HvlpRootFlags & 0x800) == 0 )
goto LABEL_37;
}
else
{
qsort(
&HvlpLogicalProcessorRegions,
(unsigned int)HvlpLogicalProcessorCount,
(const WCHAR *)0x78,
HvlpCompareActiveLpcbs);
v17 = 0;
if( (_DWORD)HvlpLogicalProcessorCount )
{
do
{
memset((INT64)v25, 0i64);
ApicIdAndNumaNode = 0;
v18 = &dword_140D032E4[30 * v17];
v19 = (unsigned int)*v18;
if( (_DWORD)v19 != v17 )
{
*(_DWORD *)v25 = v17;
ApicIdAndNumaNode = HvlpSetLogicalProcessorProperty(v19, 6i64, v25);
if( ApicIdAndNumaNode >= 0 )
*v18 = v17;
}
if( ApicIdAndNumaNode < 0 )
goto LABEL_39;
}
while( ++v17 < (unsigned int)HvlpLogicalProcessorCount );
}
}
memset(&v23[8], 0, 32);
v20 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)&v23[8], 1, 0i64, 8i64);
*((_DWORD *)v20 + 1) = HvlpActiveProcessorCount;
*(_DWORD *)v20 = 5;
HvcallInitiateHypercall();
v22 = v21;
HvlpReleaseHypercallPage((unsigned int *)&v23[8]);
ApicIdAndNumaNode = v22 != 0 ? 0xC0000001 : 0;
if( v22 )
{
LABEL_39:
MmFreeIndependentPages(v8, v4);
return(unsigned int)ApicIdAndNumaNode;
}
LABEL_37:
ApicIdAndNumaNode = 0;
if( !KeDynamicPartitioningSupported )
HvlNotifyAllProcessorsStarted();
goto LABEL_39;
}
return(unsigned int)-1073741670;
}Referenced by:
KeStartAllProcessors