MmGetEnclaveModuleList

__int64 __fastcall MmGetEnclaveModuleList(UINT64 a1, _QWORD *a2, unsigned int *a3){
  unsigned int v3; 
  __int64 v6; 
  void *v7; 
  __int64 **v9; 
  unsigned int v10; 
  __int64 **v11; 
  _QWORD *Pool; 
  __int64 *v13; 
  unsigned int v14; 
  __int64 v15; 
  __int64 v16; 
  INT64 v17; 

  v3 = 0;
  LODWORD(v17) = 0;
  LODWORD(v6) = MiObtainReferencedVadEx(a1, 2, &v17);
  v7 = (void *)v6;
  if( !v6 )
    return(unsigned int)v17;
  if( (*(_DWORD *)(v6 + 48) & 0x3100000) != 34603008 || (*(_DWORD *)(v6 + 64) & 1) != 0 )
  {
    v3 = -1073741800;
  }
  else
  {
    v9 = (__int64 **)(v6 + 80);
    v10 = 0;
    v11 = *(__int64 ***)(v6 + 80);
    while( v11 != v9 )
    {
      if( v10 == -1 )
        goto LABEL_10;
      v11 = (__int64 **)*v11;
      ++v10;
    }
    Pool = MiAllocatePool(256i64, 24i64 * v10, 0x4C4D4556ui64);
    if( !Pool )
    {
LABEL_10:
      v3 = -1073741670;
      goto LABEL_16;
    }
    v13 = *v9;
    v14 = 0;
    while( v13 != (__int64 *)v9 )
    {
      v15 = v14++;
      v16 = 3 * v15;
      Pool[v16] = v13[2];
      Pool[v16 + 1] = v13[3];
      LODWORD(Pool[v16 + 2]) = *((_DWORD *)v13 + 9);
      HIDWORD(Pool[v16 + 2]) = *((_DWORD *)v13 + 10);
      v13 = (__int64 *)*v13;
    }
    *a2 = Pool;
    *a3 = v14;
  }
LABEL_16:
  MiUnlockAndDereferenceVadShared(v7);
  return v3;
}

Referenced by:

PsGetProcessEnclaveModuleInfo