MiFreeMdlPageRun
UINT64 __stdcall MiFreeMdlPageRun(UINT64 BasePage, UINT64 PageCount, UINT64 Flags){
UINT64 v3;
int v4;
UINT64 v5;
unsigned int v6;
UINT64 v7;
__int64 v9;
unsigned __int64 v10;
UINT64 v11;
UINT64 v13;
v3 = -1i64;
v4 = Flags & 1;
v5 = 0i64;
v6 = Flags;
v7 = PageCount;
while( v7 )
{
if( (BasePage & 0xF) == 0 )
{
v9 = (KeFeatureBits & 0x2000000000i64) == 0;
while( 1 )
{
v10 = MiLargePageSizes[v9];
if( ((v10 - 1) & BasePage) == 0
&& v7 >= v10
&& (unsigned int)MiResidentPageDangleFree(BasePage, (unsigned int)v9) )
{
break;
}
v9 = (unsigned int)(v9 + 1);
if( (unsigned int)v9 >= 3 )
goto LABEL_10;
}
v5 += MiFreeLargePageMemory(BasePage, v11, (unsigned int)(v4 + 6));
BasePage += v10;
v7 -= v10;
if( (unsigned int)v9 < 3 )
continue;
}
LABEL_10:
if( v3 != (BasePage & 0xFFFFFFFFFFFFFE00ui64) )
{
v3 = BasePage & 0xFFFFFFFFFFFFFE00ui64;
LODWORD(v13) = 0;
MiUpdateLargePageBitMap(
*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)MmGetPfnDb() + 6 * BasePage + 5) >> 39) & 0x3FFi64)),
BasePage & 0xFFFFFFFFFFFFFE00ui64,
0x200ui64,
0i64,
v13);
}
v5 += MiFreeSmallPageFromMdl(BasePage++, v6);
--v7;
}
return v5;
}Referenced by:
MiAllocatePartitionPhysicalPages
MiDeleteAweInfoPages
MiFreePagesFromMdl
MiFreePartitionPageRun