MmEnforceWorkingSetLimit
NTSTATUS __stdcall MmEnforceWorkingSetLimit(_EPROCESS *Process, UINT64 Flags){
_MMSUPPORT_FULL *p_Vm;
int v3;
NTSTATUS v4;
char v5;
char v6;
_MMSUPPORT_SHARED *SharedVm;
UINT8 v8;
UINT8 v9;
char bf_0;
_BOOL8 v11;
char v12;
char v13;
_MMSUPPORT_FLAGS v15;
_KLOCK_QUEUE_HANDLE LockQueue;
_KAPC_STATE ApcState;
*(_QWORD *)&LockQueue.OldIrql = 0i64;
p_Vm = &Process->Vm;
v3 = 0;
v4 = 0;
v5 = Flags & 0xF7;
ApcState.ApcListHead[0] = 0i64;
if( (Flags & 4) == 0 )
v5 = Flags;
memset(&ApcState.ApcListHead[1], 0, 32);
v6 = (Flags & 4) != 0 ? 0x80 : 0;
if( (v5 & 1) != 0 )
{
v5 &= ~2u;
v6 |= 0x40u;
}
if( KeGetCurrentThread()->ApcState.Process != Process )
{
v3 = 1;
KiStackAttachProcess(Process, 0i64, &ApcState);
}
SharedVm = MiGetSharedVm(&p_Vm->Instance);
v8 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)((char *)&stru_140C4DB30 + 4176);
v9 = v8;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)&stru_140C4DB30 + 522);
v15 = p_Vm->Instance.Flags;
bf_0 = v15.$9F51E323906620A7CE080F79FB124AD0::$3F85127412E45D453B47E0230FB8DC78::_bf_0;
if( (v5 & 8) != 0 )
{
bf_0 = v15.$9F51E323906620A7CE080F79FB124AD0::$3F85127412E45D453B47E0230FB8DC78::_bf_0 & 0x7F;
v15.$9F51E323906620A7CE080F79FB124AD0::$3F85127412E45D453B47E0230FB8DC78::_bf_0 &= ~0x80u;
}
v11 = (v5 & 8) != 0;
if( (v5 & 2) != 0 )
{
bf_0 &= ~0x40u;
LODWORD(v11) = 1;
v15.$9F51E323906620A7CE080F79FB124AD0::$3F85127412E45D453B47E0230FB8DC78::_bf_0 = bf_0;
}
v12 = v6 | 0x80;
if( bf_0 >= 0 )
v12 = v6;
v13 = v12 | 0x40;
if( (bf_0 & 0x40) == 0 )
v13 = v12;
if( (v13 & 0x80) != 0
&& (v13 & 0x40) != 0
&& p_Vm->Instance.MinimumWorkingSetSize + 6 >= p_Vm->Instance.MaximumWorkingSetSize )
{
v5 = -6;
v4 = -1073741748;
}
if( (v5 & 4) != 0 )
{
bf_0 |= 0x80u;
LODWORD(v11) = 1;
v15.$9F51E323906620A7CE080F79FB124AD0::$3F85127412E45D453B47E0230FB8DC78::_bf_0 = bf_0;
}
if( (v5 & 1) != 0 )
{
LODWORD(v11) = 1;
v15.$9F51E323906620A7CE080F79FB124AD0::$3F85127412E45D453B47E0230FB8DC78::_bf_0 = bf_0 | 0x40;
}
if( v11 )
p_Vm->Instance.Flags.u1 = v15.u1;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
MiUnlockWorkingSetExclusive(&p_Vm->Instance, v9);
if( v3 )
KiUnstackDetachProcess(&ApcState, 0i64);
return v4;
}Referenced by:
PspAddProcessToWorkingSetChangeList
PspApplyWorkingSetLimits
PspApplyWorkingSetLimitsToProcess
PspSetQuotaLimits