HvlpSelectVpSet
INT64 __fastcall HvlpSelectVpSet(UINT64 HalLpCount, UINT64 HalLpIndex){
__int64 v2;
__int64 v3;
char v4;
_WORD *v6;
__int64 v7;
char v8;
unsigned int v9;
_DWORD *v10;
unsigned int v11;
unsigned int v12;
unsigned int v13;
unsigned int v14;
__int16 *v15;
__int64 v16;
unsigned int v17;
unsigned __int16 *v18;
char v19;
__int64 v20;
unsigned int v21;
int v22;
unsigned int *v23;
UINT64 v24;
int v25;
UINT64 v26;
int v27;
_WORD *v28;
__int64 v29;
_DWORD *v30;
int v31;
__int64 v32;
int v33;
__int64 v34;
__int64 v35;
unsigned int v36;
_BYTE *v37;
unsigned int v38;
_BYTE *v39;
UINT64 v40;
unsigned int v41;
_BYTE *v42;
UINT64 v43;
INT64 v44;
_BYTE *v45;
__int64 v46;
char v47;
unsigned int v48;
char v49;
int v50;
_WORD *i;
unsigned int v52;
INT32 v54[4];
INT64 result[8];
LODWORD(v2) = 0;
v3 = (unsigned int)HalLpCount;
HvlpMinrootConfigurationError = 0;
*(_OWORD *)v54 = 0i64;
v4 = 0;
HviGetImplementationLimits(v54);
if( (_DWORD)v3 )
{
v6 = (_WORD *)(HalLpIndex + 8);
v7 = (unsigned int)v3;
do
{
v6[2] = *v6;
v8 = 0;
*(v6 - 4) = 1;
if( (HvlpRootFlags & 0x800) == 0 )
v8 = *((_BYTE *)v6 - 6);
*((_BYTE *)v6 - 5) = v8;
v6 += 20;
--v7;
}
while( v7 );
}
if( (HvlpFlags & 0x800000) == 0 )
goto LABEL_59;
if( (HvlpRootFlags & 0x800) != 0 )
goto LABEL_59;
v9 = 0;
if( !(_DWORD)v3 )
goto LABEL_59;
v10 = (_DWORD *)(HalLpIndex + 28);
while( !*((_BYTE *)v10 - 26) || !*v10 )
{
++v9;
v10 += 10;
if( v9 >= (unsigned int)v3 )
goto LABEL_59;
}
v4 = 1;
if( (KeRootProcPerNodeSpecified & 1) != 0 )
{
KeRootProcPerNodeSpecified = 0;
HvlpMinrootConfigurationError = 1;
}
if( (KeRootProcPerCoreSpecified & 1) != 0 )
{
KeRootProcPerCoreSpecified = 0;
HvlpMinrootConfigurationError = 1;
}
if( (KeRootProcSpecified & 1) != 0 )
{
KeRootProcSpecified = 0;
HvlpMinrootConfigurationError = 1;
}
v11 = KeRootProcNumaNodesSpecified;
if( KeRootProcNumaNodesSpecified )
{
v12 = 0;
do
{
if( KeRootProcNumaNodes[v12] == *(_WORD *)(HalLpIndex + 8) )
break;
++v12;
}
while( v12 < KeRootProcNumaNodesSpecified );
if( v12 == KeRootProcNumaNodesSpecified )
{
v11 = 0;
KeRootProcNumaNodesSpecified = 0;
HvlpMinrootConfigurationError = 1;
}
}
if( !KeRootProcSpecified )
goto LABEL_48;
memset((INT64)result, 0i64);
v13 = 0;
if( !v11 )
v11 = (unsigned __int16)KeNumberNodes;
v14 = 0;
if( !v11 )
{
LABEL_44:
if( KeRootProcNumaNodesSpecified )
{
KeRootProcNumaNodesSpecified = 0;
HvlpMinrootConfigurationError = 1;
}
goto LABEL_48;
}
v15 = KeRootProcNumaNodes;
do
{
if( KeRootProcNumaNodesSpecified )
{
v16 = (unsigned __int16)*v15;
if( (unsigned int)v16 >= 0x40 || *((_BYTE *)result + v16) )
goto LABEL_42;
*((_BYTE *)result + v16) = 1;
}
else
{
LODWORD(v16) = v14;
}
v17 = 0;
v18 = (unsigned __int16 *)(HalLpIndex + 8);
while( !*((_BYTE *)v18 - 6) || *v18 != (_DWORD)v16 )
{
++v17;
v18 += 20;
if( v17 >= (unsigned int)v3 )
goto LABEL_42;
}
++v13;
LABEL_42:
++v14;
++v15;
}
while( v14 < v11 );
if( !v13 )
goto LABEL_44;
if( KeRootProcSpecified <= v13 )
{
KeRootProcSpecified = 0;
HvlpMinrootConfigurationError = 1;
}
LABEL_48:
v19 = KeRootProcNumaNodeLpsSpecified;
if( KeRootProcNumaNodeLpsSpecified )
{
v20 = KeRootProcNumaNodeLps[*(unsigned __int16 *)(HalLpIndex + 8)];
if( (v20 & 1) == 0 )
{
v19 = 0;
HvlpMinrootConfigurationError = 1;
KeRootProcNumaNodeLpsSpecified = 0;
}
if( v19 )
{
v21 = 1;
v22 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) - 1);
if( (unsigned int)v3 > 1 )
{
v23 = (unsigned int *)(HalLpIndex + 76);
while( (v22 & *(v23 - 8)) != (v22 & *(_DWORD *)(HalLpIndex + 4)) || _bittest64(&v20, *v23) )
{
++v21;
v23 += 10;
if( v21 >= (unsigned int)v3 )
goto LABEL_59;
}
KeRootProcNumaNodeLpsSpecified = 0;
HvlpMinrootConfigurationError = 1;
}
}
}
LABEL_59:
v24 = HalLpIndex + 1;
*(_BYTE *)(HalLpIndex + 3) = 1;
*(_BYTE *)(HalLpIndex + 1) = 1;
v25 = 1;
while( 2 )
{
if( (_DWORD)v3 )
{
v26 = HalLpIndex;
v2 = v3;
while( !*(_BYTE *)v26 )
{
LABEL_90:
v26 += 40i64;
if( !--v2 )
goto LABEL_91;
}
if( !*(_BYTE *)(v26 + 1) && *(_BYTE *)(v26 + 2) && v25 != v54[0] )
{
if( !KeRootProcPerNodeSpecified )
goto LABEL_73;
v27 = 0;
v28 = (_WORD *)(HalLpIndex + 8);
v29 = v3;
do
{
if( *((_BYTE *)v28 - 7) && *v28 == *(_WORD *)(v26 + 8) )
++v27;
v28 += 20;
--v29;
}
while( v29 );
if( v27 != KeRootProcPerNodeSpecified )
{
LABEL_73:
if( !KeRootProcPerCoreSpecified )
goto LABEL_80;
v30 = (_DWORD *)(HalLpIndex + 4);
v31 = 0;
v32 = v3;
v33 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) - 1);
do
{
if( *((_BYTE *)v30 - 3) && (v33 & *v30) == (v33 & *(_DWORD *)(v26 + 4)) )
++v31;
v30 += 10;
--v32;
}
while( v32 );
if( v31 != KeRootProcPerCoreSpecified )
{
LABEL_80:
if( KeRootProcNumaNodesSpecified )
{
v34 = 0i64;
if( KeRootProcNumaNodesSpecified )
{
while( KeRootProcNumaNodes[v34] != *(_WORD *)(v26 + 12) )
{
v34 = (unsigned int)(v34 + 1);
if( (unsigned int)v34 >= KeRootProcNumaNodesSpecified )
goto LABEL_89;
}
goto LABEL_85;
}
}
else
{
LABEL_85:
if( !KeRootProcSpecified || v25 != KeRootProcSpecified )
{
if( !KeRootProcNumaNodeLpsSpecified )
goto LABEL_90;
v35 = KeRootProcNumaNodeLps[*(unsigned __int16 *)(v26 + 8)];
if( _bittest64(&v35, *(unsigned int *)(v26 + 36)) )
goto LABEL_90;
}
}
}
}
}
LABEL_89:
*(_BYTE *)v26 = 0;
goto LABEL_90;
}
LABEL_91:
v36 = v2;
if( (_DWORD)v3 )
{
v37 = (_BYTE *)HalLpIndex;
do
{
if( *v37 != (_BYTE)v2 )
break;
++v36;
v37 += 40;
}
while( v36 < (unsigned int)v3 );
}
if( v36 != (_DWORD)v3 )
{
v38 = v2;
if( (_DWORD)v3 )
{
v39 = (_BYTE *)HalLpIndex;
do
{
if( *v39 )
HvlpComputeLpComparisonMetrics((unsigned int)v3, HalLpIndex);
++v38;
v39 += 40;
}
while( v38 < (unsigned int)v3 );
LODWORD(v2) = 0;
}
v40 = 0xFFFFFFFFi64;
v41 = v2;
if( (_DWORD)v3 )
{
v42 = (_BYTE *)HalLpIndex;
while( *v42 == (_BYTE)v2 )
{
++v41;
v42 += 40;
if( v41 >= (unsigned int)v3 )
goto LABEL_108;
}
v40 = v41;
}
LABEL_108:
v43 = (unsigned int)(v40 + 1);
if( (unsigned int)v43 < (unsigned int)v3 )
{
v44 = 5 * v43;
v45 = (_BYTE *)(HalLpIndex + 40 * v43);
do
{
if( *v45 != (_BYTE)v2 && (unsigned int)HvlpLpComparison(v44, HalLpIndex, v43, v40) == -1 )
v40 = (unsigned int)v43;
v43 = (unsigned int)(v43 + 1);
v45 += 40;
}
while( (unsigned int)v43 < (unsigned int)v3 );
}
++v25;
v46 = 5i64 * (unsigned int)v40;
*(_BYTE *)(HalLpIndex + 8 * v46 + 1) = 1;
*(_BYTE *)(HalLpIndex + 8 * v46 + 3) = 1;
continue;
}
break;
}
v47 = 0;
if( v4 )
{
v48 = v2;
if( (_DWORD)v3 )
{
do
{
if( *(_BYTE *)v24 != (_BYTE)v2 )
{
HvlpComputeLpComparisonMetrics((unsigned int)v3, HalLpIndex);
if( *(_DWORD *)(v24 + 27) == (_DWORD)v2 )
{
*(_BYTE *)v24 = v2;
v49 = v2;
if( (HvlpRootFlags & 0x800) == 0 )
v49 = *(_BYTE *)(v24 + 1);
*(_BYTE *)(v24 + 2) = v49;
v47 = 1;
HvlpMinrootConfigurationError = 1;
}
}
++v48;
v24 += 40i64;
}
while( v48 < (unsigned int)v3 );
}
}
if( KeRootProcNumaNodesSpecified != (_DWORD)v2 )
return 0i64;
if( KeRootProcNumaNodeLpsSpecified != (_BYTE)v2 )
return 0i64;
if( v47 )
return 0i64;
v50 = v2;
if( !(_DWORD)v3 )
return 0i64;
for( i = (_WORD *)(HalLpIndex + 8); ; i += 20 )
{
if( *((_BYTE *)i - 6) != (_BYTE)v2 )
{
v52 = v2;
do
{
if( *(_WORD *)(HalLpIndex + 40i64 * v52 + 8) == *i && *(_BYTE *)(HalLpIndex + 40i64 * v52 + 1) != (_BYTE)v2 )
break;
++v52;
}
while( v52 < (unsigned int)v3 );
if( v52 == (_DWORD)v3 )
break;
}
if( ++v50 >= (unsigned int)v3 )
return 0i64;
}
return 3221225473i64;
}Referenced by:
HvlStartBootLogicalProcessors