MiContractPagingFiles
VOID __stdcall MiContractPagingFiles(_MI_PARTITION *Partition){
volatile unsigned int NumberOfPagingFiles;
volatile unsigned int v3;
_MMPAGING_FILE **PagingFile;
_MMPAGING_FILE *v5;
unsigned __int64 v6;
if( MiOkToShrinkPageFiles(Partition->Vp.TotalCommittedPages, Partition->Vp.TotalCommitLimit) )
{
NumberOfPagingFiles = Partition->Vp.NumberOfPagingFiles;
v3 = 0;
if( NumberOfPagingFiles )
{
PagingFile = Partition->Vp.PagingFile;
do
{
v5 = *PagingFile;
if( ((*PagingFile)->_bf_cc & 0x50) == 0 && v5->Size != v5->MinimumSize && v5->FreeSpace > 0x4000 )
break;
++v3;
++PagingFile;
}
while( v3 < NumberOfPagingFiles );
}
if( v3 != NumberOfPagingFiles )
{
v6 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&Partition->Segments.SegmentListLock);
if( Partition->Modwriter.PageFileContract.RequestedExpansionSize == -1i64 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&Partition->Segments.SegmentListLock);
__writecr8(v6);
}
else
{
Partition->Modwriter.PageFileContract.Segment = 0i64;
Partition->Modwriter.PageFileContract.u1.Flags._bf_3 |= 0x10u;
Partition->Modwriter.PageFileContract.Partition = Partition;
Partition->Modwriter.PageFileContract.RequestedExpansionSize = -1i64;
MiQueuePageFileExtension(&Partition->Modwriter.PageFileContract, 0i64);
}
}
}
}Referenced by:
MmDeleteProcessAddressSpace