MiChangePageAttribute
VOID __fastcall MiChangePageAttribute(INT64 a1, INT64 a2, CHAR a3){
CHAR v3;
unsigned int v4;
unsigned __int8 v6;
int v7;
INT64 v8;
INT64 v9;
char v10;
unsigned int v11;
unsigned __int8 CurrentIrql;
int v13[14];
v3 = a3;
v4 = a2;
if( (a3 & 1) != 0 || (struct _KTHREAD *)qword_140C4E448 == KeGetCurrentThread() )
v6 = 17;
else
v6 = MiLockPageInline(a1);
v7 = *(unsigned __int8 *)(a1 + 34) >> 6;
v8 = (a1 - (__int64)MmGetPfnDb()) / 48;
if( (unsigned int)MiPageCombiningActive(0i64) )
{
MiAbortCombineScan(a1);
v10 = *(_BYTE *)(a1 + 34);
v3 = -5;
}
*(_BYTE *)(a1 + 34) = ((_BYTE)v4 << 6) | v10 & 0x3F;
if( v7 != 3 && (v3 & 4) == 0 )
{
if( (v3 & 2) != 0
|| (v9 = *(_BYTE *)(a1 + 31) & 0xF,
_InterlockedOr(v13, 0),
v11 = ((_BYTE)KiTbFlushTimeStamp - (_BYTE)v9) & 0xF,
v11 <= 2)
&& ((v9 & 1) != 0 || v11 < 2) )
{
MiFlushEntireTbDueToAttributeChange(v9, (_BYTE *)2);
}
if( v7 == 1 )
{
++dword_140C4DC48;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
MiFlushCacheForAttributeChange(v8, 1i64, v4);
__writecr8(CurrentIrql);
}
}
if( v6 != 17 )
{
_InterlockedAnd64((volatile signed __int64 *)(a1 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v6);
}
}Referenced by:
MiAddExpansionNonPagedPool
MiAllocateKernelStackPages
MiBuildForkPageTable
MiCoalesceFreePages
MiCompletePrivateZeroFault
MiComputeOptimalZeroPath
MiCopyOnWrite
MiCopyPage
MiCopySinglePage
MiDeleteClusterPage
MiDeleteClusterSection
MiDuplicateCloneLeaf
MiFillCombinePage
MiFinalizePageAttribute
MiGetPage
MiGetPageChain
MiIncrementAweMapCount
MiInitializeHardFaultPfn
MiInitializePfn
MiInitializeReadInProgressPfn
MiMakePageAvoidRead
MiMapPagesToZero
MiMigratePfn
MiPageAttributeBatchChangeNeeded
MiSetPfnOwnedAndActive
MiZeroPhysicalPage