MiDeleteEnclavePages
VOID __stdcall MiDeleteEnclavePages(_MMVAD_SHORT *Vad){
INT64 v1;
int v2;
INT64 v3;
_QWORD *v4;
INT64 v5;
_KTBFLUSH_TYPE v6;
NTSTATUS v7;
void *v8;
_ETHREAD *CurrentThread;
_QWORD *v10;
__int64 v11;
_QWORD *v12;
v2 = *(_DWORD *)(v1 + 64);
v3 = v1;
if( (v2 & 1) == 0 || *(_QWORD *)(v1 + 120) )
{
if( (v2 & 4) != 0 )
{
_InterlockedAdd((volatile signed __int32 *)(Vad[26].VadNode.ParentValue + 296), 0xFFFFFFFF);
v2 = *(_DWORD *)(v1 + 64);
}
if( (v2 & 1) != 0 )
{
if( (v2 & 8) == 0 )
MiTerminateHardwareEnclave((INT64)Vad, v1);
v5 = *(_QWORD *)(v3 + 80);
if( (MI_READ_PTE_LOCK_FREE(v5) & 1) != 0 )
{
v7 = KeRemoveEnclavePage((PVOID)(((v5 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
if( v7 < 0 )
KeBugCheckEx(0x1Au, (PVOID)0x18011544, *(PVOID *)(v3 + 80), (PVOID)v7, 0i64);
MiDeleteEnclavePage(*(_MMPTE **)(v3 + 80), 0i64);
v5 = *(_QWORD *)(v3 + 80);
}
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (_MMPTE *)v5, 1ui64, v6);
v8 = *(void **)(v3 + 88);
if( v8 )
ExFreePoolWithTag(v8, 0);
MiReturnReservedEnclavePages(v3, -1i64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C4DB30 + 537, 0i64);
v10 = (_QWORD *)(v3 + 120);
v11 = *v10;
if( *(_QWORD **)(*v10 + 8i64) != v10 || (v12 = (_QWORD *)v10[1], (_QWORD *)*v12 != v10) )
__fastfail(3u);
*v12 = v11;
*(_QWORD *)(v11 + 8) = v12;
*v10 = 0i64;
if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 537, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 537);
KeAbPostRelease((char *)&stru_140C4DB30 + 4296);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
else
{
v4 = *(_QWORD **)(v1 + 72);
if( v4 )
PsDeleteVsmEnclave((_EX_PUSH_LOCK *)Vad, v4);
}
}
}Referenced by:
MiDeleteAllHardwareEnclaves
MiDeleteVad