MiCreateEnclave

INT64 __fastcall MiCreateEnclave(INT64 a1, UINT64 *a2, INT64 a3, VOID *a4, INT64 a5, UINT64 Size, INT64 a7, UINT64 a8){
  int EnclaveVad; 
  _MMVAD *v11; 
  int v12; 
  void *v13; 
  int VsmEnclave; 
  void **v16; 
  void *P[3]; 
  P[0] = 0i64;
  v16 = P;
  EnclaveVad = MiAllocateEnclaveVad((unsigned int)Size, a4, *a2);
  v11 = (_MMVAD *)P[0];
  v12 = EnclaveVad;
  if( EnclaveVad >= 0 )
  {
    v13 = P[0];
    *a2 = (*((unsigned int *)P[0] + 6) | ((unsigned __int64)*((unsigned __int8 *)P[0] + 32) << 32)) << 12;
    if( (unsigned int)(Size - 16) <= 1 )
    {
      *((_QWORD *)v11 + 11) = (char *)v11 + 80;
      *((_QWORD *)v11 + 10) = (char *)v11 + 80;
      LODWORD(v16) = a8;
      VsmEnclave = MiCreateVsmEnclave(a1, (INT64)v13, (unsigned int)Size, a7, (UINT64)v16);
    }
    else
    {
      VsmEnclave = MiCreateHardwareEnclave(a1, (INT64)v13, a5, (VOID *)a7);
    }
    v12 = VsmEnclave;
  }
  if( v11 )
  {
    if( v12 >= 0 )
      MiUnlockAndDereferenceVad(v11);
    else
      MiDeleteVad(v11, 0i64);
  }
  return(unsigned int)v12;
}

Referenced by:

NtCreateEnclave