PspSelectVsmEnclaveByNumber

INT64 __fastcall PspSelectVsmEnclaveByNumber(INT64 a1, INT64 a2, INT64 *a3){
  _ETHREAD *CurrentThread; 
  INT64 v7; 
  INT64 *v8; 
  __int64 v9; 
  int v10; 
  __int64 v11; 
  INT64 v12; 
  __int64 v13; 
  INT64 v15; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v7 = 0i64;
  --*((_WORD *)CurrentThread + 242);
  v8 = (INT64 *)(a1 + 2264);
  ExAcquirePushLockSharedEx(a1 + 2264, 0i64);
  v9 = *(_QWORD *)(a1 + 2248);
  if( v9 )
  {
    v10 = *(_DWORD *)(v9 + 4) >> 5;
    v11 = -1i64 << (*(_BYTE *)(v9 + 4) & 0x1F);
    v12 = a2 & v11;
    if( !v10 )
      goto LABEL_13;
    v15 = a2 & v11;
    v13 = *(_QWORD *)(v9 + 8)
        + 8i64
        * ((37
          * (BYTE6(v15)
           + 37
           * (BYTE5(v15)
            + 37
            * (BYTE4(v15)
             + 37 * (BYTE3(v15) + 37 * (BYTE2(v15) + 37 * (BYTE1(v15) + 37 * ((unsigned __int8)v12 + 11623883)))))))
          + HIBYTE(v15)) & (unsigned int)(v10 - 1));
    while( 1 )
    {
      v13 = *(_QWORD *)v13;
      if( (v13 & 1) != 0 )
        break;
      if( v12 == (v11 & *(_QWORD *)(v13 + 8)) )
        goto LABEL_8;
    }
  }
  v13 = 0i64;
LABEL_8:
  if( v13 )
  {
    v7 = v13;
    if( *(_DWORD *)(v13 + 40) )
    {
      if( _InterlockedIncrement64((volatile signed __int64 *)(v13 + 16)) <= 1 )
        __fastfail(0xEu);
    }
    else
    {
      v7 = 0i64;
    }
  }
LABEL_13:
  if( _InterlockedCompareExchange64(v8, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(v8);
  KeAbPostRelease(v8);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( !v7 )
    return 3221225480i64;
  *a3 = v7;
  return 0i64;
}

Referenced by:

PsCallEnclave