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