MmQuerySystemWorkingSetInformation
VOID __stdcall MmQuerySystemWorkingSetInformation(
_WORKING_SET_TYPE WorkingSetType,
_SYSTEM_FILECACHE_INFORMATION *Info){
INT64 v4;
__int32 v5;
INT64 AnyMultiplexedVm;
int v7;
__int64 v8;
__int64 v9;
UINT8 v10;
WORK_QUEUE_TYPE v11;
PVOID v12;
char v13;
ULONG StandbyRepurposed;
SIZE_T CurrentSize;
SIZE_T PeakSizeIncludingTransitionInPages;
SIZE_T v17;
__int32 v18;
struct _KLOCK_QUEUE_HANDLE LockHandle;
Info->Flags = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
v4 = 2i64;
v5 = WorkingSetType - 2;
if( v5 )
{
v18 = v5 - 1;
if( v18 )
{
if( v18 != 1 )
return;
v4 = 1i64;
}
AnyMultiplexedVm = (INT64)MiGetAnyMultiplexedVm(v4);
}
else
{
AnyMultiplexedVm = MiGetCurrentMultiplexedVm();
if( !AnyMultiplexedVm )
{
memset((INT64)Info, 0i64);
return;
}
}
v8 = (unsigned int)(v7 - 2);
v9 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(AnyMultiplexedVm + 174));
v10 = MiLockWorkingSetShared(AnyMultiplexedVm);
LockHandle.LockQueue.Next = 0i64;
LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(MiGetSharedVm(AnyMultiplexedVm) + 8);
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)LockHandle.LockQueue.Lock, v11, v12);
Info->CurrentSize = *(_QWORD *)(AnyMultiplexedVm + 120);
Info->PeakSize = *(_QWORD *)(AnyMultiplexedVm + 160);
Info->PageFaultCount = *(_DWORD *)(AnyMultiplexedVm + 4);
Info->MinimumWorkingSet = *(_QWORD *)(AnyMultiplexedVm + 112);
Info->MaximumWorkingSet = *(_QWORD *)(AnyMultiplexedVm + 152);
v13 = *(_BYTE *)(AnyMultiplexedVm + 184);
if( v13 < 0 )
{
Info->Flags |= 4u;
v13 = *(_BYTE *)(AnyMultiplexedVm + 184);
}
if( (v13 & 0x40) != 0 )
Info->Flags |= 1u;
Info->PeakSizeIncludingTransitionInPages = *(_QWORD *)(v9 + 8 * v8 + 4360);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
MiUnlockWorkingSetShared(AnyMultiplexedVm, v10);
StandbyRepurposed = MiGetStandbyRepurposed((_MI_PARTITION *)v9, 1ui64);
CurrentSize = Info->CurrentSize;
Info->TransitionRePurposeCount = StandbyRepurposed;
PeakSizeIncludingTransitionInPages = Info->PeakSizeIncludingTransitionInPages;
v17 = CurrentSize + *(_QWORD *)(v9 + 4352);
Info->CurrentSizeIncludingTransitionInPages = v17;
if( v17 > PeakSizeIncludingTransitionInPages )
Info->CurrentSizeIncludingTransitionInPages = PeakSizeIncludingTransitionInPages;
Info->PeakSize <<= 12;
Info->CurrentSize = CurrentSize << 12;
}Referenced by:
ExpQuerySystemInformation