MiFreeLargePageMemory
NTSTATUS __stdcall MiFreeLargePageMemory(UINT64 PageFrameIndex, UINT64 LargePageIndex, UINT64 EntireRangeIsZeroed){
__int64 v3;
CHAR v4;
__int64 v6;
_MMPFN *v7;
_BOOL4 v8;
PDRIVER_OBJECT v9;
CHAR v10;
_MMPFN *v11;
UINT8 v12;
UINT64 v13;
UINT64 v14;
UINT64 v16;
v3 = (unsigned int)LargePageIndex;
v4 = EntireRangeIsZeroed;
if( (EntireRangeIsZeroed & 2) != 0 )
MiConvertSmallPageRangeToLarge(PageFrameIndex, (unsigned int)LargePageIndex);
v6 = MiLargePageSizes[v3];
v7 = &MmGetPfnDb()[PageFrameIndex];
v8 = (v4 & 1) == 0;
if( (v4 & 1) != 0 && MiColdPageSizeSupported() )
{
MiChangePageHeatImmediate(PageFrameIndex, (unsigned int)v3, 0i64);
MiLockPageInline(v7);
MiSetPfnPageState((INT64)v7, v8 + 5);
MiSetFreeZeroPfnCold(v9, (PVOID)(unsigned int)(v8 + 1));
MiSetPfnPageState((INT64)v7, v10);
MiUnlockPage(v11, v12);
}
v13 = 512i64;
v14 = PageFrameIndex;
if( (unsigned int)v3 <= 1 )
v13 = v6;
if( (unsigned int)v3 > 1 )
v14 = PageFrameIndex & 0xFFFFFFFFFFFFFE00ui64;
LODWORD(v16) = 0;
MiUpdateLargePageBitMap(
*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v7->u4._bf_0 >> 39) & 0x3FF)),
v14,
v13,
0i64,
v16);
if( MiReadyLargePageToFree(PageFrameIndex, (unsigned int)v3, v4) )
return MiFinishLargePageFree((INT64)v7, (v4 & 1) == 0);
else
return 0;
}Referenced by:
MiDecommitLargePoolVa
MiFreeContiguousPages
MiFreeLargePages
MiFreeMdlPageRun
MiFreeSlabEntry