MiAgePteWorker

VOID __stdcall MiAgePteWorker(
        _MMSUPPORT_INSTANCE *WsInfo,
        _MMPTE *PointerPte,
        VOID *Va,
        _MMPFN *Pfn1,
        INT64 a5,
        INT64 a6){
  _MMPTE *v6; 
  _MMPTE *PteBase; 
  wchar_t *Pml4eBase; 
  UINT8 PxeUserLimit; 
  _MMPFN *PfnDb; 
  _MMPTE *PteLimit; 
  _QWORD *v15; 
  unsigned __int64 v16; 
  _UNICODE_STRING *v17; 
  char v18; 
  __int64 v19; 
  int v20; 
  unsigned __int64 v21; 
  char v22; 
  unsigned int v23; 
  UINT8 v24; 
  int v25; 
  int v26; 
  unsigned __int8 v27; 
  unsigned __int64 v28; 
  unsigned __int8 v29; 
  _MI_TB_FLUSH_LIST *TbFlushList; 
  UINT64 AccessLogging; 

  v6 = PointerPte;
  PteBase = MmGetPteBase();
  Pml4eBase = (wchar_t *)MmGetPml4eBase();
  PxeUserLimit = (unsigned __int8)MmGetPxeUserLimit();
  PfnDb = MmGetPfnDb();
  PteLimit = MmGetPteLimit();
  if( Va < PteBase || Va > PteLimit )
  {
    v15 = (unsigned __int64 *)((char *)&PteBase->u.Long + (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64));
    v17 = (_UNICODE_STRING *)HIBYTE(*v15);
    LOBYTE(v17) = (unsigned __int8)v17 & 0xF;
  }
  else
  {
    v15 = (unsigned __int64 *)((char *)&PteBase->u.Long + (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64));
    LODWORD(v16) = MI_READ_PTE_LOCK_FREE((INT64)v15);
    v17 = (_UNICODE_STRING *)(unsigned __int8)PfnDb[(v16 >> 12) & 0xFFFFFFFFFi64].$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::gap0[0];
    LOBYTE(v17) = ((unsigned __int8)v17 >> 1) & 7;
  }
  if( (a6 & 1) != 0 )
  {
    if( (unsigned __int8)((_BYTE)v17 - 1) > 5u )
    {
      if( (_BYTE)v17 == 7 )
      {
LABEL_12:
        v19 = 0i64;
        v20 = 0;
        if( (a6 & 2) != 0 )
        {
          v19 = *(_QWORD *)(a5 + 56);
        }
        else if( (a6 & 4) != 0 )
        {
          v20 = 1;
        }
        LODWORD(AccessLogging) = v20;
        LODWORD(TbFlushList) = *(&stru_140C4DB30 + 654);
        if( MiClearPteAccessed(WsInfo, Pfn1, v6, (_MMWSLE *)v19, TbFlushList, AccessLogging) )
          ++*(_QWORD *)(a5 + 24);
        if( v19 )
        {
          v21 = *(&stru_140C4DB30 + 52);
          if( (*(_BYTE *)(v19 + 4) & 2) == 0
            && *(_DWORD *)v19 == 1
            && KeGetCurrentThread()->ApcState.Process->VmContext )
          {
            v21 = -1i64;
          }
          if( (*(_DWORD *)(v19 + 12) >= *(_DWORD *)(v19 + 8) || *(_BYTE *)(v19 + 5) || *(_QWORD *)(v19 + 16) > v21)
            && v21 >= 0x400
            && !*(_BYTE *)(v19 + 5) )
          {
            MiFlushTbList((_MI_TB_FLUSH_LIST *)v19);
          }
        }
        return;
      }
    }
    else
    {
      MiSetVaAgeList(WsInfo, (UINT64)Va, 1ui64, 0);
    }
    v18 = *((_BYTE *)&Pfn1->u3 + 3);
    if( (v18 & 8) == 0 && (v18 & 7u) < 5 )
    {
      MiLockSetPfnPriority(Pfn1, (VOID *)5);
      v6 = PointerPte;
    }
    goto LABEL_12;
  }
  v22 = *((_BYTE *)&Pfn1->u3 + 3);
  if( (v22 & 8) != 0 )
    v23 = 5;
  else
    v23 = v22 & 7;
  if( (unsigned __int8)v17 < 6u )
  {
    if( v23 < 5 )
    {
      v24 = 6;
LABEL_37:
      MiSetVaAgeList(WsInfo, (UINT64)Va, 1ui64, v24);
      ++*(_QWORD *)(a5 + 16);
      goto LABEL_38;
    }
    if( (*(_DWORD *)a5 & 1) != 0 )
    {
      v24 = (_BYTE)v17 + 1;
      goto LABEL_37;
    }
  }
LABEL_38:
  LOBYTE(v25) = MI_PFN_IS_PROTO((_UNICODE_STRING *)Pfn1, v17, PxeUserLimit, Pml4eBase);
  if( v25 )
    LOBYTE(v26) = *(_BYTE *)(a5 + 5);
  else
    v26 = *(unsigned __int8 *)(a5 + 4);
  v27 = v26;
  if( !(_BYTE)v26 )
    v27 = 7;
  if( (WsInfo->Flags._bf_0 & 7) == 3
    && (((unsigned __int64)Pfn1->u4._bf_0 >> 60) & 7) == 4
    && (Pfn1->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1
    && Pfn1->u3.ReferenceCount == 1
    || (*(_DWORD *)a5 & 3) != 0
    && (Va < MmGetPteBase() || Va > MmGetPteLimit() ? (v29 = HIBYTE(*v15) & 0xF) : (LODWORD(v28) = MI_READ_PTE_LOCK_FREE((INT64)v15),
                                                                                    v29 = (MmGetPfnDb()[(v28 >> 12) & 0xFFFFFFFFFi64].$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::gap0[0] >> 1) & 7),
        v29 >= v27 || v23 < *(_DWORD *)(a5 + 8)) )
  {
    ++*(_QWORD *)(a5 + 32);
    MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)(a5 + 64), Va, 1ui64, 0i64);
    if( *(_DWORD *)(a5 + 76) == *(_DWORD *)(a5 + 72) )
      MiFreeWsleList(WsInfo, (_MMWSLE_FLUSH_LIST *)(a5 + 64), 0i64);
  }
}

Referenced by:

MiAgePte
MiAgeWorkingSetEPTCallback
MiSimpleAgePte
MiSimpleAgeWorkingSetEPTCallback