MiChangePageAttributeContiguous
NTSTATUS __fastcall MiChangePageAttributeContiguous(INT64 a1, INT64 a2, INT64 a3){
NTSTATUS v3;
_MI_PFN_CACHE_ATTRIBUTE v4;
_MMPFN *v5;
_MMPFN *v6;
unsigned int v7;
_MMPFN *v8;
int v9;
int v10;
unsigned int v11;
unsigned int v12;
char v13;
unsigned int v14;
_MMPFN *v16;
_MMPFN *v17;
UINT8 v18;
int v19;
int v20;
v3 = 1;
v20 = 1;
v4 = (int)a3;
v5 = &MmGetPfnDb()[a1];
v18 = 17;
v6 = &v5[a2];
v17 = v6;
while( v5 < v6 )
{
v19 = 0;
v7 = 0;
v16 = v5;
v8 = v5;
v9 = 1;
if( v5 < v6 )
{
do
{
v10 = v9;
if( v7 >= 0x1000 )
break;
if( v7 )
{
if( _interlockedbittestandset64((volatile signed __int32 *)&v5->u2, 0x3Fui64) )
break;
}
else
{
v18 = MiLockPageInline(v5);
}
v9 = 0;
if( (*(_BYTE *)(&v5->u3 + 1) & 0xC0) == 0xC0 )
v9 = v10;
MiAbortCombineScan(v5);
if( v3 && MiPfnZeroingNeeded(v5, v4) )
v3 = 0;
++v7;
++v5;
}
while( v5 < v6 );
v8 = v16;
v20 = v3;
if( !v9 )
{
MiFlushEntireTbDueToAttributeChange();
if( v7 >= *(&stru_140C4DB30 + 71) && v4 != MiCached )
{
++*(&stru_140C4DB30 + 69);
KeInvalidateAllCaches();
v19 = 1;
}
}
}
v5 = v8;
v11 = 0;
if( v7 )
{
do
{
v12 = *((unsigned __int8 *)&v5->u3 + 2);
v13 = ((_BYTE)v4 << 6) | v12 & 0x3F;
v14 = v12 >> 6;
*((_BYTE *)&v5->u3 + 2) = v13;
if( !v19 && !v9 && v4 != MiCached && v14 != v4 && v14 == 1 )
{
++*(&stru_140C4DB30 + 70);
MiFlushCacheForAttributeChange(v5 - MmGetPfnDb(), 1ui64, v4);
}
MiSetPfnTbFlushStamp(v5, 0i64, 1ui64);
if( v11 < v7 - 1 )
_InterlockedAnd64(&v5->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
++v5;
++v11;
}
while( v11 < v7 );
v6 = v17;
v3 = v20;
}
_InterlockedAnd64(&v5[-1].u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v18);
}
return v3;
}Referenced by:
MiChangePageAttributeLargeFreeZeroPage
MiUnlinkNodeLargePages
MiZeroAndConvertPage