MiReadyLargePageToFree
INT64 __fastcall MiReadyLargePageToFree(UINT64 a1, INT64 a2, CHAR a3){
UINT64 v4;
__int64 v5;
__int64 v6;
_MMPFN *v7;
UINT64 v8;
UINT8 v9;
UINT64 v10;
UINT8 v11;
UINT64 v12;
unsigned __int64 v13;
UINT8 v14;
UINT8 v15;
UINT8 v16;
__int64 v17;
v4 = a1;
v5 = 0i64;
v6 = MiLargePageSizes[(unsigned int)a2];
v7 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * a1);
v8 = (UINT64)v7;
v9 = MiLockPage((INT64)v7);
*(_QWORD *)v7 ^= (v6 ^ *(_QWORD *)v7) & 0xFFFFFFFFFi64;
MiUnlockPage(v7, v9);
v10 = v4 + v6;
if( v4 >= v4 + v6 )
return 0i64;
do
{
if( *(_WORD *)(v8 + 32) != 2 )
{
v11 = MiLockPage(v8);
if( *(_WORD *)(v8 + 32) != 2 )
{
*(_QWORD *)(v8 + 24) |= 0x4000000000000000ui64;
MiUnlockPage((_MMPFN *)v8, v11);
if( (a3 & 4) != 0 )
MiBadRefCount((_MMPFN *)v8, v12);
goto LABEL_12;
}
MiUnlockPage((_MMPFN *)v8, v11);
}
v13 = *(_QWORD *)(v8 + 40);
if( ((v13 >> 60) & 7) == 3 )
{
v14 = MiLockPage(v8);
MiClearPfnImageVerified(v8, 12);
MiUnlockPage((_MMPFN *)v8, v14);
v13 = *(_QWORD *)(v8 + 40);
}
if( ((v13 >> 60) & 7) == 1 )
{
v15 = MiLockPage(v8);
*(_QWORD *)(v8 + 40) &= 0x8FFFFFFFFFFFFFFFui64;
MiUnlockPage((_MMPFN *)v8, v15);
}
++v5;
LABEL_12:
v8 += 48i64;
++v4;
}
while( v4 < v10 );
if( v5 )
{
if( v5 == v6 )
return 1i64;
v16 = MiLockPage((INT64)v7);
v17 = (*(_QWORD *)v7 & 0xFFFFFFFFFi64) - v5;
*(_QWORD *)v7 ^= (v17 ^ *(_QWORD *)v7) & 0xFFFFFFFFFi64;
MiUnlockPage(v7, v16);
if( !v17 )
return 1i64;
}
return 0i64;
}Referenced by:
MiFreeLargePageMemory