MiCanDeleteEnclave
NTSTATUS __stdcall MiCanDeleteEnclave(PVOID BugCheckParameter3){
_ETHREAD *CurrentThread;
void *v4;
INT32 *v5;
INT32 **v6;
INT32 *v7;
INT32 ***v8;
NTSTATUS v9;
NTSTATUS v10;
if( (*((_DWORD *)BugCheckParameter3 + 16) & 1) != 0 )
return 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = (void *)*((_QWORD *)BugCheckParameter3 + 9);
PsReferenceVsmEnclave((__int64)v4);
v6 = (INT32 **)((char *)BugCheckParameter3 + 80);
if( v5 )
{
v7 = *v6;
if( *((INT32 ***)*v6 + 1) != v6
|| (*(_QWORD *)v5 = v7, *((_QWORD *)v5 + 1) = v6, *((_QWORD *)v7 + 1) = v5, *v6 = v5, *((INT32 ***)v5 + 1) != v6)
|| (v8 = (INT32 ***)*((_QWORD *)BugCheckParameter3 + 11), *v8 != v6) )
{
__fastfail(3u);
}
*v8 = (INT32 **)v5;
*((_QWORD *)v5 + 1) = v8;
*((_QWORD *)BugCheckParameter3 + 11) = (char *)BugCheckParameter3 + 80;
*v6 = (INT32 *)v6;
}
else
{
MiFreeEnclaveModules(v6, 0i64);
}
if( PsIsVsmEnclaveTerminated((INT64)v4) )
{
MiUnlockVad(CurrentThread, (_MMVAD_SHORT *)BugCheckParameter3);
v10 = PsRundownVsmEnclave((INT64)v4);
v9 = v10;
if( v10 < 0 )
KeBugCheckEx(0x1Au, (PVOID)0x44417, (PVOID)v10, BugCheckParameter3, *((PVOID *)BugCheckParameter3 + 9));
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)BugCheckParameter3 + 5, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 0x80u;
if( (*((_BYTE *)BugCheckParameter3 + 48) & 4) != 0 )
v9 = -1073741800;
}
else
{
v9 = -1073740527;
}
PsDereferenceVsmEnclave(v4);
return v9;
}Referenced by:
MiFreeVadRange