MiLargeFreePageToMdl
NTSTATUS __stdcall MiLargeFreePageToMdl(UINT64 PageFrameIndex, UINT64 LargePageIndex, UINT64 *MdlPage){
__int64 v3;
__int64 v4;
unsigned int v5;
__int64 v6;
UINT64 v7;
NTSTATUS result;
_MMPFN *v9;
int v10;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v11;
UINT8 v12;
unsigned __int64 v13;
_QWORD *v14;
v4 = v3;
v5 = (unsigned int)MdlPage;
KeGetCurrentIrql();
v6 = MiLargePageSizes[(unsigned int)MdlPage];
v7 = LargePageIndex & ~(v6 - 1);
result = MiTryUnlinkNodeLargePage(PageFrameIndex, v7);
if( result )
{
v9 = &MmGetPfnDb()[v7];
LOBYTE(v10) = MiIsFreeZeroPfnCold((INT64)v9);
if( v10 )
{
MiChangePageHeatImmediate(v7, v5, 1i64);
MiLockPage(v9);
LODWORD(v11.Long) = MiUpdatePageFileHighInPte(
v9->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0,
0i64);
v9->OriginalPte.u = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v11.Long;
MiUnlockPage(v9, v12);
}
MiConvertEntireLargePageToSmall((_KQUEUE *)v9, v5, 0, (_LARGE_INTEGER *)1, 0i64, 0i64);
if( v4 )
{
v13 = ((unsigned __int64)*(unsigned int *)(v4 + 40) >> 12) + 6;
*(_DWORD *)(v4 + 40) += (_DWORD)v6 << 12;
v14 = (_QWORD *)(v4 + 8 * v13);
do
{
*v14++ = v7++;
--v6;
}
while( v6 );
}
return 1;
}
return result;
}Referenced by:
MiTradePage