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