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