MiGetChannelInformation

void __fastcall MiGetChannelInformation(_MI_PARTITION *Partition, UINT64 NodeNumber, __int64 a3, _QWORD *a4){
  _ETHREAD *CurrentThread; 
  unsigned int v5; 
  _MI_NODE_INFORMATION *v8; 
  unsigned int v9; 
  unsigned int v10; 
  __int64 v11; 
  unsigned __int64 *TotalPages; 
  unsigned int v13; 
  unsigned __int8 *ChannelOrdering; 
  UINT64 ZeroCount; 
  unsigned int v16; 
  UINT64 FreeCount; 
  UINT64 StandbyCount; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = NodeNumber;
  ZeroCount = 0i64;
  FreeCount = 0i64;
  StandbyCount = 0i64;
  v8 = &Partition->Core.NodeInformation[(unsigned int)NodeNumber];
  *a4 = 40i64 * (unsigned int)MmNumberOfChannels;
  MiLockDynamicMemoryExclusive(Partition, CurrentThread);
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockSharedEx(&v8->NodeLock, 0i64);
  v9 = MmNumberOfChannels;
  v10 = 0;
  v16 = MmNumberOfChannels;
  if( MmNumberOfChannels )
  {
    v11 = a3 + 4;
    TotalPages = v8->TotalPages;
    do
    {
      *(_DWORD *)(v11 - 4) = v10;
      if( (*(_DWORD *)&v8->Flags & 1) != 0 )
      {
        v13 = 0;
        ChannelOrdering = v8->ChannelOrdering;
        while( *ChannelOrdering != v10 )
        {
          ++v13;
          ++ChannelOrdering;
          if( v13 >= v9 )
            goto LABEL_5;
        }
        *(_DWORD *)v11 = v13;
      }
      else
      {
        *(_DWORD *)v11 = -1;
      }
LABEL_5:
      *(_QWORD *)(v11 + 4) = *TotalPages;
      MiGetNodeChannelPageCounts(Partition, v5, v10++, &ZeroCount, &FreeCount, &StandbyCount);
      v9 = v16;
      ++TotalPages;
      *(_QWORD *)(v11 + 12) = ZeroCount;
      *(_QWORD *)(v11 + 20) = FreeCount;
      *(_QWORD *)(v11 + 28) = StandbyCount;
      v11 += 40i64;
    }
    while( v10 < v9 );
  }
  if( _InterlockedCompareExchange64(&v8->NodeLock._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&v8->NodeLock);
  KeAbPostRelease(&v8->NodeLock);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  MiUnlockDynamicMemoryExclusive(Partition, CurrentThread);
}

Referenced by:

MmGetChannelInformation
MmManagePartitionMemoryInformation