MiGetFileOnlyRanges
CHAR *__stdcall MiGetFileOnlyRanges(INT16 *rcx0, CHAR dl0, _QWORD *a3){
char v3;
UINT8 *v4;
__int64 v5;
__int64 v6;
__int64 v7;
CHAR *AnyMultiplexedVm;
CHAR v11;
UINT8 v12;
INT64 NextNonGapPfnPage;
_MMPFN *PfnDb;
__int64 v15;
unsigned __int64 v16;
UINT64 v17;
UINT64 v18;
unsigned __int64 v19;
__int64 v20;
UINT8 *v21;
UINT8 *v22;
UINT64 v23;
unsigned __int64 v24;
__int64 v25[9];
INT16 v27;
INT64 v28;
v3 = MiFlags;
v4 = 0i64;
*a3 = 0i64;
v5 = 0i64;
v6 = 0i64;
v7 = -1i64;
if( (v3 & 0x30) == 0 )
return 0i64;
v27 = *rcx0;
AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
v25[0] = 0i64;
v28 = (INT64)AnyMultiplexedVm;
LABEL_4:
while( 1 )
{
v11 = MiLockWorkingSetShared((INT64)AnyMultiplexedVm);
v23 = 0i64;
v12 = v11;
NextNonGapPfnPage = MiGetNextNonGapPfnPage((UINT64 *)v25, &v23, v11, 0i64);
MiUnlockWorkingSetShared(v28, v12);
if( !NextNonGapPfnPage )
break;
PfnDb = MmGetPfnDb();
v15 = 48 * ((NextNonGapPfnPage - (__int64)PfnDb) / 48);
v16 = (unsigned __int64)PfnDb + v15;
v24 = (unsigned __int64)PfnDb + v15;
v17 = (UINT64)PfnDb + 48 * ((__int64)(NextNonGapPfnPage + v23 - (_QWORD)PfnDb) / 48);
AnyMultiplexedVm = (CHAR *)v28;
v23 = v17;
if( (unsigned __int64)PfnDb + v15 < v17 )
{
v18 = 16 * v6;
while( 1 )
{
v19 = *(_QWORD *)((char *)MmGetPfnDb() + v15 + 40);
if( (v19 & 0x2000000000000i64) != 0 && ((dl0 & 2) != 0 || ((v19 >> 39) & 0x3FF) == v27) )
{
v20 = v15 / 48;
if( v7 == -1 || v7 + 1 != v20 )
{
if( v6 == v5 )
{
if( v5 )
v5 *= 2i64;
else
v5 = 16i64;
LODWORD(v21) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v22 = v21;
if( !v21 && v4 )
{
ExFreePoolWithTag(v4, 0);
return 0i64;
}
if( v6 )
{
memmove(v21, v4, v18);
ExFreePoolWithTag(v4, 0);
}
v16 = v24;
v4 = v22;
v17 = v23;
}
*(_QWORD *)&v4[v18 + 8] = 4096i64;
++v6;
*(_QWORD *)&v4[v18] = v20 << 12;
v18 += 16i64;
}
else
{
*(_QWORD *)&v4[v18 - 8] += 4096i64;
}
v7 = v15 / 48;
}
v16 += 48i64;
v15 += 48i64;
v24 = v16;
if( v16 >= v17 )
{
AnyMultiplexedVm = (CHAR *)v28;
goto LABEL_4;
}
}
}
}
*a3 = v6;
return(CHAR *)v4;
}Referenced by:
MiGetPhysicalMemoryRanges