HvlpSelectLpSet
INT64 __fastcall HvlpSelectLpSet(UINT64 HalLpCount, UINT64 a2){
unsigned int v3;
unsigned int v4;
int v5;
int v6;
unsigned int v7;
int v8;
unsigned int v9;
_WORD *v10;
NTSTATUS ApicIdAndNumaNode;
unsigned int v12;
__int64(__fastcall *v13)(__int64, int *, unsigned int *);
__int64 v14;
int v15;
int v16;
int v17;
int v18;
int v19;
int v20;
UINT64 v21;
__int64 v22;
__int64 v23;
UINT64 v24;
unsigned int i;
unsigned int v26;
_BYTE *v27;
unsigned int v28;
_BYTE *v29;
UINT64 v30;
unsigned int v31;
_BYTE *v32;
UINT64 v33;
INT64 v34;
_BYTE *v35;
unsigned int v36;
int v37;
_DWORD *v38;
unsigned int v39;
__int16 NodeNumber[2];
__int16 v42;
int v43;
NTSTATUS v44;
unsigned int v45;
int v46;
int v47;
int v48;
INT32 v49[4];
NodeNumber[0] = 0;
v45 = 0;
v42 = 0;
v3 = HalLpCount;
v47 = 0;
v44 = 0;
*(_OWORD *)v49 = 0i64;
if( (HvlpRootFlags & 1) == 0 )
{
KeHypervisorNumprocSpecified = 0;
KeRootProcSpecified = 0;
KeRootProcNumaNodesSpecified = 0;
KeRootProcPerNodeSpecified = 0;
KeRootProcPerCoreSpecified = 0;
KeRootProcNumaNodeLpsSpecified = 0;
}
if( (HvlpRootFlags & 0x800) != 0 )
{
KeRootProcSpecified = 0;
KeRootProcNumaNodesSpecified = 0;
KeRootProcPerNodeSpecified = 0;
KeRootProcPerCoreSpecified = 1;
KeRootProcNumaNodeLpsSpecified = 0;
}
HviGetImplementationLimits(v49);
v4 = 64;
v5 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) * *((_DWORD *)KeGetCurrentPrcb() + 38) - 1);
if( v49[0] < 0x40u )
v4 = v49[0];
if( KeRootProcSpecified && KeRootProcSpecified < v4 && !KeRootProcNumaNodesSpecified )
v4 = KeRootProcSpecified;
v6 = HalEnumerateProcessors((unsigned int)KeRegisteredProcessors);
v7 = 0;
v43 = v6;
v8 = v6;
v9 = 0;
if( v3 )
{
v10 = (_WORD *)(a2 + 10);
do
{
*((_BYTE *)v10 - 10) = 1;
ApicIdAndNumaNode = HvlpQueryApicIdAndNumaNode(v9, (UINT64 *)(v10 - 3), (UINT16 *)NodeNumber);
v7 = 0;
v44 = ApicIdAndNumaNode;
v12 = ApicIdAndNumaNode;
if( ApicIdAndNumaNode == -1073741275 )
{
v44 = 0;
*((_BYTE *)v10 - 10) = 0;
}
else
{
if( ApicIdAndNumaNode < 0 )
return v12;
v13 = (__int64(__fastcall *)(__int64, int *, unsigned int *))HvlpQueryProximityId;
v14 = (unsigned __int16)NodeNumber[0];
*(v10 - 1) = NodeNumber[0];
if( v13 )
{
v15 = v13(v14, &v47, &v45);
LOWORD(v14) = NodeNumber[0];
v7 = 0;
}
else
{
v15 = -1073741275;
}
if( v15 < 0
|| (!HvlpQueryProximityNode ? (v16 = -1073741275) : (v16 = HvlpQueryProximityNode(v45, &v42),
LOWORD(v14) = NodeNumber[0],
v7 = 0),
v16 < 0) )
{
*v10 = v14;
}
else
{
*v10 = v42;
}
v10[1] = *v10;
}
++v9;
v10 += 20;
}
while( v9 < v3 );
v8 = v43;
}
v17 = 1;
*(_BYTE *)(a2 + 1) = 1;
v18 = 1;
v19 = 1;
while( 1 )
{
v48 = v19;
v20 = v17;
v46 = v17;
if( v3 )
{
v21 = a2;
do
{
if( *(_BYTE *)v21 )
{
if( *(_BYTE *)(v21 + 1) )
goto LABEL_58;
v22 = *(unsigned __int16 *)(v21 + 8);
if( (unsigned __int16)v22 >= (unsigned __int16)KeNumberNodes
|| (*(_BYTE *)(*((_QWORD *)&KeNodeBlock + v22) + 181i64) & 2) == 0
|| v18 == 1024
|| v18 == v8
|| (_DWORD)KeMaximumProcessors && v18 == (_DWORD)KeMaximumProcessors )
{
goto LABEL_58;
}
if( KeBootprocSpecified && v18 == KeBootprocSpecified
|| KeNumprocSpecified && v7 >= KeNumprocSpecified
|| KeHypervisorNumprocSpecified && v18 == KeHypervisorNumprocSpecified )
{
goto LABEL_58;
}
if( v19 == v4 )
{
v23 = 0i64;
do
{
if( *(_WORD *)(a2 + 40 * v23 + 8) == (_WORD)v22 && *(_BYTE *)(a2 + 40 * v23 + 1) )
break;
v23 = (unsigned int)(v23 + 1);
}
while( (unsigned int)v23 < v3 );
if( (_DWORD)v23 == v3 )
goto LABEL_58;
}
if( v17 == (_DWORD)KeRegisteredProcessors )
{
v24 = a2 + 1;
for( i = 0; i < v3; ++i )
{
if( (v5 & *(_DWORD *)(v21 + 4)) == (v5 & *(_DWORD *)(v24 + 3)) && *(_BYTE *)v24 )
break;
v24 += 40i64;
}
if( i == v3 )
LABEL_58:
*(_BYTE *)v21 = 0;
}
}
v8 = v43;
++v7;
v21 += 40i64;
}
while( v7 < v3 );
v20 = v17;
}
v7 = 0;
v26 = 0;
if( v3 )
{
v27 = (_BYTE *)a2;
do
{
if( *v27 )
break;
++v26;
v27 += 40;
}
while( v26 < v3 );
}
if( v26 == v3 )
return(unsigned int)v44;
v28 = 0;
if( v3 )
{
v29 = (_BYTE *)a2;
do
{
if( *v29 )
{
HvlpComputeLpComparisonMetrics(v3, a2);
v7 = 0;
}
++v28;
v29 += 40;
}
while( v28 < v3 );
v20 = v46;
}
v30 = 0xFFFFFFFFi64;
v31 = 0;
if( v3 )
{
v32 = (_BYTE *)a2;
while( !*v32 )
{
++v31;
v32 += 40;
if( v31 >= v3 )
goto LABEL_78;
}
v30 = v31;
}
LABEL_78:
v33 = (unsigned int)(v30 + 1);
if( (unsigned int)v33 < v3 )
{
v34 = 5 * v33;
v35 = (_BYTE *)(a2 + 40 * v33);
do
{
if( *v35 )
{
if( (unsigned int)HvlpLpComparison(v34, a2, v33, v30) == -1 )
v30 = (unsigned int)v33;
v7 = 0;
}
v33 = (unsigned int)(v33 + 1);
v35 += 40;
}
while( (unsigned int)v33 < v3 );
}
++v18;
v36 = 0;
v37 = v5 & *(_DWORD *)(a2 + 40i64 * (unsigned int)v30 + 4);
*(_BYTE *)(a2 + 40i64 * (unsigned int)v30 + 1) = 1;
if( v3 )
{
v38 = (_DWORD *)(a2 + 4);
do
{
if( v36 != (_DWORD)v30 && *((_BYTE *)v38 - 3) && (v5 & *v38) == v37 )
break;
++v36;
v38 += 10;
}
while( v36 < v3 );
}
v17 = v20 + 1;
v39 = 0;
if( v36 != v3 )
v17 = v20;
if( v3 )
{
do
{
if( v39 != (_DWORD)v30
&& *(_BYTE *)(a2 + 40i64 * v39 + 1)
&& *(_WORD *)(a2 + 40i64 * v39 + 8) == *(_WORD *)(a2 + 40i64 * (unsigned int)v30 + 8) )
{
break;
}
++v39;
}
while( v39 < v3 );
}
v8 = v43;
v19 = v48 + 1;
if( v39 != v3 )
v19 = v48;
}
}Referenced by:
HvlStartBootLogicalProcessors