VslCreateEnclave

NTSTATUS __fastcall VslCreateEnclave(
        INT64 a1,
        INT64 a2,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        UINT64 a7,
        CHAR a8,
        INT64 a9){
  NTSTATUS SecureProcess; 
  int v14; 
  _QWORD a3a[2]; 
  INT64 v16[10]; 
  INT64 result[2]; 
  INT64 v18; 
  INT64 v19; 
  INT64 v20; 
  INT64 v21; 
  INT64 v22; 
  __int64 v23; 
  a3a[0] = 0i64;
  memset((INT64)result, 0i64);
  memset((INT64)v16, 0i64);
  if( !*(_QWORD *)(a2 + 992) )
  {
    SecureProcess = VslCreateSecureProcess(a2, a3, a3a);
    if( SecureProcess < 0 )
      return SecureProcess;
    if( _InterlockedCompareExchange64((volatile signed __int64 *)(a2 + 992), a3a[0], 0i64) )
      VslCloseSecureHandle(a3a[0]);
  }
  if( !(_DWORD)a7
    || (SecureProcess = VslpLockPagesForTransfer((INT64)v16, a6, (unsigned int)a7, 0i64, 0), SecureProcess >= 0) )
  {
    result[1] = *(_QWORD *)(a2 + 992);
    v19 = a5;
    v21 = v16[0];
    v22 = v16[7];
    v23 = (unsigned __int8)a8;
    v18 = a4;
    v20 = a1;
    v14 = VslpEnterIumSecureMode(2u, 45, 0i64, (INT64)result);
    if( v16[0] )
      VslpUnlockPagesForTransfer((INT64 **)v16);
    if( v14 >= 0 )
      *(_QWORD *)a9 = v18;
    return v14;
  }
  return SecureProcess;
}

Referenced by:

PsCreateVsmEnclave