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