MiFreePageFileHashPfns

VOID __stdcall MiFreePageFileHashPfns(_MI_PARTITION *Partition){
  UINT64 v1; 
  volatile unsigned int NumberOfPagingFiles; 
  _MMPAGING_FILE **PagingFile; 
  __int64 v4; 
  _MMPFN *v5; 
  _MMPFN *v6; 
  _MMPFN *bf_0; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  struct _KPRCB *CurrentPrcb; 
  __int64 CachedResidentAvailable; 
  bool v12; 
  signed __int32 v13; 

  v1 = 0i64;
  NumberOfPagingFiles = Partition->Vp.NumberOfPagingFiles;
  if( NumberOfPagingFiles )
  {
    PagingFile = Partition->Vp.PagingFile;
    v4 = NumberOfPagingFiles;
    do
    {
      if( LOWORD((*PagingFile)->PfnsToFree.Alignment) )
      {
        RtlpInterlockedFlushSList();
        v6 = v5;
        if( v5 )
        {
          do
          {
            bf_0 = (_MMPFN *)v6->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
            v8 = MiLockPageInline(v6);
            MiFreePageFileHashPfn(v6 - MmGetPfnDb());
            _InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
            __writecr8(v8);
            ++v1;
            v6 = bf_0;
          }
          while( bf_0 );
        }
      }
      ++PagingFile;
      --v4;
    }
    while( v4 );
    if( v1 )
    {
      MiReturnCommit(Partition, v1);
      v9 = v1;
      if( Partition == &Irp )
      {
        CurrentPrcb = KeGetCurrentPrcb();
        CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
        if( (_DWORD)CachedResidentAvailable != -1 )
        {
          if( v1 + CachedResidentAvailable <= 0x100 )
          {
            do
            {
              if( v1 >= 0x80000 )
                break;
              v13 = _InterlockedCompareExchange(
                      (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                      CachedResidentAvailable + v1,
                      CachedResidentAvailable);
              v12 = (_DWORD)CachedResidentAvailable == v13;
              LODWORD(CachedResidentAvailable) = v13;
              if( v12 )
                goto LABEL_23;
            }
            while( v13 != -1 && v1 + v13 <= 0x100 );
          }
          if( (int)CachedResidentAvailable > 192
            && (_DWORD)CachedResidentAvailable != -1
            && (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
                                                    (volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
                                                    192,
                                                    CachedResidentAvailable) )
          {
            v9 = v1 + (int)CachedResidentAvailable - 192;
          }
        }
      }
      if( v9 )
        _InterlockedExchangeAdd64((volatile signed __int64 *)&Partition->Vp.ResidentAvailablePages, v9);
LABEL_23:
      _InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 839, -(__int64)v1);
    }
  }
}

Referenced by:

MiDeletePagefile
MiScanPagefiles