MiCheckZeroFreeRebalance
NTSTATUS __stdcall MiCheckZeroFreeRebalance(INT64 a1, UINT64 a2){
unsigned int v2;
_MI_NODE_INFORMATION *v3;
volatile unsigned __int64 *FreeCount;
unsigned __int64 v5;
_MMLISTS v6;
__int64 i;
unsigned __int64 v8;
volatile unsigned __int64 v9;
__int64 v10;
int v11;
_KLOCK_QUEUE_HANDLE LockHandle;
unsigned int Channel;
unsigned int NodeNumber;
v2 = MmNumberOfChannels;
memset(&LockHandle, 0, sizeof(LockHandle));
NodeNumber = (unsigned int)a2 >> *(&stru_140C4DB30 + 156);
v3 = (_MI_NODE_INFORMATION *)(*(_QWORD *)(a1 + 16) + 4544i64 * ((unsigned int)a2 >> *(&stru_140C4DB30 + 156)));
Channel = 0;
if( (unsigned int)MmNumberOfChannels > 1 )
Channel = (unsigned __int16)(unsigned __int8)MiChannelMaximumPowerOf2Mask & (unsigned __int16)((unsigned int)a2 >> *(&stru_140C4DB30 + 157));
FreeCount = v3->FreeCount;
v5 = 0i64;
v6 = ZeroedPageList;
for( i = 0i64; i <= 1; ++i )
{
v8 = v5;
if( v2 > 1 )
v9 = v3->ChannelFreeCount[Channel][i];
else
v9 = *FreeCount;
LODWORD(v10) = MiNodeLargeFreeZeroPages(v3, Channel, v6++);
v5 = v9 + v8 + v10;
++FreeCount;
}
if( v5 < 0x200 )
{
MiGetNodeStandbyPageCount((_MI_PARTITION *)a1, NodeNumber, Channel);
if( v5 >= 0x1000 && !*(_QWORD *)(a1 + 6320) )
{
LODWORD(v5) = *(_DWORD *)(a1 + 4);
if( (v5 & 1) == 0 )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 258, &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);
LODWORD(v5) = KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
if( v11 == 1 )
LODWORD(v5) = ExQueueWorkItemToPartition((PVOID)(a1 + 6304));
}
}
}
return v5;
}Referenced by:
MiGetPage