MiCreateVsmEnclave

INT64 __fastcall MiCreateVsmEnclave(INT64 a1, INT64 a2, INT64 a3, INT64 a4, UINT64 arg20){
  ULONG_PTR *v7; 
  int v8; 
  _BYTE *v9; 
  INT64 a6; 
  INT64 v11; 
  bool a5; 
  int v13; 
  INT64 v14; 
  INT64 result; 
  UINT64 a7; 
  MiGetProcessPartition((_EPROCESS *)a1);
  if( v7 == &MiSystemPartition )
    v11 = 0i64;
  else
    v11 = v7[22];
  a5 = v8 == 17;
  v13 = 0;
  if( (unsigned int)arg20 >= 4 && (*v9 & 1) != 0 )
    v13 = 1;
  v14 = (*(unsigned int *)(a2 + 24) | ((unsigned __int64)*(unsigned __int8 *)(a2 + 32) << 32)) << 12;
  LODWORD(a7) = arg20;
  result = PsCreateVsmEnclave(
             a1,
             v11,
             v14,
             (((*(unsigned int *)(a2 + 28) | ((unsigned __int64)*(unsigned __int8 *)(a2 + 33) << 32)) << 12) | 0xFFF)
           - v14
           + 1,
             a5,
             a6,
             a7,
             a2 + 72);
  if( (int)result >= 0 )
  {
    if( v13 )
    {
      *(_DWORD *)(a2 + 64) |= 4u;
      _InterlockedAdd((volatile signed __int32 *)(*(_QWORD *)(a1 + 1680) + 296i64), 1u);
    }
    return 0i64;
  }
  return result;
}

Referenced by:

MiCreateEnclave