MiChangePageAttributeBatch
VOID __stdcall MiChangePageAttributeBatch(
_MMPFN *PfnChain,
_MI_PFN_CACHE_ATTRIBUTE NewCacheAttribute,
_MMPTE OriginalPteValue){
_MMPFN *v5;
UINT8 v6;
unsigned int v7;
_MMPFN *Long;
int v9;
int v10;
int v11;
unsigned int v12;
char v13;
unsigned int v14;
int v15;
_MMPFN **p_Long;
_MMPFN *v17;
char v18;
int v19;
if( PfnChain )
{
v5 = PfnChain;
v6 = 17;
do
{
v7 = 0;
Long = v5;
v19 = 0;
v9 = 1;
do
{
v10 = v9;
if( v7 >= 0x1000 )
break;
if( v7 )
{
if( _interlockedbittestandset64((volatile signed __int32 *)&Long->u2, 0x3Fui64) )
break;
}
else
{
v6 = MiLockPageInline(Long);
}
v9 = 0;
if( (*(_BYTE *)(&Long->u3 + 1) & 0xC0) == 0xC0 )
v9 = v10;
MiAbortCombineScan(Long);
Long = (_MMPFN *)Long->OriginalPte.u.Long;
++v7;
}
while( Long );
if( v9 || (MiFlushEntireTbDueToAttributeChange(), v7 < *(&stru_140C4DB30 + 71)) || NewCacheAttribute == MiCached )
{
v11 = 0;
}
else
{
++*(&stru_140C4DB30 + 69);
KeInvalidateAllCaches();
v11 = 1;
v19 = 1;
}
v15 = 0;
v17 = v5;
v18 = (_BYTE)NewCacheAttribute << 6;
do
{
v12 = *((unsigned __int8 *)&v17->u3 + 2);
v13 = v18 | v12 & 0x3F;
v14 = v12 >> 6;
*((_BYTE *)&v17->u3 + 2) = v13;
if( !v11 && !v9 && NewCacheAttribute != MiCached && v14 != NewCacheAttribute && v14 == 1 )
{
++*(&stru_140C4DB30 + 70);
MiFlushCacheForAttributeChange(v17 - MmGetPfnDb(), 1ui64, NewCacheAttribute);
}
v17->u2._bf_0 &= 0xF0FFFFFFFFFFFFFFui64;
++v15;
_InterlockedAnd64(&v17->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( v15 == v7 )
{
__writecr8(v6);
p_Long = (_MMPFN **)&v17->OriginalPte.u.Long;
v17 = 0i64;
v5 = *p_Long;
}
else
{
p_Long = (_MMPFN **)&v17->OriginalPte.u.Long;
v17 = (_MMPFN *)v17->OriginalPte.u.Long;
}
if( OriginalPteValue.u.Long != -1i64 )
*p_Long = (_MMPFN *)OriginalPteValue.u.Long;
v18 = (_BYTE)NewCacheAttribute << 6;
v11 = v19;
}
while( v17 );
}
while( v5 );
}
}Referenced by:
MiChangeAwePageAttributes
MiConvertContiguousPages
MiGetPageChain
MiInitializeMdlOneNodeBatchPages
MiPerformFinalZeroing
MiSwitchToTransition