MiCheckZeroFreeRebalance
INT64 __fastcall MiCheckZeroFreeRebalance(INT64 a1, UINT64 a2){
unsigned int v2;
_MI_NODE_INFORMATION *v3;
__int64 *v4;
INT64 result;
_MMLISTS v6;
__int64 i;
INT64 v8;
__int64 v9;
UINT64 v10;
int v11;
struct _KLOCK_QUEUE_HANDLE LockHandle;
unsigned int Channel;
unsigned int NodeNumber;
v2 = MmNumberOfChannels;
memset(&LockHandle, 0, sizeof(LockHandle));
NodeNumber = (unsigned int)a2 >> byte_140C4DBCC;
v3 = (_MI_NODE_INFORMATION *)(*(_QWORD *)(a1 + 16) + 4544i64 * ((unsigned int)a2 >> byte_140C4DBCC));
Channel = 0;
if( (unsigned int)MmNumberOfChannels > 1 )
Channel = (unsigned __int16)(unsigned __int8)MiChannelMaximumPowerOf2Mask & (unsigned __int16)((unsigned int)a2 >> byte_140C4DBCD);
v4 = (__int64 *)((char *)v3 + 4128);
result = 0i64;
v6 = ZeroedPageList;
for( i = 0i64; i <= 1; ++i )
{
v8 = result;
if( v2 > 1 )
v9 = *((_QWORD *)v3 + 2 * Channel + i + 527);
else
v9 = *v4;
v10 = MiNodeLargeFreeZeroPages(v3, Channel, v6++);
result = v9 + v8 + v10;
++v4;
}
if( (unsigned __int64)result < 0x200 )
{
result = MiGetNodeStandbyPageCount((_MI_PARTITION *)a1, NodeNumber, Channel);
if( (unsigned __int64)result >= 0x1000 && !*(_QWORD *)(a1 + 6320) )
{
result = *(unsigned int *)(a1 + 4);
if( (result & 1) == 0 )
{
KeAcquireInStackQueuedSpinLock(&qword_140C4E340, &LockHandle);
if( *(_QWORD *)(a1 + 6320) || (*(_DWORD *)(a1 + 4) & 1) != 0 )
{
v11 = 0;
}
else
{
v11 = 0;
if( PsReferencePartitionSafe(*(_QWORD *)(a1 + 176)) )
{
*(_QWORD *)(a1 + 6304) = 0i64;
*(_QWORD *)(a1 + 6320) = MiRebalanceZeroFreeLists;
v11 = 1;
*(_QWORD *)(a1 + 6328) = a1;
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = (unsigned int)KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
if( v11 == 1 )
LODWORD(result) = ExQueueWorkItemToPartition((PVOID)(a1 + 6304));
}
}
}
return result;
}Referenced by:
MiGetPage