VslCreateEnclave

NTSTATUS __stdcall VslCreateEnclave(
        INT64 rcx0,
        INT64 rdx0,
        INT64 r8_0,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        UINT64 a7,
        CHAR a8,
        INT64 a9){
  NTSTATUS result; 
  int v14; 
  __int64 v15[2]; 
  INT64 v16[10]; 
  INT64 v17[14]; 

  v15[0] = 0i64;
  memset(v17, 0i64, 0x68u);
  memset(v16, 0i64, 0x48u);
  if( !*(_QWORD *)(rdx0 + 992) )
  {
    result = VslCreateSecureProcess(rdx0, r8_0, v15);
    if( result < 0 )
      return result;
    if( _InterlockedCompareExchange64((volatile signed __int64 *)(rdx0 + 992), v15[0], 0i64) )
      VslCloseSecureHandle(v15[0]);
  }
  if( !(_DWORD)a7 || (result = VslpLockPagesForTransfer((INT64)v16, a6, (unsigned int)a7, 0i64, 0), result >= 0) )
  {
    v17[1] = *(_QWORD *)(rdx0 + 992);
    v17[3] = a5;
    v17[5] = v16[0];
    v17[6] = v16[7];
    v17[7] = (unsigned __int8)a8;
    v17[2] = a4;
    v17[4] = rcx0;
    v14 = VslpEnterIumSecureMode(2u, 45, 0i64, (INT64)v17);
    if( v16[0] )
      VslpUnlockPagesForTransfer((INT64 **)v16);
    if( v14 >= 0 )
      *(_QWORD *)a9 = v17[2];
    return v14;
  }
  return result;
}

Referenced by:

PsCreateVsmEnclave