MiAgeWorkingSet

NTSTATUS __stdcall MiAgeWorkingSet(_MMSUPPORT_INSTANCE *VmSupport, UINT8 WsIrql, UINT64 AgingFlags, UINT64 Percent){
  unsigned int v4; 
  int v6; 
  _MMWSL_INSTANCE *VmWorkingSetList; 
  NTSTATUS v8; 
  unsigned __int64 WorkingSetSize; 
  __int64 v10; 
  unsigned __int64 LockedEntries; 
  signed __int32 v12; 
  unsigned __int64 v13; 
  unsigned int v14; 
  int v15; 
  unsigned __int64 *v16; 
  struct _KPRCB *CurrentPrcb; 
  __int64 LastAccessClearingRemainder; 
  unsigned __int64 v19; 
  _KSPIN_LOCK_QUEUE *volatile Next; 
  struct _KPRCB *v21; 
  unsigned __int64 v22; 
  __int64 PartitionId; 
  char *Pool; 
  _QWORD *v25; 
  __int64 v26; 
  _QWORD *v27; 
  unsigned __int64 v28; 
  __int64 v29; 
  _QWORD *v30; 
  int v31; 
  unsigned __int8 v32; 
  int v33; 
  __int8 bf_0; 
  unsigned __int8 v35; 
  int v36; 
  CHAR *RandomPte; 
  char v38; 
  const CHAR *v39; 
  unsigned __int128 v42; 
  int v43; 
  __int64 v44; 
  char v46; 
  _MMWSL_INSTANCE *v47; 
  _KSPIN_LOCK_QUEUE v48; 
  __int64 v49; 
  int v50; 
  int v51; 
  int v52; 
  __int64 v53; 
  __int64 v54; 
  __int64 v55; 
  __int64 v56; 
  __int64 v57[32]; 
  INT64 v58[22]; 
  char v59[192]; 
  int v60[68]; 
  __int64 v61[6]; 
  INT64 v62[14]; 

  v4 = Percent;
  v6 = AgingFlags;
  memset(v59, 0i64, 0xB8u);
  memset(v57, 0i64, sizeof(v57));
  memset(v58, 0i64, sizeof(v58));
  memset(v60, 0i64, 0x108u);
  VmWorkingSetList = VmSupport->VmWorkingSetList;
  v8 = 3;
  WorkingSetSize = VmSupport->WorkingSetSize;
  v10 = 0i64;
  v47 = VmWorkingSetList;
  LockedEntries = VmWorkingSetList->LockedEntries;
  v12 = 1;
  if( WorkingSetSize <= LockedEntries )
    goto LABEL_45;
  v13 = WorkingSetSize - LockedEntries;
  v14 = 10;
  if( v4 )
    v14 = v4;
  v50 = v6 & 4;
  if( (v6 & 4) == 0 )
  {
    v15 = VmSupport->Flags._bf_0 & 7;
    v49 = 0i64;
    if( (_BYTE)v15 == 2 )
      v16 = (unsigned __int64 *)((char *)&stru_140C4DB30 + 6608);
    else
      v16 = &VmSupport[1].AgeDistribution[3];
    v48.Lock = v16;
    v48.Next = 0i64;
    CurrentPrcb = KeGetCurrentPrcb();
    if( CurrentPrcb->SchedulerAssist && CurrentPrcb->NestingLevel <= 1u && CurrentPrcb->NestingLevel == 1 )
    {
      VmWorkingSetList = v47;
      v10 = 0i64;
    }
    if( _InterlockedExchange64((volatile __int64 *)v16, (__int64)&v48) )
    {
      KxWaitForLockOwnerShip((INT64)&v48);
      VmWorkingSetList = v47;
      v10 = 0i64;
    }
    if( (v6 & 2) != 0 )
    {
      LastAccessClearingRemainder = VmWorkingSetList->LastAccessClearingRemainder;
      v19 = v13 + LastAccessClearingRemainder;
      VmWorkingSetList->LastAccessClearingRemainder = (v13 + LastAccessClearingRemainder) % v14;
    }
    else
    {
      LastAccessClearingRemainder = VmWorkingSetList->LastAgingRemainder;
      v19 = v13 + LastAccessClearingRemainder;
      VmWorkingSetList->LastAgingRemainder = (v13 + LastAccessClearingRemainder) % v14;
    }
    _m_prefetchw(&v48);
    Next = v48.Next;
    if( !v48.Next )
    {
      Next = (_KSPIN_LOCK_QUEUE *volatile)_InterlockedCompareExchange64(
                                            (volatile signed __int64 *)v48.Lock,
                                            0i64,
                                            (signed __int64)&v48);
      if( Next == &v48 )
      {
LABEL_14:
        v21 = KeGetCurrentPrcb();
        if( v21->SchedulerAssist && v21->NestingLevel <= 1u && !(_DWORD)Next )
          v10 = 0i64;
        v12 = 1;
        if( v19 >= v13 )
          goto LABEL_16;
        goto LABEL_68;
      }
      Next = KxWaitForLockChainValid(&v48);
      v10 = 0i64;
    }
    v48.Next = 0i64;
    _InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
    goto LABEL_14;
  }
LABEL_68:
  LastAccessClearingRemainder = 0i64;
LABEL_16:
  v22 = v14 * (v13 + LastAccessClearingRemainder) / 0x3E8;
  if( v22 > v13 )
  {
    v42 = v13 * v14 * (unsigned __int128)0x624DD2F1A9FBE77ui64;
    v22 = (*((_QWORD *)&v42 + 1) + ((v13 * v14 - *((_QWORD *)&v42 + 1)) >> 1)) >> 9;
  }
  PartitionId = VmSupport->PartitionId;
  HIDWORD(v57[1]) = v14;
  Pool = 0i64;
  v25 = *(_QWORD **)(*(&stru_140C4DB30 + 267) + 8 * PartitionId);
  v26 = v25[856];
  if( (v6 & 3) != 0 )
  {
    v27 = v25 + 304;
    v28 = v25[280] + v25[288];
    v29 = 0i64;
    v30 = v25 + 329;
    if( v27 < v30 )
    {
      do
      {
        v29 += *v27;
        v10 += v27[5];
        v27 += 10;
      }
      while( v27 < v30 - 5 );
      if( v27 < v30 )
        v28 += *v27;
      v28 += v29 + v10;
    }
    if( v28 + *v30 < *(_QWORD *)(v26 + 72) )
    {
      if( VmSupport->Flags.MemoryPriority != 2 )
      {
        if( v28 >= *(_QWORD *)(v26 + 64) )
          v8 = 5;
        LODWORD(v57[1]) = v8;
      }
      if( (VmSupport->Flags._bf_0 & 7) != 0 || !MiIsStoreProcess((_EPROCESS *)&VmSupport[-9].AgeDistribution[3]) )
        WORD2(v57[0]) = *(_WORD *)(v26 + 2350);
    }
    if( v22 <= 0x100 )
      goto LABEL_88;
    v31 = 509;
    if( v22 < 0x1FD )
      v31 = v22;
    Pool = (char *)MiAllocatePool(64i64, 8i64 * (unsigned int)(v31 - 256) + 2072, 0x73576D4Dui64);
    v12 = 1;
    if( !Pool )
    {
LABEL_88:
      if( _InterlockedCompareExchange((volatile signed __int32 *)(v26 + 124), v12, 0) )
      {
        Pool = v59;
        v31 = 20;
      }
      else
      {
        Pool = (char *)(v26 + 128);
        v31 = 256;
      }
    }
    v32 = VmSupport->Flags._bf_0 & 7;
    if( v32 )
      v33 = v32 < 2u ? 2 : 0;
    else
      v33 = v12;
    *(_DWORD *)Pool = v33;
    *((_DWORD *)Pool + 3) = 0;
    *((_WORD *)Pool + 2) = 0;
    *((_QWORD *)Pool + 2) = 0i64;
    *((_QWORD *)Pool + 3) = 0i64;
    *((_DWORD *)Pool + 2) = v31;
    if( (VmSupport->Flags._bf_0 & 7) == 0 && VmSupport[3].AgeDistribution[1] )
    {
      v60[1] = 32;
      v57[31] = (__int64)v60;
    }
  }
  BYTE6(v58[0]) = WsIrql;
  bf_0 = VmSupport->Flags._bf_0;
  v58[3] = (INT64)VmSupport;
  LODWORD(v57[0]) = v6;
  v57[6] = v22;
  v57[7] = (__int64)Pool;
  v35 = bf_0 & 7;
  if( v35 )
    v36 = v35 < 2u ? 2 : 0;
  else
    v36 = v12;
  LODWORD(v57[8]) = v36;
  v58[21] = (INT64)v57;
  LOWORD(v58[0]) = 14;
  v58[19] = (INT64)MiAgePte;
  v58[20] = (INT64)MiAgeWorkingSetTail;
  v57[9] = 20i64;
  WORD2(v57[8]) = 4;
  v57[10] = 0i64;
  v57[11] = 0i64;
  if( v50 )
  {
    RandomPte = MiGenerateRandomPte((INT64)v58);
  }
  else if( (v6 & 2) != 0 )
  {
    RandomPte = (CHAR *)v47->NextPteToAccessClear;
  }
  else
  {
    RandomPte = (CHAR *)v47->NextPteToAge;
  }
  v58[7] = (INT64)RandomPte;
  if( !RandomPte )
    v58[5] = -1i64;
  v8 = MiWalkPageTables((INT64)v58);
  if( Pool )
  {
    if( Pool == (char *)(v26 + 128) )
    {
      _InterlockedAnd((volatile signed __int32 *)(v26 + 124), 0);
    }
    else if( Pool != v59 )
    {
      ExFreePoolWithTag(Pool, 0);
    }
  }
  if( v8 == 4 )
    ++*(_DWORD *)(v26 + 2568);
LABEL_45:
  if( *(&stru_140C4DB30 + 542) )
  {
    v38 = VmSupport->Flags._bf_0 & 7;
    v39 = v38 ? 0i64 : (const CHAR *)&VmSupport[-2].HardFaultCount;
    if( **(&stru_140C4DB30 + 542) > 5u
      && (*(_BYTE *)(*(&stru_140C4DB30 + 542) + 16i64) & 1) != 0
      && (*(_QWORD *)(*(&stru_140C4DB30 + 542) + 24i64) & 1i64) == *(_QWORD *)(*(&stru_140C4DB30 + 542) + 24i64) )
    {
      v46 = v38;
      v61[4] = (__int64)&v46;
      v61[5] = 1i64;
      tlgCreate1Sz_char((INT64)v62, v39);
      v51 = v43;
      v62[2] = (INT64)&v51;
      v53 = v57[5];
      v62[3] = 4i64;
      v62[4] = (INT64)&v53;
      v54 = v57[2];
      v62[6] = (INT64)&v54;
      v55 = v57[4];
      v62[8] = (INT64)&v55;
      v56 = v57[3];
      v62[10] = (INT64)&v56;
      v62[12] = (INT64)&v52;
      v62[5] = 8i64;
      v62[7] = 8i64;
      v62[9] = 8i64;
      v62[11] = 8i64;
      v52 = v6;
      v62[13] = 4i64;
      tlgWriteEx_EtwWriteEx(v44, (unsigned __int8 *)&byte_140024EBF, 0i64, 1u, 0, 0, 0xAu, (__int64)v61);
    }
  }
  return v8 == 4;
}

Referenced by:

MiForceAgeWorkingSet
MiTrimOrAgeWorkingSet