MiFillNoReservationCluster
NTSTATUS __stdcall MiFillNoReservationCluster(_MI_PARTITION *Partition, UINT64 *Page, UINT64 ClusterSize){
_MMPFNLIST *p_ModifiedPageListNoReservation;
unsigned int v6;
UINT64 Flink;
_MMPFN *v8;
_UNICODE_STRING *v9;
unsigned __int64 v10;
UINT8 v11;
wchar_t *v12;
int v13;
_MMPTE *v14;
_MI_RESAVAIL_CHARGE v15;
INT64 *v17;
UINT64 v18;
UINT64 v19;
unsigned int Flags;
unsigned int v21;
v21 = ClusterSize;
if( !Partition->Store.Registered
|| (p_ModifiedPageListNoReservation = &Partition->PageLists.ModifiedPageListByReservation[Partition->Store.VirtualPageFileNumber],
!p_ModifiedPageListNoReservation->Total) )
{
p_ModifiedPageListNoReservation = &Partition->PageLists.ModifiedPageListNoReservation;
}
v6 = 0;
Flags = 1;
do
{
Flink = p_ModifiedPageListNoReservation->Flink;
if( Flink == 0xFFFFFFFFFi64 )
break;
v8 = &MmGetPfnDb()[Flink];
v10 = MiLockPageInline(v8);
if( Flink != p_ModifiedPageListNoReservation->Flink
|| Partition->Modwriter.PagefileReservationsEnabled
&& (LOBYTE(v13) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v8, v9, v11, v12), v13)
&& ((v8->u4._bf_0 & 0x1000000000i64) != 0 || (__int64)v8->ListEntry.Blink <= 0)
&& MiSufficientAvailablePages((INT64)Partition, 0xA0ui64)
&& (v14 = (_MMPTE *)(v8->PteLong | 0x8000000000000000ui64),
_InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64),
__writecr8(v10),
MiReservePageFileSpace(Partition, v14, 0i64),
v10 = MiLockPageInline(v8),
Flink != p_ModifiedPageListNoReservation->Flink) )
{
_InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v10);
}
else
{
v15 = MiReferencePageForModifiedWrite(v8, Flags);
_InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8((unsigned __int8)v10);
if( v15 == MiChargeFailed )
break;
Flags &= ~1u;
++v6;
*Page++ = Flink;
if( v15 == MiChargedGlobalNowLow && v6 >= 0x10 )
break;
}
}
while( v6 < v21 );
if( v6 > 1 )
qsort((UINT64)&Page[-v6], v6, 8ui64, (INT64)MiModifiedWriterNoReservationSort, v17, v18, v19);
return v6;
}Referenced by:
MiGatherPagefilePages