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