MiFreeContiguousPages
VOID __stdcall MiFreeContiguousPages(_MI_PARTITION *Partition, UINT64 PageFrameIndex, UINT64 SizeInPages){
UINT64 v4;
UINT64 v5;
INT64 v6;
_MMPFN *v7;
UINT64 v8;
INT64 v9;
UINT64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
unsigned __int64 v14;
v4 = (UINT64)Partition;
v5 = 0i64;
v6 = 0i64;
v7 = &MmGetPfnDb()[(_QWORD)Partition];
do
{
v8 = v5;
v9 = v6;
if( (v4 & 0x1FF) != 0 || PageFrameIndex < 0x200 || !MiResidentPageDangleFree(v4, 1i64) )
{
v14 = MiLockPageInline(v7);
v6 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v7->u4._bf_0 >> 39) & 0x3FF));
if( v9 )
v6 = v9;
--v7->u3.ReferenceCount;
++v5;
if( v7->u3.ReferenceCount != 1 )
v5 = v8;
v7->u2._bf_0 |= 0x4000000000000000ui64;
MiDecrementShareCount(v7);
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
v11 = 48i64;
v12 = -1i64;
v13 = 1i64;
}
else
{
if( !v6 )
v6 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v7->u4._bf_0 >> 39) & 0x3FF));
MiFreeLargePageMemory(v4, v10, 6ui64);
v11 = 24576i64;
v12 = -512i64;
v13 = 512i64;
}
v7 = (_MMPFN *)((char *)v7 + v11);
v4 += v13;
PageFrameIndex += v12;
}
while( PageFrameIndex );
if( v5 )
MiFreeLargePageCharges(v6, v5);
}Referenced by:
MiMapSystemImageWithLargePage
MiRemoveMdlPages
MiUnmapLargeDriver
MmMarkPhysicalMemoryAsBad
MmRemovePhysicalMemory