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