MiProcessWorkingSets
VOID __fastcall MiProcessWorkingSets(INT64 a1, INT64 a2){
INT64 v3;
PRKEVENT v4;
int v5;
__int64 v6;
__int64 v7;
__int64 *v8;
BOOL v9;
__int16 v10;
__int64 *v11;
__int64 v12;
__int64 v13;
__int64 *v14;
int v15;
_KSPIN_LOCK_QUEUE *volatile Next;
struct _KPRCB *CurrentPrcb;
unsigned __int8 CurrentIrql;
KSPIN_LOCK_QUEUE *v19;
int v20;
int v21;
__int64 v22;
__int64 v23;
__int64 **v24;
_KGATE *v25;
__int64 **v26;
__int64 **v27;
__int64 *v28;
__int64 **v29;
char v30;
unsigned int v31;
int Blink;
__int64 v33;
INT64 v34;
_QWORD *v35;
_QWORD *v36;
_QWORD *v37;
int v38;
_MMSUPPORT_INSTANCE *v39;
__int64 v40;
_QWORD *v41;
__int64 v42;
UINT64 v43;
__int64 **v44;
unsigned __int64 v45;
unsigned __int64 v46;
int v47;
unsigned int v48;
int v49;
unsigned int v50;
int v51;
PRKEVENT Event;
struct _KLOCK_QUEUE_HANDLE LockHandle;
__int16 v56;
int v57;
__int16 v58;
int v59;
int v60;
v3 = a1;
memset(&LockHandle, 0, sizeof(LockHandle));
if( *(_BYTE *)(a1 + 12) )
MiInitializeWorkingSetManagerParameters((_MI_PARTITION *)a1);
if( (*(_DWORD *)(v3 + 4) & 0x20) != 0 )
return;
v4 = *(PRKEVENT *)(v3 + 6848);
Event = v4;
MiComputeAgingPercent((_MI_PARTITION *)v3);
v48 = MiComputeSystemTrimCriteria((_QWORD *)v3, a2);
v5 = v48;
MiLogProcessWorkingSetsStart(v3, a2, v48);
if( (v48 & 5) != 0 )
MiDrainZeroLookasides((_MI_PARTITION *)v3, 0i64, 0i64, 0i64);
v49 = 0;
v50 = 0;
if( (v48 & 5) != 0 )
LOBYTE(v4[2].Header.SignalState) = 1;
if( (v48 & 2) != 0 )
++HIDWORD(v4[3].Header.WaitListHead.Flink);
v6 = 0i64;
if( (v48 & 0x40) != 0 )
{
if( WORD1(v4[97].Header.WaitListHead.Blink) > 0xAu )
WORD1(v4[97].Header.WaitListHead.Blink) = 10;
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
if( BYTE2(v4[2].Header.SignalState) == 1 )
{
v35 = (_QWORD *)(v3 + 6856);
BYTE2(v4[2].Header.SignalState) = 0;
v36 = *(_QWORD **)(v3 + 6856);
if( v36 != (_QWORD *)(v3 + 6856) )
{
do
{
v37 = v36;
v36 = (_QWORD *)*v36;
if( (_LIST_ENTRY *)v37[9] >= v4[2].Header.WaitListHead.Flink )
{
v40 = *v37;
v41 = (_QWORD *)v37[1];
if( *(_QWORD **)(*v37 + 8i64) != v37
|| (_QWORD *)*v41 != v37
|| (*v41 = v40, *(_QWORD *)(v40 + 8) = v41, v42 = *v35, *(_QWORD **)(*v35 + 8i64) != v35) )
{
LABEL_77:
__fastfail(3u);
}
*v37 = v42;
v37[1] = v35;
*(_QWORD *)(v42 + 8) = v37;
*v35 = v37;
}
}
while( v36 != v35 );
}
}
}
else
{
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
}
v7 = a2;
v8 = (__int64 *)(v3 + 6856);
BYTE1(v4[2].Header.SignalState) = 1;
LABEL_13:
while( 2 )
{
v9 = 0;
v51 = v5 & 1;
if( (v5 & 1) != 0 )
{
v43 = MiOrderTrimList((_MI_PARTITION *)v3, *((unsigned __int8 *)MiTrimPassToAge + (*(_BYTE *)v7 & 0x7F)));
v7 = a2;
*(_QWORD *)(a2 + 104) = v43;
}
v10 = ++LOWORD(v4[97].Header.WaitListHead.Blink);
*(_QWORD *)(v7 + 88) = *(_QWORD *)(v7 + 80) - *(_QWORD *)(v7 + 96);
v56 = v10;
while( 1 )
{
v11 = (__int64 *)*v8;
if( (__int64 *)*v8 == v8 )
goto LABEL_41;
v12 = *v11;
if( (__int64 *)v11[1] != v8 || *(__int64 **)(v12 + 8) != v11 )
goto LABEL_77;
*v8 = v12;
v13 = (__int64)(v11 - 3);
*(_QWORD *)(v12 + 8) = v8;
v14 = v11;
*v11 = 0i64;
if( *((_WORD *)v11 + 74) == v10 )
{
v28 = (__int64 *)*v8;
v29 = (__int64 **)(v13 + 24);
if( *(__int64 **)(*v8 + 8) != v8 )
goto LABEL_77;
v3 = a1;
*v29 = v28;
v29[1] = v8;
v28[1] = (__int64)v29;
*v8 = (__int64)v29;
if( !v51 )
goto LABEL_44;
v47 = MiCheckSystemTrimEndCriteria((_QWORD *)a1, v7, &LockHandle);
v7 = a2;
v4 = Event;
if( v47 )
goto LABEL_44;
goto LABEL_13;
}
*(_WORD *)(v13 + 172) = v10;
v15 = v5 & 0x40;
if( (v5 & 0x40) != 0 && (_LIST_ENTRY *)*(_QWORD *)(v13 + 96) < Event[2].Header.WaitListHead.Flink )
break;
if( *(_QWORD *)(v13 + 136) > 1ui64 || (*(_BYTE *)(v13 + 184) & 7) != 0 )
{
v57 = *(_DWORD *)(v13 + 184);
BYTE1(v57) = BYTE1(v57) & 0xF9 | 2;
*(_WORD *)(v13 + 184) = v57;
if( *(_BYTE *)(v7 + 2) == 2 )
{
v45 = *(_QWORD *)(v13 + 136);
v46 = *(_QWORD *)(v13 + 112);
if( v45 <= v46 || v45 - v46 < 0x40000 )
goto LABEL_30;
}
_m_prefetchw(&LockHandle);
Next = LockHandle.LockQueue.Next;
if( !LockHandle.LockQueue.Next )
{
Next = (_KSPIN_LOCK_QUEUE *volatile)_InterlockedCompareExchange64(
(volatile signed __int64 *)LockHandle.LockQueue.Lock,
0i64,
(signed __int64)&LockHandle);
if( Next == (_KSPIN_LOCK_QUEUE *volatile)&LockHandle )
goto LABEL_25;
Next = KxWaitForLockChainValid(&LockHandle.LockQueue);
v7 = a2;
}
LockHandle.LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
LABEL_25:
CurrentPrcb = KeGetCurrentPrcb();
if( *((_QWORD *)CurrentPrcb + 4247) && *((_BYTE *)CurrentPrcb + 32) <= 1u && !(_DWORD)Next )
v7 = a2;
__writecr8(LockHandle.OldIrql);
v5 = v48;
v9 = MiTrimOrAgeWorkingSet(v13, v7, v48);
if( v9 )
*(_BYTE *)(a2 + 4) = 2;
LockHandle.LockQueue.Lock = &WorkerRoutine;
LockHandle.LockQueue.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LockHandle.OldIrql = CurrentIrql;
v19 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)&WorkerRoutine, (__int64)&LockHandle);
if( v19 )
KxWaitForLockOwnerShip(&LockHandle.LockQueue, v19);
LABEL_30:
if( !v15
|| (v20 = 0, (_LIST_ENTRY *)*(_QWORD *)(v13 + 96) < Event[2].Header.WaitListHead.Flink)
|| *(_QWORD *)(v13 + 104) )
{
v20 = 1;
}
v21 = *(_DWORD *)(v13 + 184);
LOBYTE(v58) = v21;
if( v20 )
{
HIBYTE(v58) = BYTE1(v21) & 0xF9;
*(_WORD *)(v13 + 184) = v58;
v22 = *(unsigned __int16 *)(v13 + 174);
v23 = *(_QWORD *)(qword_140C4E388 + 8 * v22) + 6856i64;
v24 = *(__int64 ***)(*(_QWORD *)(qword_140C4E388 + 8 * v22) + 6864i64);
if( *v24 != (__int64 *)v23 )
goto LABEL_77;
*v14 = v23;
v14[1] = (__int64)v24;
*v24 = v14;
*(_QWORD *)(v23 + 8) = v14;
v25 = *(_KGATE **)(v13 + 104);
if( v25 )
KeSignalGate(v25, 1i64);
}
else
{
*(_QWORD *)(v13 + 32) = v6;
HIBYTE(v58) = BYTE1(v21) | 6;
v6 = v13 + 32;
*(_WORD *)(v13 + 184) = v58;
}
v7 = a2;
if( v9 )
goto LABEL_41;
v10 = v56;
}
else if( *(_QWORD *)(v13 + 104) )
{
v44 = (__int64 **)v8[1];
if( *v44 != v8 )
goto LABEL_77;
*v14 = (__int64)v8;
v14[1] = (__int64)v44;
*v44 = v14;
v8[1] = (__int64)v14;
}
else
{
v59 = *(_DWORD *)(v13 + 184);
BYTE1(v59) |= 6u;
*(_WORD *)(v13 + 184) = v59;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
KeRetryOutswapProcess((_KPROCESS *)(v13 - 1664));
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
v60 = *(_DWORD *)(v13 + 184);
BYTE1(v60) &= 0xF9u;
*(_WORD *)(v13 + 184) = v60;
MiReturnWsToExpansionList((_MMSUPPORT_INSTANCE *)v13, 0i64);
v10 = v56;
v7 = a2;
v5 = v48;
}
}
v26 = (__int64 **)v8[1];
v27 = (__int64 **)(v13 + 24);
if( *v26 != v8 )
goto LABEL_77;
*v27 = v8;
v27[1] = (__int64 *)v26;
*v26 = (__int64 *)v27;
v8[1] = (__int64)v27;
LABEL_41:
v3 = a1;
LABEL_44:
if( (v5 & 0x40) != 0 )
{
while( v6 )
{
v38 = *(_DWORD *)(v6 + 152);
v39 = (_MMSUPPORT_INSTANCE *)(v6 - 32);
v6 = *(_QWORD *)v6;
v39->Flags.u1 = v38 & 0xF9FF;
MiReturnWsToExpansionList(v39, 1ui64);
}
v7 = a2;
}
v4 = Event;
v30 = v5 | v49;
v49 |= v5;
if( !v9 )
{
v31 = v5 & 0xFFFFFF3C | v50;
Blink = (int)Event[1].Header.WaitListHead.Blink;
v50 = v31;
if( v31 == Blink )
{
BYTE1(Event[2].Header.SignalState) = 0;
if( (v30 & 5) != 0 )
LOBYTE(Event[2].Header.SignalState) = 0;
if( Blink )
{
LODWORD(Event[1].Header.WaitListHead.Blink) = 0;
KeSetEvent(Event, 0);
}
if( (v30 & 0x83) != 0 )
{
Event[100].Header.WaitListHead.Blink = *(_LIST_ENTRY **)(a2 + 8);
*(_QWORD *)&Event[101].Header.Lock = *(_QWORD *)(a2 + 16);
Event[101].Header.WaitListHead.Flink = *(_LIST_ENTRY **)(a2 + 24);
Event[101].Header.WaitListHead.Blink = *(_LIST_ENTRY **)(a2 + 32);
*(_QWORD *)&Event[102].Header.Lock = *(_QWORD *)(a2 + 40);
Event[102].Header.WaitListHead.Flink = *(_LIST_ENTRY **)(a2 + 48);
Event[102].Header.WaitListHead.Blink = *(_LIST_ENTRY **)(a2 + 56);
v33 = *(_QWORD *)(a2 + 64);
*(_QWORD *)&Event[103].Header.Lock = v33;
Event[100].Header.WaitListHead.Flink = (_LIST_ENTRY *)((char *)Event[102].Header.WaitListHead.Blink + v33);
}
goto LABEL_53;
}
v5 = v31 ^ Blink;
v48 = v5;
if( (v5 & 5) != 0 )
LOBYTE(Event[2].Header.SignalState) = 1;
*(_BYTE *)(v7 + 2) = 6;
continue;
}
break;
}
BYTE1(Event[2].Header.SignalState) = 0;
if( (v30 & 5) != 0 )
LOBYTE(Event[2].Header.SignalState) = 0;
LABEL_53:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
MiLogProcessWorkingSetsStop((_MI_PARTITION *)v3, v34);
}Referenced by:
MiWorkingSetManager