MiChangeAwePageAttributes
NTSTATUS __stdcall MiChangeAwePageAttributes(INT64 a1, INT64 a2, INT64 a3){
unsigned __int64 v3;
_MI_PFN_CACHE_ATTRIBUTE v4;
INT64 v6;
unsigned __int64 v7;
_MMPTE v9;
_MMPFN *Long;
unsigned __int64 v11;
_MMPTE *p_OriginalPte;
v3 = *(_QWORD *)(a1 + 8);
v4 = (int)a3;
v6 = a2 + 24;
v7 = MiLockPageInline((_MMPFN *)a2);
if( *(_WORD *)(a2 + 32) > 2u
|| (*(_QWORD *)v6 & 0x3FFFFFFFFFFFFFFFi64) != 1
|| (*(_QWORD *)(a2 + 24) & 0x4000000000000000i64) != 0 )
{
_InterlockedAnd64((volatile signed __int64 *)v6, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v7);
return -1073741800;
}
v9.u.Long = *(_QWORD *)(a2 + 16);
_InterlockedAnd64((volatile signed __int64 *)v6, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v7);
Long = 0i64;
v11 = 0i64;
if( v3 )
{
while( *(_WORD *)(v6 + 8) <= 2u && (*(_QWORD *)v6 & 0x4000000000000000i64) == 0 )
{
*(_QWORD *)(v6 - 8) = Long;
++v11;
Long = (_MMPFN *)(v6 - 24);
v6 += 48i64;
if( v11 >= v3 )
goto LABEL_10;
}
while( Long )
{
p_OriginalPte = &Long->OriginalPte;
Long = (_MMPFN *)Long->OriginalPte.u.Long;
p_OriginalPte->u.Long = v9.u.Long;
}
return -1073741800;
}
LABEL_10:
MiChangePageAttributeBatch(Long, v4, v9);
return 0;
}Referenced by:
MiIncrementAweMapCount