MiChangePageAttributeBatch
void __fastcall MiChangePageAttributeBatch(INT64 a1, _BYTE *a2, INT64 a3){
unsigned int v4;
INT64 v5;
unsigned __int8 v6;
unsigned int v7;
INT64 v8;
int v9;
int v10;
int v11;
unsigned int v12;
char v13;
int v14;
INT64 *v15;
INT64 v16;
int v17;
if( a1 )
{
v4 = (unsigned int)a2;
v5 = a1;
v6 = 17;
do
{
v7 = 0;
v8 = v5;
v17 = 0;
v9 = 1;
do
{
v10 = v9;
if( v7 >= 0x1000 )
break;
if( v7 )
{
if( _interlockedbittestandset64((volatile signed __int32 *)(v8 + 24), 0x3Fui64) )
break;
}
else
{
v6 = MiLockPageInline(v8);
}
v9 = 0;
if( (*(_BYTE *)(v8 + 34) & 0xC0) == 0xC0 )
v9 = v10;
MiAbortCombineScan(v8);
v8 = *(_QWORD *)(v8 + 16);
++v7;
}
while( v8 );
if( v9 || (MiFlushEntireTbDueToAttributeChange(a1, a2), v7 < dword_140C4DC4C) || v4 == 1 )
{
v11 = 0;
}
else
{
++dword_140C4DC44;
KeInvalidateAllCaches();
v11 = 1;
v17 = 1;
}
v14 = 0;
v16 = v5;
LOBYTE(a2) = (_BYTE)v4 << 6;
do
{
v12 = *(unsigned __int8 *)(v16 + 34);
v13 = (unsigned __int8)a2 | v12 & 0x3F;
a1 = v12 >> 6;
*(_BYTE *)(v16 + 34) = v13;
if( !v11 && !v9 && v4 != 1 && (_DWORD)a1 != v4 && (_DWORD)a1 == 1 )
{
++dword_140C4DC48;
MiFlushCacheForAttributeChange((v16 - (__int64)MmGetPfnDb()) / 48, 1i64, v4);
}
*(_QWORD *)(v16 + 24) &= 0xF0FFFFFFFFFFFFFFui64;
++v14;
_InterlockedAnd64((volatile signed __int64 *)(v16 + 24), 0x7FFFFFFFFFFFFFFFui64);
if( v14 == v7 )
{
__writecr8(v6);
v15 = (INT64 *)(v16 + 16);
v16 = 0i64;
v5 = *v15;
}
else
{
v15 = (INT64 *)(v16 + 16);
v16 = *(_QWORD *)(v16 + 16);
}
if( a3 != -1 )
*v15 = a3;
LOBYTE(a2) = (_BYTE)v4 << 6;
v11 = v17;
}
while( v16 );
}
while( v5 );
}
}Referenced by:
MiChangeAwePageAttributes
MiConvertContiguousPages
MiGetPageChain
MiInitializeMdlOneNodeBatchPages
MiPerformFinalZeroing
MiSwitchToTransition