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