MmEnforceWorkingSetLimit
__int64 __fastcall MmEnforceWorkingSetLimit(ULONG_PTR a1, char a2){
INT64 v2;
int v3;
unsigned int v4;
char v5;
char v6;
INT64 *SharedVm;
KIRQL v8;
UINT8 v9;
WORK_QUEUE_TYPE v10;
PVOID v11;
char v12;
BOOL v13;
char v14;
char v15;
int v17;
struct _IO_WORKITEM LockHandle;
memset(&LockHandle.WorkItem.WorkerRoutine, 0, 24);
v2 = a1 + 1664;
v3 = 0;
v4 = 0;
v5 = a2 & 0xF7;
if( (a2 & 4) == 0 )
v5 = a2;
memset(&LockHandle.IoObject, 0, 32);
v6 = (a2 & 4) != 0 ? 0x80 : 0;
if( (v5 & 1) != 0 )
{
v5 &= ~2u;
v6 |= 0x40u;
}
if( *((_QWORD *)KeGetCurrentThread() + 23) != a1 )
{
v3 = 1;
KiStackAttachProcess((_KPROCESS *)a1, 0i64, (_KAPC_STATE *)&LockHandle.WorkItem.Parameter);
}
SharedVm = MiGetSharedVm(v2);
v8 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)&WorkerRoutine;
v9 = v8;
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)&WorkerRoutine, v10, v11);
v17 = *(_DWORD *)(v2 + 184);
v12 = v17;
if( (v5 & 8) != 0 )
{
v12 = v17 & 0x7F;
LOBYTE(v17) = v17 & 0x7F;
}
v13 = (v5 & 8) != 0;
if( (v5 & 2) != 0 )
{
v12 &= ~0x40u;
v13 = 1;
LOBYTE(v17) = v12;
}
v14 = v6 | 0x80;
if( v12 >= 0 )
v14 = v6;
v15 = v14 | 0x40;
if( (v12 & 0x40) == 0 )
v15 = v14;
if( (v15 & 0x80) != 0
&& (v15 & 0x40) != 0
&& (unsigned __int64)(*(_QWORD *)(v2 + 112) + 6i64) >= *(_QWORD *)(v2 + 152) )
{
v5 = -6;
v4 = -1073741748;
}
if( (v5 & 4) != 0 )
{
v12 |= 0x80u;
v13 = 1;
LOBYTE(v17) = v12;
}
if( (v5 & 1) != 0 )
{
v13 = 1;
LOBYTE(v17) = v12 | 0x40;
}
if( v13 )
*(_WORD *)(v2 + 184) = v17;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
MiUnlockWorkingSetExclusive(v2, v9);
if( v3 )
KiUnstackDetachProcess((KAPC_STATE *)&LockHandle.WorkItem.Parameter, 0i64);
return v4;
}Referenced by:
PspAddProcessToWorkingSetChangeList
PspApplyWorkingSetLimits
PspApplyWorkingSetLimitsToProcess
PspSetQuotaLimits