MmQuerySystemWorkingSetInformation
VOID *__fastcall MmQuerySystemWorkingSetInformation(int a1, unsigned __int64 *a2){
VOID *result;
_MI_WORKING_SET_TYPE v5;
int v6;
int v7;
_MMSUPPORT_INSTANCE *v8;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
__int64 v10;
_MI_PARTITION *v11;
char v12;
char v13;
char bf_0;
UINT64 v15;
NTSTATUS StandbyRepurposed;
unsigned __int64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
_KLOCK_QUEUE_HANDLE LockQueue;
result = 0i64;
*((_DWORD *)a2 + 15) = 0;
memset(&LockQueue, 0, sizeof(LockQueue));
v5 = MiWorkingSetTypePagedPool;
v6 = a1 - 2;
if( v6 )
{
v19 = (unsigned int)(v6 - 1);
if( (_DWORD)v19 )
{
if( (_DWORD)v19 != 1 )
return result;
v5 = MiWorkingSetTypeSystemViews;
}
AnyMultiplexedVm = MiGetAnyMultiplexedVm(v5, (VOID *)v19);
}
else
{
MiGetCurrentMultiplexedVm();
AnyMultiplexedVm = v8;
if( !v8 )
return memset(a2, 0i64, 0x40u);
}
v10 = (unsigned int)(v7 - 2);
v11 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * AnyMultiplexedVm->PartitionId);
MiLockWorkingSetShared();
v13 = v12;
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = &MiGetSharedVm(AnyMultiplexedVm)->WorkingSetCoreLock;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, LockQueue.LockQueue.Lock);
*a2 = AnyMultiplexedVm->WorkingSetLeafSize;
a2[1] = AnyMultiplexedVm->PeakWorkingSetSize;
*((_DWORD *)a2 + 4) = AnyMultiplexedVm->PageFaultCount;
a2[3] = AnyMultiplexedVm->MinimumWorkingSetSize;
a2[4] = AnyMultiplexedVm->MaximumWorkingSetSize;
bf_0 = AnyMultiplexedVm->Flags._bf_0;
if( bf_0 < 0 )
{
*((_DWORD *)a2 + 15) |= 4u;
bf_0 = AnyMultiplexedVm->Flags._bf_0;
}
if( (bf_0 & 0x40) != 0 )
*((_DWORD *)a2 + 15) |= 1u;
a2[6] = v11->PageLists.TransitionSharedPagesPeak[v10];
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
LOBYTE(v15) = v13;
MiUnlockWorkingSetShared(AnyMultiplexedVm, v15);
StandbyRepurposed = MiGetStandbyRepurposed(v11, 1ui64);
v17 = *a2;
*((_DWORD *)a2 + 14) = StandbyRepurposed;
result = (VOID *)a2[6];
v18 = v17 + v11->PageLists.TransitionSharedPages;
a2[5] = v18;
if( v18 > (unsigned __int64)result )
a2[5] = (unsigned __int64)result;
a2[1] <<= 12;
*a2 = v17 << 12;
return result;
}Referenced by:
ExpQuerySystemInformation