MiFreeSmallPageFromMdl
UINT64 __stdcall MiFreeSmallPageFromMdl(UINT64 PageFrameIndex, UINT64 Flags){
char v2;
signed __int64 v3;
char *v5;
_BOOL8 v6;
unsigned __int64 v7;
UINT64 v8;
bool v9;
UINT64 v10;
_QWORD *v11;
unsigned __int64 v12;
unsigned __int64 v13;
UINT64 BitsMustBeChanged;
v2 = Flags;
v3 = 48 * PageFrameIndex;
v5 = (char *)MmGetPfnDb() + 48 * PageFrameIndex;
v6 = 0i64;
v7 = (unsigned __int8)MiLockPageInline((INT64)v5);
LODWORD(BitsMustBeChanged) = 0;
v8 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v5 + 5) >> 39) & 0x3FFi64));
MiUpdateLargePageBitMap(v8, PageFrameIndex, 1ui64, 0i64, BitsMustBeChanged);
*((_QWORD *)v5 + 3) &= 0xC000000000000000ui64;
v9 = *((_WORD *)v5 + 16) == 2;
*((_WORD *)v5 + 16) -= 2;
if( v9 )
{
if( !MiIsPfnFromSlabAllocation((INT64)v5) )
v6 = (v5[35] & 0x40) == 0;
if( (v2 & 1) != 0 )
{
v10 = 1i64;
v5[34] &= ~0x10u;
}
else
{
v11 = (_QWORD *)qword_140C4EBC0;
if( qword_140C4EBC0 && ((*((_QWORD *)v5 + 5) >> 60) & 7) == 1 )
{
v12 = v3 / 48;
while( v11 )
{
v13 = v11[3];
if( v12 < v13 )
{
v11 = (_QWORD *)*v11;
}
else
{
if( v12 - v13 < v11[4] )
{
v10 = 256i64;
goto LABEL_16;
}
v11 = (_QWORD *)v11[1];
}
}
}
v10 = 2i64;
}
LABEL_16:
MiInsertPageInFreeOrZeroedList(PageFrameIndex, v10);
}
else
{
v5[34] |= 7u;
*((_QWORD *)v5 + 3) |= 0x4000000000000000ui64;
}
_InterlockedAnd64((volatile signed __int64 *)v5 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v7);
if( v6 )
MiFreeLargePageCharges(v8, v6);
return v6;
}Referenced by:
MiFreeMdlPageRun
MmFreeSecureKernelPages