MiDeleteEnclavePage

INT64 __fastcall MiDeleteEnclavePage(UINT64 a1, INT64 a2){
  int v2; 
  UINT64 v4; 
  __int64 v5; 
  char *v6; 
  unsigned __int8 v7; 
  char v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  INT64 result; 
  UINT64 v12; 
  v2 = a2;
  v12 = MI_READ_PTE_LOCK_FREE(a1);
  v4 = v12;
  MiPteInShadowRange((UINT64)&v12);
  v5 = (v4 >> 12) & 0xFFFFFFFFFi64;
  *(_QWORD *)a1 = ZeroPte;
  if( v2 )
    MiUpdateAwePageTable((UINT64)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64), -1i64, 0xFFFFFFFFi64);
  v6 = (char *)MmGetPfnDb() + 48 * v5;
  v7 = MiLockPageInline((INT64)v6);
  v8 = v6[34] & 0xEF;
  v9 = v7;
  *((_QWORD *)v6 + 3) |= 0x4000000000000000ui64;
  v6[34] = v8;
  v10 = *((_QWORD *)v6 + 3);
  *((_WORD *)v6 + 16) = 0;
  *((_QWORD *)v6 + 3) = v10 ^ ((v10 - 1) ^ v10) & 0x3FFFFFFFFFFFFFFFi64;
  MiInsertPageInFreeOrZeroedList(v5, 0x100ui64);
  _InterlockedAnd64((volatile signed __int64 *)v6 + 3, 0x7FFFFFFFFFFFFFFFui64);
  result = (unsigned int)KiIrqlFlags;
  __writecr8(v9);
  return result;
}

Referenced by:

MiDecommitHardwareEnclavePages
MiDeleteEnclavePages