MiGetNextNonGapPfnPage
INT64 __fastcall MiGetNextNonGapPfnPage(UINT64 *a1, UINT64 *a2, CHAR a3, INT64 r9_0){
UINT64 v4;
UINT64 v5;
_MMPTE *PteBase;
unsigned __int64 v7;
unsigned __int64 v8;
int a5;
CHAR *AnyMultiplexedVm;
UINT64 v11;
UINT64 v12;
unsigned __int64 i;
UINT64 v14;
_MMPTE *v15;
UINT64 v16;
__int64 v17;
UINT64 LeafVa;
__int64 v19;
__int64 v20;
UINT64 v22;
__int64 v23;
__int64 v24;
UINT64 *v25;
unsigned int a6;
CHAR *v27;
int v31;
v31 = r9_0;
v4 = *a1;
v5 = 0i64;
a6 = 0;
PteBase = MmGetPteBase();
if( !v4 )
v4 = (UINT64)PteBase + (((unsigned __int64)MmPfnDatabase >> 9) & 0x7FFFFFFFF8i64);
if( *a2 )
{
v7 = v4 + 8 * (*a2 >> 12);
v8 = (__int64)((v7 << 25) - ((_QWORD)PteBase << 25)) >> 16;
LABEL_5:
v7 -= 8i64;
goto LABEL_6;
}
v8 = (unsigned __int64)MmGetPfnDb() + 0x30000000000i64;
v7 = (unsigned __int64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
if( (v7 & 0xFFF) == 0 )
goto LABEL_5;
LABEL_6:
a5 = (_DWORD)r9_0 != 0 ? 7 : 3;
AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
v27 = AnyMultiplexedVm;
v11 = 0i64;
v12 = 0i64;
i = 0i64;
if( v4 <= v7 )
{
while( 2 )
{
if( v11 )
{
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v11);
v11 = 0i64;
}
MiGetNextPageTable(v4, v7, 0i64, a3, a5, &a6);
v4 = v14;
if( v14 )
{
v15 = MmGetPteBase();
if( !v31 )
v11 = (UINT64)v15 + ((v14 >> 9) & 0x7FFFFFFFF8i64);
if( a6 )
{
v12 = v14;
v16 = v14;
v17 = a6;
do
{
if( v11 )
v11 = (UINT64)v15 + ((v11 >> 9) & 0x7FFFFFFFF8i64);
v16 = (UINT64)v15 + ((v16 >> 9) & 0x7FFFFFFFF8i64);
--v17;
}
while( v17 );
LeafVa = MiGetLeafVa(v16 + 8);
i = LeafVa - MiGetLeafVa(v4);
AnyMultiplexedVm = v27;
v19 = (__int64)(v7 - v4) >> 3;
if( i >> 12 > v19 + 1 )
i = (v19 + 1) << 12;
}
else
{
v22 = v14;
while( !(unsigned int)MiPfnDatabaseVaIsUnique((UINT64 *)v22) )
{
v22 += 8i64;
if( v22 > v7 || (v22 & v23) == 0 )
goto LABEL_33;
}
v12 = v22;
if( v22 )
{
for( i = 4096i64; ; i += v24 )
{
v25 = (UINT64 *)(v22 + 8);
if( (unsigned __int64)v25 > v7
|| ((unsigned __int64)v25 & v23) == 0
|| !(unsigned int)MiPfnDatabaseVaIsUnique(v25) )
{
break;
}
}
goto LABEL_41;
}
LABEL_33:
AnyMultiplexedVm = v27;
v4 = v22;
if( v22 <= v7 )
continue;
}
}
else
{
LABEL_41:
AnyMultiplexedVm = v27;
}
break;
}
}
if( v11 )
MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v11);
if( v12 )
{
v4 = v12 + 8 * (i >> 12);
v20 = (__int64)((v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
v5 = v8 - v20;
if( i + v20 <= v8 )
v5 = i;
}
else
{
v20 = 0i64;
}
*a2 = v5;
*a1 = v4;
return v20;
}Referenced by:
MiFreedUnusedPfnPagesWorker
MiGetFileOnlyRanges