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