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