MiComputeMemoryNodeProcessorAssignments
NTSTATUS __stdcall MiComputeMemoryNodeProcessorAssignments(INT64 a1){
unsigned int v1;
unsigned __int16 v2;
INT64 v3;
int v4;
unsigned int v5;
__int64 v6;
_WORD *v7;
bool v8;
int v9;
unsigned int v10;
unsigned int v12;
__int64 v13;
__int64 v14;
unsigned int *v15;
unsigned int *v16;
__int64 v17;
unsigned int v18;
__int64 v19;
unsigned __int64 v20;
unsigned int v21;
unsigned __int64 v22;
__int16 v23;
v1 = *(&stru_140C4DB30 + 61);
v2 = 0;
v3 = a1;
v4 = 0;
v5 = 0;
if( !KeNumberNodes )
return 1;
do
{
v6 = *(_QWORD *)(v3 + 16) + 4544i64 * v5;
v7 = (_WORD *)(v6 + 4488);
KeQueryNodeActiveAffinity(v5, (PGROUP_AFFINITY)(v6 + 4472), (PUSHORT)(v6 + 4488));
v8 = *v7 == 0;
v9 = v4 + 1;
v10 = (unsigned __int16)KeNumberNodes;
if( !v8 )
v9 = v4;
++v5;
v4 = v9;
}
while( v5 < (unsigned __int16)KeNumberNodes );
if( !v9 )
return 1;
v12 = 0;
if( !KeNumberNodes )
return 1;
while( 1 )
{
v13 = *(_QWORD *)(v3 + 16);
v14 = v13 + 4544i64 * v12;
if( !*(_WORD *)(v14 + 4488) )
{
v15 = (unsigned int *)(*(&stru_140C4DB30 + 21) + 4i64 * v12 * v10);
v16 = &v15[(unsigned __int16)KeNumberNodes];
while( ++v15 < v16 )
{
v17 = v13 + 4544i64 * *v15;
v18 = *(unsigned __int16 *)(v17 + 4488) / v1;
if( v18 >= 2 )
{
v19 = 0i64;
v20 = *(_QWORD *)(v17 + 4472);
v21 = (v1 * v18) >> 1;
if( v21 )
{
do
{
_BitScanForward64(&v22, v20);
++v2;
v19 |= 1i64 << v22;
v20 &= ~(1i64 << v22);
}
while( v2 < v21 );
v3 = a1;
}
*(_QWORD *)(v17 + 4472) &= ~v19;
*(_QWORD *)(v14 + 4472) = v19;
v23 = *(_WORD *)(v17 + 4480);
*(_WORD *)(v14 + 4488) = v2;
*(_WORD *)(v14 + 4480) = v23;
*(_WORD *)(v17 + 4488) -= v2;
v2 = 0;
break;
}
}
if( v15 == v16 )
return 0;
}
if( ++v12 >= v10 )
return 1;
}
}Referenced by:
MiZeroBootLargePages