MiDeleteEnclavePage
VOID __stdcall MiDeleteEnclavePage(_MMPTE *PointerPte, _MI_TB_FLUSH_LIST *FlushList){
int v2;
UINT64 v4;
UINT64 v5;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v6;
__int64 v7;
int v8;
_MMPFN *v9;
UINT8 v10;
char v11;
unsigned __int64 v12;
UINT64 EntireField;
__int64 v14;
UINT64 v15;
UINT64 v16;
UINT64 v17;
v2 = (int)FlushList;
LODWORD(v4) = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
v17 = v4;
v5 = v4;
MiPteInShadowRange((UINT64)&v17);
v6.Long = ZeroPte.u.Long;
v7 = (v5 >> 12) & 0xFFFFFFFFFi64;
LOBYTE(v8) = MiPteInShadowRange((UINT64)PointerPte);
if( v8 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
v6.Long = ZeroPte.u.Long | 0x8000000000000000ui64;
PointerPte->u.Long = v6.Long;
if( v2 )
MiUpdateAwePageTable(
(UINT64)MmGetPteBase() + (((unsigned __int64)PointerPte >> 9) & 0x7FFFFFFFF8i64),
-1i64,
0xFFFFFFFFi64);
v9 = &MmGetPfnDb()[v7];
v10 = MiLockPageInline(v9);
v11 = *(_BYTE *)(&v9->u3 + 1) & 0xEF;
v12 = v10;
v9->u2._bf_0 |= 0x4000000000000000ui64;
*((_BYTE *)&v9->u3 + 2) = v11;
EntireField = v9->u2.EntireField;
v9->u3.ReferenceCount = 0;
v14 = EntireField ^ ((EntireField - 1) ^ EntireField) & 0x3FFFFFFFFFFFFFFFi64;
v9->u2._bf_0 = v14;
MiInsertPageInFreeOrZeroedList(v7, 0x100ui64, v14, EntireField, v15, v16);
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
}Referenced by:
MiDecommitHardwareEnclavePages
MiDeleteEnclavePages