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