MiExtendPagingFiles
VOID __stdcall MiExtendPagingFiles(_MMPAGE_FILE_EXPANSION *PageExpand){
_MI_PARTITION *Partition;
unsigned __int64 RequestedExpansionSize;
__int64 PageFileNumber;
unsigned int NumberOfPagingFiles;
_MMPAGING_FILE *v6;
UINT64 v7;
unsigned __int64 v8;
_BOOL4 v9;
volatile unsigned __int64 TotalCommittedPages;
unsigned __int64 TotalCommitLimit;
unsigned __int64 v12;
unsigned __int64 v13;
_MMPAGING_FILE **PagingFile;
__int64 v15;
unsigned int v16;
UINT64 *v17;
__int64 v18;
Partition = PageExpand->Partition;
RequestedExpansionSize = PageExpand->RequestedExpansionSize;
PageFileNumber = PageExpand->u1.Flags.PageFileNumber;
NumberOfPagingFiles = Partition->Vp.NumberOfPagingFiles;
if( !NumberOfPagingFiles )
return;
if( (unsigned int)PageFileNumber < NumberOfPagingFiles )
{
_mm_lfence();
v6 = Partition->Vp.PagingFile[PageFileNumber];
if( v6->MaximumSize - v6->Size < RequestedExpansionSize )
return;
LODWORD(v7) = MiAttemptPageFileExtension(
(_MMPAGING_FILE *)PageExpand,
(UINT64)Partition->Vp.PagingFile[PageFileNumber]);
v8 = v7;
if( v7 && (PageExpand->u1.Flags._bf_3 & 2) != 0 )
MiUpdatePagingFileMinimum(v6, v7);
v9 = (v6->_bf_cc & 0x50) == 0;
goto LABEL_24;
}
v9 = 1;
if( (PageExpand->u1.Flags._bf_3 & 1) == 0 )
{
TotalCommittedPages = Partition->Vp.TotalCommittedPages;
TotalCommitLimit = Partition->Vp.TotalCommitLimit;
v12 = RequestedExpansionSize + TotalCommittedPages + Partition->Commit.SystemCommitReserve;
if( v12 < TotalCommittedPages )
return;
if( v12 <= TotalCommitLimit )
{
PageExpand->ActualExpansion = 1i64;
return;
}
RequestedExpansionSize = v12 - TotalCommitLimit;
}
v13 = 0i64;
PagingFile = Partition->Vp.PagingFile;
v15 = Partition->Vp.NumberOfPagingFiles;
do
{
if( ((*PagingFile)->_bf_cc & 0x50) == 0 )
v13 += (*PagingFile)->MaximumSize - (*PagingFile)->Size;
++PagingFile;
--v15;
}
while( v15 );
if( v13 >= RequestedExpansionSize )
{
v8 = 0i64;
v16 = 0;
v17 = (UINT64 *)Partition->Vp.PagingFile;
do
{
if( (*(_BYTE *)(*v17 + 204) & 0x50) == 0 )
{
LODWORD(v18) = MiAttemptPageFileExtension((_MMPAGING_FILE *)PageExpand, *v17);
v8 += v18;
if( v8 >= RequestedExpansionSize )
break;
}
++v16;
++v17;
}
while( v16 < NumberOfPagingFiles );
LABEL_24:
if( v8 )
{
PageExpand->ActualExpansion = v8;
if( v9 )
MiIncreaseCommitLimits(Partition, v8, 0i64, 0i64, 0i64);
}
}
}Referenced by:
MiProcessDereferenceList