HvlStartBootLogicalProcessors
NTSTATUS __stdcall HvlStartBootLogicalProcessors(INT64 a1){
unsigned int MaximumProcessorCount;
__int64 v3;
UINT64 v4;
UINT16 *IndependentPages;
UINT16 *v6;
NTSTATUS ApicIdAndNumaNode;
struct _KPRCB *CurrentPrcb;
unsigned int v9;
UINT16 *v10;
int v11;
char *v12;
_HVLP_LPCB *LpcbByApicId;
char v14;
int v15;
int *v16;
UINT64 v17;
_DWORD *v18;
__int16 v19;
__int16 v20;
INT64 *v21;
_BYTE PageInfo[40];
__int64 v23[8];
int Property[816];
int v25;
v25 = a1;
memset(v23, 0i64, sizeof(v23));
if( (HvlpFlags & 2) == 0 )
return 0;
v25 = 0;
if( ((int(__fastcall *)(__int64, __int64, __int64 *, int *))off_140C00A68[0])(11i64, 64i64, v23, &v25) >= 0
&& v25 == 64 )
{
HvlpQueryProcessorNode = v23[1];
HvlpQueryProximityId = v23[5];
HvlpQueryProximityNode = (__int64(__fastcall *)(_QWORD, _QWORD))v23[3];
HvlpQueryNodeDistance = (__int64(__fastcall *)(_QWORD, _QWORD, _QWORD))v23[7];
}
else
{
HvlpQueryProcessorNode = 0i64;
HvlpQueryProximityId = 0i64;
HvlpQueryProximityNode = 0i64;
HvlpQueryNodeDistance = 0i64;
}
MaximumProcessorCount = HalQueryMaximumProcessorCount();
v3 = MaximumProcessorCount;
v4 = 40 * MaximumProcessorCount;
IndependentPages = (UINT16 *)MmAllocateIndependentPages(v4, 0xFFFFFFFFui64);
v6 = IndependentPages;
if( IndependentPages )
{
memset(IndependentPages, 0i64, v4);
CurrentPrcb = KeGetCurrentPrcb();
dword_140D032E4[0] = 0;
ApicIdAndNumaNode = HvlpQueryApicIdAndNumaNode(0i64, &ApicId, &NodeNumber);
if( ApicIdAndNumaNode < 0 )
goto LABEL_39;
word_140D032EE = *(_WORD *)(KeNodeBlock[NodeNumber] + 148);
qword_140D03300 = (__int64)CurrentPrcb->StatisticsPage;
dword_140D032F8 = CurrentPrcb->Number;
HvlpCpuVendor = CurrentPrcb->CpuVendor;
HvlpDiscoverTopologyLocal(
(unsigned __int16)word_140D032EE,
(unsigned int)ApicId,
&PackageId,
(UINT64 *)((char *)&PackageId + 4));
HvlpLogicalProcessorCount = 1;
LODWORD(HvlpLogicalProcessorRegions) = 1;
ApicIdAndNumaNode = HvlpSelectLpSet(v3, (__int64)v6);
if( ApicIdAndNumaNode < 0 )
goto LABEL_39;
v9 = 1;
if( (unsigned int)v3 > 1 )
{
v10 = v6 + 24;
do
{
if( *((_BYTE *)v10 - 7) )
{
if( HvlpEnableNextLogicalProcessor(*((unsigned int *)v10 - 1), *v10) < 0 )
break;
++HvlpLogicalProcessorCount;
*((_BYTE *)v10 - 6) = 1;
}
++v9;
v10 += 20;
}
while( v9 < (unsigned int)v3 );
}
ApicIdAndNumaNode = HvlpSelectVpSet((unsigned int)v3, (UINT64)v6);
if( ApicIdAndNumaNode < 0 )
goto LABEL_39;
v11 = 0;
if( (_DWORD)v3 )
{
v12 = (char *)v6 + 1;
do
{
if( *v12 || v12[2] )
{
LpcbByApicId = HvlpGetLpcbByApicId(*(unsigned int *)(v12 + 3));
if( v14 )
{
LpcbByApicId[12] = 1;
++v11;
}
if( v12[2] )
{
++HvlpActiveProcessorCount;
*((_BYTE *)LpcbByApicId + 112) = 1;
}
}
v12 += 40;
--v3;
}
while( v3 );
}
if( v11 == HvlpLogicalProcessorCount )
{
if( (HvlpRootFlags & 0x800) == 0 )
goto LABEL_37;
}
else
{
qsort(
(UINT64)&HvlpLogicalProcessorRegions,
HvlpLogicalProcessorCount,
0x78ui64,
(INT64)HvlpCompareActiveLpcbs,
v21,
*(UINT64 *)PageInfo,
*(UINT64 *)&PageInfo[8]);
v15 = 0;
if( HvlpLogicalProcessorCount )
{
do
{
memset(Property, 0i64, 0xCB8u);
ApicIdAndNumaNode = 0;
v16 = &dword_140D032E4[30 * v15];
v17 = (unsigned int)*v16;
if( (_DWORD)v17 != v15 )
{
Property[0] = v15;
ApicIdAndNumaNode = HvlpSetLogicalProcessorProperty(
v17,
HvLogicalProcessorMachineCheckContextInfo|HvLogicalProcessorPccConfig,
Property);
if( ApicIdAndNumaNode >= 0 )
*v16 = v15;
}
if( ApicIdAndNumaNode < 0 )
goto LABEL_39;
}
while( ++v15 < HvlpLogicalProcessorCount );
}
}
memset(&PageInfo[8], 0, 32);
v18 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)&PageInfo[8], 1ui64, 0i64, 8ui64);
v18[1] = HvlpActiveProcessorCount;
*v18 = 5;
HvcallInitiateHypercall();
v20 = v19;
HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)&PageInfo[8]);
ApicIdAndNumaNode = v20 != 0 ? 0xC0000001 : 0;
if( v20 )
{
LABEL_39:
MmFreeIndependentPages(v6, v4);
return ApicIdAndNumaNode;
}
LABEL_37:
ApicIdAndNumaNode = 0;
if( !KeDynamicPartitioningSupported )
HvlNotifyAllProcessorsStarted();
goto LABEL_39;
}
return -1073741670;
}Referenced by:
KeStartAllProcessors