PsInitializeVsmEnclave

__int64 __fastcall PsInitializeVsmEnclave(
        __int64 a1,
        _DWORD *a2,
        unsigned int a3,
        VOID **a4,
        UINT64 *RemainingTargetSidBufferSize){
  _ETHREAD *CurrentThread; 
  _QWORD *PoolWithQuotaTag; 
  _EX_PUSH_LOCK *v11; 
  int v12; 
  NTSTATUS v13; 
  __int64 v14; 
  _QWORD *v16; 
  _QWORD *v17; 
  __int64 v18; 
  _QWORD *v19; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  PoolWithQuotaTag = 0i64;
  --CurrentThread->Tcb.KernelApcDisable;
  v11 = (_EX_PUSH_LOCK *)(a1 + 48);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(a1 + 48), 0i64);
  v12 = *(_DWORD *)(a1 + 44);
  if( v12 )
  {
    if( v12 == 1 )
      v13 = -1073740528;
    else
      v13 = -1073740526;
    goto LABEL_19;
  }
  if( *(_BYTE *)(a1 + 76) )
  {
    LODWORD(v14) = 0;
LABEL_12:
    v13 = VslInitializeEnclave(*(_QWORD *)(a1 + 24), a1 + 80, (INT64)a2, a3, a4, RemainingTargetSidBufferSize);
    if( v13 >= 0 )
    {
      if( !*(_BYTE *)(a1 + 76) )
      {
        *(_DWORD *)(a1 + 72) = v14;
        *PoolWithQuotaTag = 0i64;
        if( (unsigned int)v14 > 1 )
        {
          v16 = PoolWithQuotaTag + 5;
          v17 = PoolWithQuotaTag;
          v18 = (unsigned int)(v14 - 1);
          do
          {
            *v16 = v17;
            v17 += 5;
            v16 += 5;
            --v18;
          }
          while( v18 );
        }
        *(_QWORD *)(a1 + 120) = PoolWithQuotaTag;
        v19 = &PoolWithQuotaTag[5 * (unsigned int)(v14 - 1)];
        PoolWithQuotaTag = 0i64;
        *(_QWORD *)(a1 + 128) = v19;
      }
      *(_DWORD *)(a1 + 44) = 1;
      *(_QWORD *)(a1 + 64) = a1 + 56;
      v13 = 0;
      *(_QWORD *)(a1 + 56) = a1 + 56;
    }
    goto LABEL_19;
  }
  if( a3 != 8 || *a2 != 8 )
    return 3221225476i64;
  v14 = (unsigned int)a2[1];
  PoolWithQuotaTag = ExAllocatePoolWithQuotaTag((POOL_TYPE)9, 40 * v14, 0x74457350ui64);
  if( PoolWithQuotaTag )
    goto LABEL_12;
  v13 = -1073741670;
LABEL_19:
  if( (_InterlockedExchangeAdd64(&v11->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v11);
  KeAbPostRelease(v11);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( PoolWithQuotaTag )
    ExFreePoolWithTag(PoolWithQuotaTag, 0);
  return(unsigned int)v13;
}

Referenced by:

MiInitializeVsmEnclave