MiFreeSmallPageFromMdl
NTSTATUS __stdcall MiFreeSmallPageFromMdl(UINT64 PageFrameIndex, UINT64 Flags){
char v2;
signed __int64 v3;
_MMPFN *v5;
_BOOL8 v6;
unsigned __int64 v7;
UINT64 v8;
bool v9;
int v10;
unsigned __int64 v11;
UINT64 v12;
_QWORD *v13;
unsigned __int64 v14;
UINT64 BitsMustBeChanged;
UINT64 BitsMustBeChangeda;
UINT64 v18;
v2 = Flags;
v3 = 48 * PageFrameIndex;
v5 = &MmGetPfnDb()[PageFrameIndex];
v6 = 0i64;
v7 = MiLockPageInline(v5);
LODWORD(BitsMustBeChanged) = 0;
v8 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v5->u4._bf_0 >> 39) & 0x3FF));
MiUpdateLargePageBitMap(v8, PageFrameIndex, 1ui64, 0i64, BitsMustBeChanged);
v5->u2._bf_0 &= 0xC000000000000000ui64;
v9 = v5->u3.ReferenceCount == 2;
v5->u3.ReferenceCount -= 2;
if( v9 )
{
LOBYTE(v10) = MiIsPfnFromSlabAllocation((INT64)v5);
if( !v10 )
v6 = (*((_BYTE *)&v5->u3 + 3) & 0x40) == 0;
if( (v2 & 1) != 0 )
{
v12 = 1i64;
*((_BYTE *)&v5->u3 + 2) &= ~0x10u;
}
else
{
v13 = (_QWORD *)*(&stru_140C4DB30 + 530);
if( *(&stru_140C4DB30 + 530) && (((unsigned __int64)v5->u4._bf_0 >> 60) & 7) == 1 )
{
v14 = v3 / 48;
while( v13 )
{
v11 = v13[3];
if( v14 < v11 )
{
v13 = (_QWORD *)*v13;
}
else
{
if( v14 - v11 < v13[4] )
{
v12 = 256i64;
goto LABEL_16;
}
v13 = (_QWORD *)v13[1];
}
}
}
v12 = 2i64;
}
LABEL_16:
MiInsertPageInFreeOrZeroedList(PageFrameIndex, v12, v11, 0i64, BitsMustBeChangeda, v18);
}
else
{
*((_BYTE *)&v5->u3 + 2) |= 7u;
v5->u2._bf_0 |= 0x4000000000000000ui64;
}
_InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v7);
if( v6 )
MiFreeLargePageCharges(v8, v6);
return v6;
}Referenced by:
MiFreeMdlPageRun
MmFreeSecureKernelPages