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