PsGetProcessEnclaveModuleInfo

INT64 __fastcall PsGetProcessEnclaveModuleInfo(INT64 a1, CHAR **a2, UINT64 *a3){
  _ETHREAD *CurrentThread; 
  int EnclaveModuleList; 
  unsigned int v6; 
  _DEVICE_OBJECT *PoolWithTag; 
  INT64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 *v11; 
  __int64 v12; 
  __int64 *i; 
  __int64 v14; 
  __int64 v15; 
  __int64 *v16; 
  __int64 v17; 
  __int64 *j; 
  __int64 v19; 
  _ETHREAD *v20; 
  unsigned int SessionId; 
  char v22; 
  int v23; 
  bool v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  int v27; 
  unsigned int v28; 
  __int64 v29; 
  UINT64 v30; 
  UINT64 v31; 
  int v33; 
  INT64 v34; 
  __int64 v35; 
  __int64 *v36; 
  _QWORD *v37; 
  unsigned int UniqueIdBuffer; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  UniqueIdBuffer = 0;
  EnclaveModuleList = 0;
  v6 = 0;
  PoolWithTag = 0i64;
  --*((_WORD *)CurrentThread + 242);
  v8 = a1 + 2264;
  v34 = a1 + 2264;
  ExAcquirePushLockExclusiveEx(a1 + 2264, 0i64);
  v9 = *(_QWORD *)(a1 + 2248);
  if( v9 )
  {
    v10 = *(_QWORD *)(v9 + 8);
    v11 = (__int64 *)v10;
    v35 = *(_QWORD *)(a1 + 2248);
    v36 = (__int64 *)v10;
    v37 = (_QWORD *)v10;
    while( 1 )
    {
      if( !v11 )
        goto LABEL_8;
      if( (*v11 & 0x8000000000000002ui64) == 0x8000000000000002ui64 )
      {
        v10 = (__int64)v37;
        v11 = v36;
      }
      v12 = *v11;
      if( (*v11 & 1) != 0 )
      {
LABEL_8:
        for( i = (__int64 *)(v10 + 8); ; ++i )
        {
          if( (unsigned __int64)i >= *(_QWORD *)(v9 + 8) + 8 * ((unsigned __int64)*(unsigned int *)(v9 + 4) >> 5) )
          {
            v12 = 0i64;
            goto LABEL_13;
          }
          v12 = *i;
          if( (*i & 1) == 0 )
            break;
        }
        v11 = (__int64 *)*i;
        v37 = i;
        v10 = (__int64)i;
        v36 = (__int64 *)v12;
      }
      else
      {
        v11 = (__int64 *)*v11;
        v36 = (__int64 *)v12;
      }
LABEL_13:
      if( !v12 )
        break;
      ++v6;
    }
    if( v6 )
    {
      PoolWithTag = (_DEVICE_OBJECT *)ExAllocatePoolWithTag(PagedPool, 16i64 * v6, 0x56455350ui64);
      if( PoolWithTag )
      {
        v14 = *(_QWORD *)(a1 + 2248);
        v35 = v14;
        v15 = *(_QWORD *)(v14 + 8);
        v37 = (_QWORD *)v15;
        v16 = (__int64 *)v15;
        v36 = (__int64 *)v15;
        do
        {
          if( !v16 )
            goto LABEL_25;
          if( (*v16 & 0x8000000000000002ui64) == 0x8000000000000002ui64 )
          {
            v15 = (__int64)v37;
            v16 = v36;
          }
          v17 = *v16;
          if( (*v16 & 1) != 0 )
          {
LABEL_25:
            for( j = (__int64 *)(v15 + 8); ; ++j )
            {
              if( (unsigned __int64)j >= *(_QWORD *)(v14 + 8) + 8 * ((unsigned __int64)*(unsigned int *)(v14 + 4) >> 5) )
              {
                v17 = 0i64;
                goto LABEL_30;
              }
              v19 = *j;
              if( (*j & 1) == 0 )
                break;
            }
            v16 = (__int64 *)*j;
            v37 = j;
            v15 = (__int64)j;
            v36 = (__int64 *)v19;
            v17 = v19;
          }
          else
          {
            v16 = (__int64 *)*v16;
            v36 = (__int64 *)v17;
          }
LABEL_30:
          if( !v17 )
            break;
          EnclaveModuleList = MmGetEnclaveModuleList(
                                *(_QWORD *)(v17 + 32),
                                (_QWORD *)PoolWithTag + 2 * UniqueIdBuffer,
                                (UINT64 *)PoolWithTag + 2 * UniqueIdBuffer + 1);
          if( EnclaveModuleList < 0 )
            break;
          ++UniqueIdBuffer;
        }
        while( UniqueIdBuffer < v6 );
        v8 = v34;
      }
      else
      {
        EnclaveModuleList = -1073741801;
      }
    }
  }
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)v8);
  v20 = (_ETHREAD *)KeGetCurrentThread();
  v33 = 0;
  if( (unsigned int)MiGetSystemRegionType(v8) == 1 )
    SessionId = MmGetSessionIdEx(*((_QWORD *)v20 + 23));
  else
    SessionId = -1;
  --*((_WORD *)v20 + 243);
  v22 = ++*((_BYTE *)v20 + 794);
  v23 = (*((char *)v20 + 792) | *((char *)v20 + 870)) ^ 0x3F;
  v24 = !_BitScanReverse((unsigned int *)&v25, v23);
  if( v24 )
    goto LABEL_47;
  while( 1 )
  {
    v26 = *((_QWORD *)v20 + 100) + 96 * v25;
    v23 &= ~(1 << v25);
    if( (*(_BYTE *)(v26 + 26) & 1) != 0
      && (*(_DWORD *)(v26 + 32) & 1) == 0
      && (*(_QWORD *)(v26 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v8 & 0x7FFFFFFFFFFFFFFCi64)
      && *(_DWORD *)(v26 + 40) == SessionId )
    {
      *(_BYTE *)(v26 + 26) &= ~1u;
      if( *(_QWORD *)(v26 + 32) )
        break;
    }
    v24 = !_BitScanReverse((unsigned int *)&v25, v23);
    if( v24 )
      goto LABEL_47;
  }
  if( !v26 )
  {
LABEL_47:
    if( (*((_DWORD *)v20 + 30) & 0x10000) == 0 )
      KeBugCheckEx(0x162u, (ULONG_PTR)v20, v8, SessionId, 0i64);
  }
  else
  {
    *(_BYTE *)(v26 + 32) |= 2u;
    if( *(__int64 *)(v26 + 32) < 0 )
      KiAbEntryRemoveFromTree(v26);
    v27 = *(_DWORD *)(v26 + 88) & 0x1FFFF;
    v28 = *(_DWORD *)(v26 + 88) & 0xFFFE0000;
    *(_BYTE *)(v26 + 25) &= ~1u;
    v33 = v27;
    *(_DWORD *)(v26 + 88) = v28;
    *(_QWORD *)(v26 + 32) = 0i64;
    v29 = (__int64)(v26 - *((_QWORD *)v20 + 100)) / 96;
    if( v22 == 1 )
      *((_BYTE *)v20 + 792) |= 1 << v29;
    else
      _InterlockedOr8((volatile signed __int8 *)v20 + 870, 1 << v29);
  }
  --*((_BYTE *)v20 + 794);
  KiAbThreadRemoveBoosts((ULONG_PTR)v20, v8, (unsigned int *)&v33);
  v24 = (*((_WORD *)v20 + 243))++ == 0xFFFF;
  if( v24 && *((_ETHREAD **)v20 + 19) != (_ETHREAD *)((char *)v20 + 152) )
    KiCheckForKernelApcDelivery();
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( EnclaveModuleList < 0 )
  {
    PsFreeEnclaveModuleInfo(PoolWithTag, (VOID *)UniqueIdBuffer, v30, v31);
  }
  else
  {
    *a2 = (CHAR *)PoolWithTag;
    *(_DWORD *)a3 = v6;
  }
  return(unsigned int)EnclaveModuleList;
}

Referenced by:

DbgkpPostModuleMessages