MiConvertContiguousPages
INT64 __fastcall MiConvertContiguousPages(UINT64 *a1, INT64 a2, INT64 a3){
unsigned int v4;
unsigned int v5;
UINT64 *v6;
__int64 v7;
UINT64 *v8;
BOOL IsFreeZeroPfnCold;
INT64 v10;
BOOL v11;
unsigned int v12;
UINT64 v13;
INT64 v14;
UINT64 v15;
UINT64 *v16;
INT64 v17;
UINT64 v19;
v19 = 0i64;
v4 = a3;
v5 = 1;
MiSetOriginalPtePfnFromFreeList(&v19);
v6 = 0i64;
v8 = &a1[6 * v7];
if( a1 != v8 )
{
do
{
IsFreeZeroPfnCold = MiIsFreeZeroPfnCold((INT64)a1);
v11 = MiPfnZeroingNeeded((INT64)a1, v4);
v12 = 0;
if( !v11 )
v12 = v5;
v5 = v12;
if( (unsigned int)MiPageAttributeBatchChangeNeeded((INT64)a1, v10) )
{
v13 = *a1 & 0xFFFFFFF000000000ui64;
*a1 = v13;
if( IsFreeZeroPfnCold )
{
v13 |= 2ui64;
*a1 = v13;
}
a1[2] = (UINT64)v6;
v6 = a1;
if( v11 )
*a1 = v13 | 1;
}
else
{
v14 = v19 & -(__int64)v11;
a1[2] = v14;
if( IsFreeZeroPfnCold )
a1[2] = MiUpdatePageFileHighInPte(v14, 4294967293i64);
}
a1 += 6;
}
while( a1 != v8 );
if( v6 )
{
MiChangePageAttributeBatch((INT64)v6, (_BYTE *)v4, -1i64);
do
{
v15 = *v6;
v16 = (UINT64 *)v6[2];
v17 = v19 & -(__int64)((*v6 & 1) != 0);
v6[2] = v17;
if( (v15 & 2) != 0 )
v6[2] = MiUpdatePageFileHighInPte(v17, 4294967293i64);
*v6 = v15 & 0xFFFFFFF000000000ui64;
v6 = v16;
}
while( v16 );
}
}
return v5;
}Referenced by:
MiFindContiguousPages