MiDemotePfnListChain
INT64 __fastcall MiDemotePfnListChain(INT64 a1, INT64 a2){
int v2;
INT64 result;
char *v5;
__int64 v6;
UINT64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
INT64 v10;
unsigned __int8 CurrentIrql;
unsigned int v12;
unsigned __int64 v13;
UINT64 BitsMustBeChanged;
__int64 v15;
char v16;
int v17;
int v18;
v17 = a2;
v2 = a2;
result = (unsigned int)(a2 - 1);
do
{
v5 = *(char **)(a1 + 8 * result);
v6 = (unsigned int)result;
while( !v5 )
{
if( !(_DWORD)v6 )
return result;
v6 = (unsigned int)(v6 - 1);
v5 = *(char **)(a1 + 8i64 * (unsigned int)v6);
}
v7 = MiLargePageSizes[v6];
*(_QWORD *)(a1 + 8 * v6) = *(_QWORD *)v5;
v8 = v7;
if( (_DWORD)v6 == 1 )
{
LODWORD(BitsMustBeChanged) = 1;
MiUpdateLargePageBitMap(
*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v5 + 5) >> 39) & 0x3FFi64)),
(v5 - (char *)MmGetPfnDb()) / 48,
v7,
0i64,
BitsMustBeChanged);
v8 = MiLargePageSizes[v6];
}
v16 = 2 - v6;
v18 = v6 + 1;
v9 = MiLargePageSizes[(unsigned int)(v6 + 1)];
v15 = (unsigned int)(v6 + 1);
v10 = (INT64)&v5[48 * v7];
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v12 = 0;
if( v8 / v9 )
{
v13 = v8 / v9;
do
{
v10 -= 48 * v9;
MiLockPageAtDpc(v10);
if( v9 == 1 )
MiSetResidentPageMemberInPfn(v10, 0i64);
else
*(_BYTE *)(v10 + 39) ^= (v16 ^ *(_BYTE *)(v10 + 39)) & 3;
if( (char *)v10 != v5 )
{
MiSetPfnPageState(v10, 5);
*(_QWORD *)(v10 + 16) = *((_QWORD *)v5 + 2);
}
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
++v12;
*(_QWORD *)v10 = *(_QWORD *)(a1 + 8 * v15);
*(_QWORD *)(a1 + 8 * v15) = v10;
}
while( v12 < v13 );
v2 = v17;
}
__writecr8(CurrentIrql);
result = (unsigned int)(v2 - 1);
}
while( v18 != v2 );
return result;
}Referenced by:
MiCommitExistingVad
MiMakeLargePageTable
MiMapUserLargePages