MiGetNodeChannelPageCounts

VOID __stdcall MiGetNodeChannelPageCounts(
        _MI_PARTITION *Partition,
        UINT64 NodeNumber,
        UINT64 Channel,
        UINT64 *ZeroCount,
        UINT64 *FreeCount,
        UINT64 *StandbyCount){
  unsigned int v7; 
  _MI_NODE_INFORMATION *v8; 
  unsigned __int64 TotalPagesEntireNode; 
  __int64 *v10; 
  __int64 v11; 
  UINT64 v12; 
  __int64 v13; 
  UINT64 v14; 
  __int64 v15; 
  _QWORD *v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 *v19; 
  _MI_NODE_INFORMATION *v20; 
  __int64 v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  int v24; 
  UINT64 v25; 
  __int64 v26; 
  unsigned int v27; 
  _MMPFNLIST_SHORT *v28; 
  UINT64 v29; 

  v7 = Channel;
  v8 = &Partition->Core.NodeInformation[(unsigned int)NodeNumber];
  if( (_DWORD)Channel == 4 )
    TotalPagesEntireNode = v8->TotalPagesEntireNode;
  else
    TotalPagesEntireNode = v8->TotalPages[(unsigned int)Channel];
  do
  {
    if( MmNumberOfChannels == 1 || v7 == 4 )
    {
      v12 = v8->FreeCount[0];
      v19 = MiLargePageSizes;
      v14 = v8->FreeCount[1];
      v20 = v8;
      v21 = 3i64;
      do
      {
        v22 = *v19++;
        v23 = v20->FreeLargePages[0].LargePageFreeCount[0] * v22;
        v20 = (_MI_NODE_INFORMATION *)((char *)v20 + 1072);
        v12 += v23;
        v14 += v22 * v20[-1].StandbyPageList[1][1].Flink;
        --v21;
      }
      while( v21 );
    }
    else
    {
      v10 = MiLargePageSizes;
      v11 = 3i64;
      v12 = v8->ChannelFreeCount[v7][0];
      v13 = (__int64)v8->FreeLargePages[0].LargePagesCount + 32 * v7;
      v14 = v8->ChannelFreeCount[v7][1];
      do
      {
        v15 = *v10;
        v16 = (_QWORD *)v13;
        v17 = 4i64;
        do
        {
          v18 = *v16 + v16[32];
          ++v16;
          v12 += v15 * v18;
          v14 += v15 * (v16[15] + v16[47]);
          --v17;
        }
        while( v17 );
        ++v10;
        v13 += 1072i64;
        --v11;
      }
      while( v11 );
    }
    v24 = MmNumberOfChannels;
    v25 = 0i64;
    if( v7 != 4 )
      v24 = v7 + 1;
    v26 = 0i64;
    if( v7 != 4 )
      v26 = v7;
    v7 = v26;
LABEL_23:
    if( (_DWORD)v26 != v24 )
    {
      v27 = 0;
      v28 = v8->StandbyPageList[v26];
      while( 1 )
      {
        v29 = v25 + v28->Total;
        if( v29 < v25 || v29 == -1i64 )
          break;
        ++v27;
        ++v28;
        v25 = v29;
        if( v27 >= 8 )
        {
          v26 = (unsigned int)(v26 + 1);
          goto LABEL_23;
        }
      }
      v25 = -2i64;
    }
  }
  while( v14 + v25 + v12 > TotalPagesEntireNode );
  *ZeroCount = v12;
  *FreeCount = v14;
  *StandbyCount = v25;
}

Referenced by:

MiGetChannelInformation