MiIsPageTableDeletable
INT64 __stdcall MiIsPageTableDeletable(INT64 rcx0, UINT64 a2){
UINT64 v2;
INT64 v4;
__int64 v5;
__int64 v6;
int v8;
INT64 v9;
UINT64 v10;
INT64 v11;
v2 = a2;
v4 = *(_QWORD *)(rcx0 + 24);
v5 = (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( MiGetLeafVa(v5) > 0x7FFFFFFEFFFFi64 )
{
v11 = MI_READ_PTE_LOCK_FREE(v2);
if( (*((_QWORD *)MmGetPfnDb()
+ 6 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v11) >> 12) & 0xFFFFFFFFFi64)
+ 3) & 0x3FFFFFFFFFFFFFFFi64) != 1 )
return 0i64;
if( (*(_BYTE *)(v4 + 184) & 7) == 1 )
{
if( (*(_BYTE *)rcx0 & 4) != 0 )
MiLockPageTableInternal(v4, v2, 0i64);
else
v2 = 0i64;
v8 = 1;
while( 1 )
{
v9 = MI_READ_PTE_LOCK_FREE(v5);
if( v9 )
{
if( (v9 & 1) == 0 )
break;
}
v5 += 8i64;
if( (v5 & 0xFFF) == 0 )
goto LABEL_15;
}
v8 = 0;
LABEL_15:
if( v2 )
MiUnlockPageTableInternal(v4, v2);
if( !v8 )
return 0i64;
}
}
else
{
v10 = *(_QWORD *)((char *)MmGetPdeBase() + (((((v5 << 25) - v6) >> 16) & 0xFFFFFFE00000ui64) >> 18));
if( (*((_DWORD *)MmGetPfnDb() + 12 * ((v10 >> 12) & 0xFFFFFFFFFi64) + 4) & 0x3FF0000) != 0 )
return 0i64;
}
return 1i64;
}Referenced by:
MiDeleteEmptyPageTable
MiDeleteVa