MiClearPteAccessed

INT64 __fastcall MiClearPteAccessed(INT64 a1, INT64 a2, UINT64 a3, INT64 a4, INT64 a5, INT64 a6){
  UINT64 v7; 
  unsigned __int64 PteBase; 
  unsigned int v12; 
  int v13; 
  int v14; 
  WCHAR *PteLimit; 
  unsigned __int64 v16; 
  char v17; 
  __int64 v18; 
  __int64 v19; 
  int v20; 
  int v21; 
  _MMPTE *Pml4eBase; 
  _MMPTE *PxeUserLimit; 
  INT64 v25; 
  unsigned __int64 v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  int v29; 
  char v30; 
  unsigned int v31; 
  INT64 v32; 
  unsigned __int64 v33; 
  unsigned __int64 v34; 
  _MMPTE *v35; 
  int v36; 
  INT64 v37; 
  __int64 v38; 
  unsigned __int64 v39; 
  __int64 v40; 
  unsigned __int64 v41; 
  unsigned int v42; 
  __int64 v43; 
  UINT64 SpinCount; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  int v47; 
  v47 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v7 = a3 << 25;
  PteBase = (unsigned __int64)MmGetPteBase();
  v12 = 0;
  v13 = 0;
  v14 = 0;
  PteLimit = (WCHAR *)MmGetPteLimit();
  v16 = (__int64)(v7 - (PteBase << 25)) >> 16;
  v17 = *(_BYTE *)(a1 + 184) & 7;
  if( v17 && v16 >= PteBase && v16 <= (unsigned __int64)PteLimit )
    return 0i64;
  v18 = 0x3FFFFFFFFFFFFFFFi64;
  v19 = 0x7FFFFFFFF8i64;
  if( !v17 )
    goto LABEL_12;
  if( (*(_QWORD *)(a2 + 24) & 0x3FFFFFFFFFFFFFFFui64) > 1 )
  {
    LOBYTE(v20) = MI_PFN_IS_PROTO((UNICODE_STRING *)a2, (UNICODE_STRING *)0x3FFFFFFFFFFFFFFFi64, PteBase, PteLimit);
    if( !v20 )
      return 0i64;
  }
  if( *(_WORD *)(a2 + 32) > 1u )
    return 0i64;
  v13 = 1;
  if( !a4 )
    goto LABEL_19;
  if( v16 >= PteBase && v16 <= (unsigned __int64)PteLimit )
    LOBYTE(v12) = PteBase + (v19 & (a3 >> 9)) == (_QWORD)MmGetPxeSelfRef();
LABEL_12:
  if( a4 && v16 >= PteBase && v16 <= (unsigned __int64)PteLimit )
  {
    v14 = 1;
    MiLockPageTableInternal(a1, a3, 0i64);
  }
  if( !v13 )
    goto LABEL_31;
  if( v12 )
    KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
LABEL_19:
  LODWORD(SpinCount) = 0;
  v47 = 1;
  while( _interlockedbittestandset64((volatile signed __int32 *)(a2 + 24), 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(__int64 *)(a2 + 24) < 0 );
  }
  if( (*(_QWORD *)(a2 + 24) & 0x3FFFFFFFFFFFFFFFui64) > 1
    && (LOBYTE(v21) = MI_PFN_IS_PROTO((UNICODE_STRING *)a2, (UNICODE_STRING *)v18, PteBase, PteLimit), !v21)
    || (*(_BYTE *)(a1 + 184) & 7) != 0 && *(_WORD *)(a2 + 32) > 1u )
  {
    _InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
    if( v12 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
    }
    if( v14 )
      MiUnlockPageTableInternal(a1, a3);
    return 0i64;
  }
LABEL_31:
  Pml4eBase = MmGetPml4eBase();
  PxeUserLimit = MmGetPxeUserLimit();
  if( a4 )
  {
    if( v14 )
    {
      v25 = MI_READ_PTE_LOCK_FREE(a3);
      MiUnlockNestedPageTableWritePte(a1, (volatile INT64 *)a3, v25 & 0xCFFFFFFFFFFFFFDFui64, v12);
    }
    else
    {
      v26 = *(_QWORD *)a3 & 0xFFFFFFFFFFFFFFDFui64 ^ (*(_QWORD *)a3 & 0xFFFFFFFFFFFFFFDFui64 ^ *(_QWORD *)a3) & 0x7000000000000000i64;
      if( a3 >= (unsigned __int64)Pml4eBase
        && a3 <= (unsigned __int64)PxeUserLimit
        && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
        && (*(_BYTE *)a3 & 1) != 0 )
      {
        v26 |= 0x8000000000000000ui64;
      }
      *(_QWORD *)a3 = v26;
    }
    v27 = 1i64;
    v28 = v16;
    v29 = 1;
    if( *(_DWORD *)a4 != 1 )
    {
      v30 = *(_BYTE *)(a4 + 4);
      if( (v30 & 8) == 0 && v16 >= (unsigned __int64)MmGetPteBase() && v16 <= (unsigned __int64)MmGetPteLimit() )
        *(_BYTE *)(a4 + 4) = v30 | 8;
    }
    v31 = *(_DWORD *)(a4 + 12);
    if( !v31 )
      goto LABEL_65;
    if( (*(_BYTE *)(a4 + 4) & 4) == 0 )
    {
      v32 = a4 + 8i64 * (v31 - 1);
      v33 = *(_QWORD *)(v32 + 24);
      if( (v33 & 0xC00) == 0 )
      {
        v34 = *(_QWORD *)(v32 + 24) & 0x3FFi64;
        if( (v33 & 0xFFFFFFFFFFFFF000ui64) + ((v34 + 1) << 12) == v16 && v34 + 1 > v34 && v34 + 1 <= 0x3FF )
        {
          ++*(_QWORD *)(a4 + 16);
          *(_QWORD *)(v32 + 24) = ((unsigned __int16)v33 ^ (unsigned __int16)(v33 + 1)) & 0x3FF ^ v33;
          goto LABEL_52;
        }
      }
    }
    if( (*(_BYTE *)(a4 + 4) & 4) != 0
      || (v37 = a4 + 8i64 * (v31 - 1), v38 = *(_QWORD *)(v37 + 24), (v38 & 0xC00) != 0)
      || (v38 & 0xFFFFFFFFFFFFF000ui64) != v16 + 4096
      || (v39 = *(_QWORD *)(v37 + 24) & 0x3FFi64, v39 + 1 <= v39)
      || v39 + 1 > 0x3FF )
    {
LABEL_65:
      if( v31 < *(_DWORD *)(a4 + 8) )
      {
        while( 1 )
        {
          v40 = 1024i64;
          if( (unsigned __int64)(v27 - 1) <= 0x3FF )
            v40 = v27;
          v27 -= v40;
          v41 = v28 & 0xFFFFFFFFFFFFF000ui64 | ((_WORD)v40 - 1) & 0x3FF;
          v28 += v40 << 12;
          *(_QWORD *)(a4 + 8i64 * (unsigned int)(*(_DWORD *)(a4 + 12))++ + 24) = v41;
          v42 = *(_DWORD *)(a4 + 12);
          *(_QWORD *)(a4 + 16) += v40;
          if( v42 == *(_DWORD *)(a4 + 8) && (*(_BYTE *)(a4 + 4) & 4) == 0 )
          {
            qsort((WCHAR *)(a4 + 24), v42, (const WCHAR *)8, MiTbFlushSort);
            MiCompressTbFlushList(a4);
            v43 = *(unsigned int *)(a4 + 12);
            if( (_DWORD)v43 == *(_DWORD *)(a4 + 8) )
              break;
          }
          if( !v27 )
            goto LABEL_52;
        }
        if( v27 )
        {
          *(_BYTE *)(a4 + 5) = 1;
          *(_QWORD *)(a4 + 16) = v43;
        }
      }
      else
      {
        *(_BYTE *)(a4 + 5) = 1;
      }
      goto LABEL_52;
    }
    ++*(_QWORD *)(a4 + 16);
    *(_QWORD *)(v37 + 24) = ((unsigned __int16)(v38 - 4096) ^ (unsigned __int16)(v38 - 4096 + 1)) & 0x3FF ^ (unsigned __int64)(v38 - 4096);
  }
  else
  {
    v29 = a6;
  }
LABEL_52:
  if( v47 == 1 )
  {
    _InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
    if( v12 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
    }
  }
  if( v29 )
  {
    v35 = MmGetPteBase();
    if( v16 < (unsigned __int64)v35 || v16 > (unsigned __int64)MmGetPteLimit() )
      v36 = HIBYTE(*(_QWORD *)((char *)v35 + ((v16 >> 9) & 0x7FFFFFFFF8i64))) & 0xF;
    else
      v36 = (*((_DWORD *)MmGetPfnDb()
             + 12
             * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v35 + ((v16 >> 9) & 0x7FFFFFFFF8i64)) >> 12) & 0xFFFFFFFFFi64)) >> 1) & 7;
    if( (_DWORD)a5 && v36 != 7 )
      MiLogPageAccess(a1, a3);
    if( !v36 )
      MiSetVaAgeList(a1, v16, (UINT8 *)1, 1u);
  }
  return 1i64;
}

Referenced by:

MiAgePteWorker
MiCrcStillIntact
MiResetAccessBitPte
MiResetAccessBitPteWorker