MiDecreaseAvailablePages
UINT64 __stdcall MiDecreaseAvailablePages(
_MI_PARTITION *Partition,
UINT64 NumberOfPages,
UINT64 RemainderPages,
UINT64 Flags){
INT16 v4;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
UINT64 result;
__int64 v12;
v4 = Flags;
if( NumberOfPages == 1 )
{
v9 = _InterlockedDecrement64((volatile signed __int64 *)Partition + 888);
if( v9 == *((_QWORD *)Partition + 646) || v9 == *((_QWORD *)Partition + 647) )
MiUpdateAvailableEvents(Partition);
v7 = v9 + 1;
}
else
{
v7 = _InterlockedExchangeAdd64((volatile signed __int64 *)Partition + 888, -(__int64)NumberOfPages);
v8 = *((_QWORD *)Partition + 647);
v9 = v7 - NumberOfPages;
if( v7 - NumberOfPages <= v8 && v7 > v8 || (v10 = *((_QWORD *)Partition + 646), v9 <= v10) && v7 > v10 )
MiUpdateAvailableEvents(Partition);
}
if( v9 <= 0x420 )
{
v12 = *((_QWORD *)Partition + 856);
if( !v12 || !*(_BYTE *)(v12 + 52) )
MiObtainFreePages(Partition);
if( v9 < 0xA0 && v7 >= 0xA0 && *((_DWORD *)Partition + 290) )
KeSetEvent((PRKEVENT)Partition + 42, 0);
}
if( RemainderPages != -1i64 )
return v9 >= RemainderPages;
LODWORD(result) = MiPageAvailableEx((INT64)Partition, v9, v4);
return result;
}Referenced by:
MiRemoveLowestPriorityStandbyPage
MiReplaceTransitionPage
MiReplenishPageSlist
MiUnlinkNodeLargePageHelper