MiCanDeleteEnclave
NTSTATUS __stdcall MiCanDeleteEnclave(PVOID BugCheckParameter3){
INT64 v1;
INT64 v2;
_ETHREAD *CurrentThread;
void *v6;
volatile signed __int32 *v7;
volatile signed __int32 **v8;
volatile signed __int32 *v9;
volatile signed __int32 ***v10;
NTSTATUS v11;
int v12;
if( (*((_DWORD *)BugCheckParameter3 + 16) & 1) != 0 )
return 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = (void *)*((_QWORD *)BugCheckParameter3 + 9);
PsReferenceVsmEnclave((INT64)v6, v1, v2);
v8 = (volatile signed __int32 **)((char *)BugCheckParameter3 + 80);
if( v7 )
{
v9 = *v8;
if( *((volatile signed __int32 ***)*v8 + 1) != v8
|| (*(_QWORD *)v7 = v9,
*((_QWORD *)v7 + 1) = v8,
*((_QWORD *)v9 + 1) = v7,
*v8 = v7,
*((volatile signed __int32 ***)v7 + 1) != v8)
|| (v10 = (volatile signed __int32 ***)*((_QWORD *)BugCheckParameter3 + 11), *v10 != v8) )
{
__fastfail(3u);
}
*v10 = (volatile signed __int32 **)v7;
*((_QWORD *)v7 + 1) = v10;
*((_QWORD *)BugCheckParameter3 + 11) = (char *)BugCheckParameter3 + 80;
*v8 = (volatile signed __int32 *)v8;
}
else
{
MiFreeEnclaveModules(v8, 0i64);
}
if( PsIsVsmEnclaveTerminated((INT64)v6) )
{
MiUnlockVad((__int64)CurrentThread, (__int64)BugCheckParameter3);
v12 = PsRundownVsmEnclave((INT64)v6);
v11 = v12;
if( v12 < 0 )
KeBugCheckEx(0x1Au, 0x44417ui64, v12, (ULONG_PTR)BugCheckParameter3, *((_QWORD *)BugCheckParameter3 + 9));
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)BugCheckParameter3 + 40, 0i64);
*((_BYTE *)CurrentThread + 1304) |= 0x80u;
if( (*((_BYTE *)BugCheckParameter3 + 48) & 4) != 0 )
v11 = -1073741800;
}
else
{
v11 = -1073740527;
}
PsDereferenceVsmEnclave(v6);
return v11;
}Referenced by:
MiFreeVadRange