MiMirrorRemoveInactivePages
INT64 __fastcall MiMirrorRemoveInactivePages(INT64 a1, INT64 a2, INT64 a3){
int v3;
_MMPFN *PfnDb;
char *v6;
INT64 v7;
char *v8;
UINT64 v9;
__int64 v10;
UINT8 PteBase;
WCHAR *PteLimit;
UNICODE_STRING *v13;
unsigned __int64 v14;
_MMPFN *v15;
__int64 PfnPageSizeIndex;
UINT64 v17;
__int64 v18;
_MMPFN *v19;
int v21;
unsigned __int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
unsigned __int64 v25;
__int64 v26;
unsigned __int64 v27;
unsigned __int64 v28;
int v29;
v3 = *(_DWORD *)(a1 + 8);
PfnDb = MmGetPfnDb();
v6 = (char *)PfnDb + 48 * a2;
v7 = 0i64;
v8 = &v6[48 * a3];
v9 = 0i64;
v10 = -1i64;
if( v6 >= v8 )
return v7;
PteBase = (unsigned __int8)MmGetPteBase();
PteLimit = (WCHAR *)MmGetPteLimit();
do
{
v13 = (UNICODE_STRING *)*((_QWORD *)v6 + 5);
v14 = 1i64;
if( ((unsigned __int64)v13 & 0x1000000000i64) != 0 )
{
v15 = MiGetBaseResidentPageForBugCheck((_MMPFN *)v6);
v29 = *((_BYTE *)v15 + 34) & 7;
PfnPageSizeIndex = (unsigned int)MiGetPfnPageSizeIndex((INT64)v15);
v19 = MmGetPfnDb();
v14 = MiLargePageSizes[PfnPageSizeIndex]
+ (((v6 - (char *)v19) / 48) & ~(MiLargePageSizes[PfnPageSizeIndex] - 1))
- (v6 - (char *)v19) / 48;
if( v14 > (v8 - v6) / 48 )
v14 = (v8 - v6) / 48;
if( (v29 & 0xFFFFFFFA) == 0 && v29 != 4
|| v18 == 1
|| (v3 & 0x40) != 0 && v17 && MiGetLeafVa(v17) <= 0xFFFF800000000000ui64 )
{
goto LABEL_12;
}
}
else
{
if( (v6[34] & 7) != 6 )
goto LABEL_13;
LOBYTE(v21) = MI_PFN_IS_PROTO((UNICODE_STRING *)v6, v13, PteBase, PteLimit);
if( v21
|| ((v22 >> 60) & 7) == 1
|| (*((_QWORD *)v6 + 3) & 0x3FFFFFFFFFFFFFFFi64) != 0 && (v22 & 0xFFFFFFFFFi64) == 0xFFFFFFFFDi64 )
{
goto LABEL_12;
}
if( (v3 & 0x40) != 0 )
{
v27 = v26 | *((_QWORD *)v6 + 1);
if( !*((_QWORD *)v6 + 1) )
v27 = 0i64;
if( v27 >= v23 && v27 <= v24 )
{
v28 = (__int64)((v27 << 25) - (v23 << 25)) >> 16;
if( (v28 < v23 || v28 > v24) && v28 <= v25 )
{
LABEL_12:
PfnDb = MmGetPfnDb();
LABEL_13:
if( !v9 )
v10 = (v6 - (char *)PfnDb) / 48;
v9 += v14;
goto LABEL_16;
}
}
}
}
if( v9 )
{
v7 += v9;
MiMirrorOmitPagesFromCopy(*(_QWORD *)a1, v10, v9);
v9 = 0i64;
}
LABEL_16:
PteBase = (unsigned __int8)MmGetPteBase();
v6 += 48 * v14;
PteLimit = (WCHAR *)MmGetPteLimit();
PfnDb = MmGetPfnDb();
}
while( v6 < v8 );
if( v9 )
{
v7 += v9;
MiMirrorOmitPagesFromCopy(*(_QWORD *)a1, v10, v9);
}
return v7;
}Referenced by:
MiMirrorReduceBlackToActiveAndPrivatePages