MiResetAccessBitPte

NTSTATUS __fastcall MiResetAccessBitPte(INT64 a1, _MMPTE *PointerPte, int a3){
  __int64 v3; 
  _MMSUPPORT_INSTANCE *v5; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v7; 
  _MMPFN *v9; 
  __int64 Blink; 
  UINT64 *v11; 
  unsigned __int64 v12; 
  int VaAge; 
  int v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  _MI_TB_FLUSH_LIST *TbFlushList; 
  UINT64 AccessLogging; 
  UINT64 Long; 

  v3 = *(_QWORD *)(a1 + 168);
  v5 = *(_MMSUPPORT_INSTANCE **)(a1 + 24);
  v7.Long = (unsigned __int64)PointerPte->u;
  Long = v7.Long;
  if( (v7.Long & 0x20) == 0 )
    return 0;
  MiPteInShadowRange((UINT64)&Long);
  v9 = &MmGetPfnDb()[(v7.Long >> 12) & 0xFFFFFFFFFi64];
  if( a3 )
  {
    if( (v9->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) != 1 || (unsigned int)MiIsPageTableLocked((INT64)v5, (UINT64)PointerPte) )
      return 0;
  }
  if( (v9->u4._bf_0 & 0x1000000000i64) == 0 )
  {
    Blink = (__int64)v9->ListEntry.Blink;
    if( Blink > 0 )
      MiDemoteCombinedPte(v5, PointerPte, (_MMPTE *)(Blink | 0x8000000000000000ui64));
  }
  v11 = *(UINT64 **)(v3 + 16);
  v12 = (__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  if( !v11 || v12 > 0x7FFFFFFEFFFFi64 )
  {
    VaAge = (unsigned __int8)MiGetVaAge((INT64)v11, v12);
    if( VaAge == 7 && (unsigned int)MiGetPfnPriority(v9) < *(&stru_140C4DB30 + 655) )
    {
      v15 = 0;
    }
    else
    {
      v15 = 1;
      if( (unsigned int)(VaAge - 1) <= 5 )
        MiSetVaAgeList(v5, v12, 1ui64, 0);
    }
    v16 = *(_QWORD *)(v3 + 8);
    LODWORD(AccessLogging) = 0;
    LODWORD(TbFlushList) = *(_DWORD *)v3;
    if( !MiClearPteAccessed(v5, v9, PointerPte, (_MMWSLE *)v16, TbFlushList, AccessLogging) )
      return 0;
    if( v15 == 1 && *(_DWORD *)v3 )
    {
      if( !v16 )
      {
        MiLogPageAccess(v5, PointerPte);
        return 0;
      }
    }
    else if( !v16 )
    {
      return 0;
    }
    v17 = *(&stru_140C4DB30 + 52);
    if( (*(_BYTE *)(v16 + 4) & 2) == 0 && *(_DWORD *)v16 == 1 && KeGetCurrentThread()->ApcState.Process->VmContext )
      v17 = -1i64;
    if( (*(_DWORD *)(v16 + 12) >= *(_DWORD *)(v16 + 8) || *(_BYTE *)(v16 + 5) || *(_QWORD *)(v16 + 16) > v17)
      && v17 >= 0x400
      && !*(_BYTE *)(v16 + 5) )
    {
      MiFlushTbList((_MI_TB_FLUSH_LIST *)v16);
    }
    return 0;
  }
  if( MiInsertVmAccessedEntry(v11, v12) )
    return MiResetAccessBitsTail(a1);
  return 0;
}

Referenced by:

No references.