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