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