MiReadyLargePageToFree
NTSTATUS __stdcall MiReadyLargePageToFree(UINT64 a1, INT64 a2, CHAR a3){
UINT64 v4;
__int64 v5;
__int64 v6;
_MMPFN *v7;
_MMPFN *v8;
UINT8 v9;
UINT64 v10;
UINT8 v11;
unsigned __int64 EntireField;
UINT8 v13;
UINT8 v14;
UINT8 v15;
__int64 v16;
v4 = a1;
v5 = 0i64;
v6 = MiLargePageSizes[(unsigned int)a2];
v7 = &MmGetPfnDb()[a1];
v8 = v7;
v9 = MiLockPage(v7);
v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 ^= (v6 ^ v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0) & 0xFFFFFFFFFi64;
MiUnlockPage(v7, v9);
v10 = v4 + v6;
if( v4 >= v4 + v6 )
return 0;
do
{
if( v8->u3.ReferenceCount != 2 )
{
v11 = MiLockPage(v8);
if( v8->u3.ReferenceCount != 2 )
{
v8->u2._bf_0 |= 0x4000000000000000ui64;
MiUnlockPage(v8, v11);
if( (a3 & 4) != 0 )
MiBadRefCount(v8);
goto LABEL_12;
}
MiUnlockPage(v8, v11);
}
EntireField = v8->u4.EntireField;
if( ((EntireField >> 60) & 7) == 3 )
{
v13 = MiLockPage(v8);
MiClearPfnImageVerified(v8, 0xCui64);
MiUnlockPage(v8, v13);
EntireField = v8->u4.EntireField;
}
if( ((EntireField >> 60) & 7) == 1 )
{
v14 = MiLockPage(v8);
v8->u4._bf_0 &= 0x8FFFFFFFFFFFFFFFui64;
MiUnlockPage(v8, v14);
}
++v5;
LABEL_12:
++v8;
++v4;
}
while( v4 < v10 );
if( v5 )
{
if( v5 == v6 )
return 1;
v15 = MiLockPage(v7);
v16 = (v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFFFFi64) - v5;
v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 ^= (v16 ^ v7->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0) & 0xFFFFFFFFFi64;
MiUnlockPage(v7, v15);
if( !v16 )
return 1;
}
return 0;
}Referenced by:
MiFreeLargePageMemory