MiSetVaAgeList

INT64 __fastcall MiSetVaAgeList(INT64 a1, UINT64 a2, UINT8 *r8, UINT8 a4){
  _MMPTE *PteBase; 
  char v8; 
  volatile signed __int64 *v9; 
  _MMPTE *PteLimit; 
  char v11; 
  int v12; 
  unsigned __int64 *v13; 
  struct _KPRCB *CurrentPrcb; 
  KSPIN_LOCK_QUEUE *v15; 
  _MMPTE *PdeBase; 
  _BYTE *v17; 
  int v18; 
  unsigned __int8 v19; 
  UINT64 v20; 
  __int64 *v21; 
  __int64 v22; 
  unsigned __int8 v23; 
  UINT8 v24; 
  signed __int64 v25; 
  signed __int64 v26; 
  UINT64 v27; 
  unsigned __int64 *v28; 
  unsigned __int64 v29; 
  UINT8 v30; 
  bool v31; 
  _KSPIN_LOCK_QUEUE *volatile Next; 
  UINT64 v33; 
  INT64 v34; 
  unsigned __int64 *v35; 
  char v37; 
  int v38; 
  volatile unsigned __int64 v39; 
  int v40; 
  int v42; 
  int v43; 
  volatile signed __int64 *v44; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 v46; 
  UINT64 v47; 
  UINT64 v48; 
  _OWORD a3[2]; 
  v42 = (int)r8;
  *(_QWORD *)&LockHandle.OldIrql = 0i64;
  PteBase = MmGetPteBase();
  v8 = 0;
  v9 = (volatile signed __int64 *)((char *)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64));
  v43 = 0;
  v44 = v9;
  PteLimit = MmGetPteLimit();
  if( a2 < (unsigned __int64)PteBase || a2 > (unsigned __int64)PteLimit )
  {
    v11 = *(_BYTE *)(a1 + 184);
    v12 = 1;
    v40 = 1;
  }
  else
  {
    v11 = *(_BYTE *)(a1 + 184);
    v12 = 0;
    v40 = 0;
    if( (v11 & 7) != 0 )
      v43 = 1;
  }
  if( (v11 & 7) == 2 )
    v13 = &qword_140C4F500;
  else
    v13 = (unsigned __int64 *)(a1 + 256);
  LockHandle.LockQueue.Lock = v13;
  LockHandle.LockQueue.Next = 0i64;
  CurrentPrcb = KeGetCurrentPrcb();
  if( *((_QWORD *)CurrentPrcb + 4247) && *((_BYTE *)CurrentPrcb + 32) <= 1u && *((_BYTE *)CurrentPrcb + 32) == 1 )
    v9 = (volatile signed __int64 *)((char *)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64));
  v15 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)v13, (__int64)&LockHandle);
  if( v15 )
  {
    KxWaitForLockOwnerShip(&LockHandle.LockQueue, v15);
    LODWORD(r8) = v42;
    v9 = v44;
  }
  if( a4 == 8
    && *(_QWORD *)(a1 + 112) < *(_QWORD *)(*(_QWORD *)(a1 + 16) + 32i64) + 6i64 + (unsigned __int64)(unsigned int)r8 )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    return 0i64;
  }
  PdeBase = MmGetPdeBase();
  if( (_DWORD)r8 )
  {
    do
    {
      if( v12 )
      {
        v17 = 0i64;
        v8 = HIBYTE(*v9) & 0xF | (16 * (((unsigned __int64)*v9 >> 60) & 7));
        v18 = 0;
        v19 = HIBYTE(*v9) & 0xF;
        if( v19 == 8 )
          v18 = 1;
        v43 = v18;
      }
      else
      {
        v39 = *v9;
        MiPteInShadowRange((UINT64)v9);
        v18 = v43;
        v17 = (char *)MmGetPfnDb() + 48 * ((v39 >> 12) & 0xFFFFFFFFFi64);
        v19 = (*v17 >> 1) & 7;
      }
      if( v19 == 8 )
        --*(_QWORD *)(*(_QWORD *)(a1 + 16) + 32i64);
      if( !v18 )
      {
        if( a2 < (unsigned __int64)MmGetPteBase() || a2 > (unsigned __int64)MmGetPteLimit() )
        {
          v20 = *(_QWORD *)((char *)MmGetPdeBase() + ((a2 >> 18) & 0x3FFFFFF8));
          v46 = v20;
          MiPteInShadowRange((UINT64)&v46);
          v21 = (__int64 *)((char *)MmGetPfnDb() + 48 * ((v20 >> 12) & 0xFFFFFFFFFi64));
          v22 = *v21;
          v23 = ((unsigned __int64)*v21 >> 14) & 7;
          if( (((unsigned __int64)*v21 >> 4) & 0x3FF) != 0 )
          {
            if( v19 == v23 )
            {
              *v21 = v22 ^ ((unsigned __int16)v22 ^ (unsigned __int16)(16 * ((((unsigned __int64)*v21 >> 4) & 0x3FF) - 1))) & 0x3FF0;
            }
            else if( v19 > v23 )
            {
              *v21 = v22 ^ ((unsigned int)v22 ^ (v19 << 14)) & 0x1C000 | 0x3FF0;
            }
          }
          v12 = v40;
        }
        --*(_QWORD *)(a1 + 8i64 * v19 + 40);
        if( v19 == 7 )
          MiVolunteerForTrimFirst(a1, -1i64);
      }
      v24 = a4;
      if( (unsigned __int8)(a4 - 1) <= 5u
        && (MI_READ_PTE_LOCK_FREE((INT64)v44) & 0x20) != 0
        && (a2 > 0x7FFFFFFEFFFFi64 || (*(_BYTE *)(a1 + 184) & 7) != 0 || !*(_QWORD *)(a1 + 624)) )
      {
        v24 = 0;
      }
      if( v17 )
      {
        *(_QWORD *)v17 ^= ((unsigned __int8)*(_QWORD *)v17 ^ (unsigned __int8)(2 * v24)) & 0xE;
      }
      else
      {
        v8 ^= (v24 ^ v8) & 0xF;
        v25 = *v44;
        do
        {
          v26 = v25;
          v25 = _InterlockedCompareExchange64(
                  v44,
                  ((unsigned __int64)(v8 & 0x7F) << 56) | v25 & 0x80FFFFFFFFFFFFFFui64,
                  v25);
        }
        while( v26 != v25 );
      }
      if( v24 >= 8u )
      {
        if( v24 == 8 )
          ++*(_QWORD *)(*(_QWORD *)(a1 + 16) + 32i64);
      }
      else if( v12 || (*(_BYTE *)(a1 + 184) & 7) == 0 )
      {
        if( a2 < (unsigned __int64)MmGetPteBase() || a2 > (unsigned __int64)MmGetPteLimit() )
        {
          v27 = *(_QWORD *)((char *)MmGetPdeBase() + ((a2 >> 18) & 0x3FFFFFF8));
          v47 = v27;
          MiPteInShadowRange((UINT64)&v47);
          v28 = (unsigned __int64 *)((char *)MmGetPfnDb() + 48 * ((v27 >> 12) & 0xFFFFFFFFFi64));
          v29 = *v28;
          v30 = (*v28 >> 14) & 7;
          if( ((*v28 >> 4) & 0x3FF) != 0 )
          {
            if( v24 == v30 )
            {
              *v28 = v29 ^ ((unsigned __int16)v29 ^ (unsigned __int16)(16 * (((*v28 >> 4) & 0x3FF) + 1))) & 0x3FF0;
            }
            else if( v24 > v30 )
            {
              *v28 = v29 & 0xFFFFFFFFFFFE001Fui64 | ((unsigned __int64)(v24 & 7) << 14) | 0x10;
            }
          }
          v12 = v40;
        }
        ++*(_QWORD *)(a1 + 8i64 * v24 + 40);
        if( v24 == 7 )
          MiVolunteerForTrimFirst(a1, 1i64);
      }
      v31 = v42-- == 1;
      v9 = v44;
    }
    while( !v31 );
    PdeBase = MmGetPdeBase();
  }
  _m_prefetchw(&LockHandle);
  Next = LockHandle.LockQueue.Next;
  if( !LockHandle.LockQueue.Next )
  {
    if( (struct _KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
                                         (volatile signed __int64 *)LockHandle.LockQueue.Lock,
                                         0i64,
                                         (signed __int64)&LockHandle) == &LockHandle )
      goto LABEL_44;
    Next = KxWaitForLockChainValid(&LockHandle.LockQueue);
  }
  LockHandle.LockQueue.Next = 0i64;
  _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
LABEL_44:
  if( v12 )
  {
    v48 = *(_QWORD *)((char *)PdeBase + ((a2 >> 18) & 0x3FFFFFF8));
    v33 = v48;
    MiPteInShadowRange((UINT64)&v48);
    v35 = (unsigned __int64 *)((char *)MmGetPfnDb() + 48 * ((v33 >> 12) & 0xFFFFFFFFFi64));
    if( ((*(_DWORD *)v35 >> 4) & 0x3FF) == 0 )
    {
      MiCountWslesInPageTable(v34, a2, a3);
      v37 = 8;
      while( 1 )
      {
        v38 = *((_DWORD *)a3 + (unsigned __int8)--v37);
        if( v38 )
          break;
        if( !v37 )
          return 1i64;
      }
      *v35 = *v35 & 0xFFFFFFFFFFFE000Fui64 | (16 * (v38 & 0x3FF | ((unsigned __int64)(v37 & 7) << 10)));
    }
  }
  return 1i64;
}

Referenced by:

MiActOnPte
MiAgePteWorker
MiClearPteAccessed
MiLockWsle
MiResetAccessBitPte
MiResetAccessBitPteWorker
MiTrimWorkingSetBuildup
MiUnlockWsle
MiUpdateWsleAge