PspApplyWorkingSetLimits
VOID __stdcall PspApplyWorkingSetLimits(_EJOB *Job, _LIST_ENTRY *WorkingSetChangeList){
__int64 v3;
__int64 v4;
_QWORD *v5;
VOID **v6;
__int64 v7;
PVOID P;
PVOID *p_P;
_KAPC_STATE ApcState;
p_P = &P;
P = &P;
memset(&ApcState, 0, sizeof(ApcState));
while( 1 )
{
v3 = PspWorkingSetChangeHead;
if( (__int64 *)PspWorkingSetChangeHead == &PspWorkingSetChangeHead )
break;
if( *(__int64 **)(PspWorkingSetChangeHead + 8) != &PspWorkingSetChangeHead
|| (v4 = *(_QWORD *)PspWorkingSetChangeHead,
*(_QWORD *)(*(_QWORD *)PspWorkingSetChangeHead + 8i64) != PspWorkingSetChangeHead)
|| (PspWorkingSetChangeHead = *(_QWORD *)PspWorkingSetChangeHead,
*(_QWORD *)(v4 + 8) = &PspWorkingSetChangeHead,
v5 = p_P,
*p_P != &P) )
{
LABEL_12:
__fastfail(3u);
}
*(_QWORD *)(v3 + 8) = p_P;
*(_QWORD *)v3 = &P;
*v5 = v3;
p_P = (PVOID *)v3;
KeStackAttachProcess(*(PRKPROCESS *)(v3 + 16), &ApcState);
MmAdjustWorkingSetSize(*(_QWORD *)(v3 + 24), *(_QWORD *)(v3 + 32), 0i64, 1u);
MmEnforceWorkingSetLimit(*(_EPROCESS **)(v3 + 16), 1ui64);
KeUnstackDetachProcess(&ApcState);
}
_InterlockedAnd((volatile signed __int32 *)Job + 330, 0xFFFFFEFF);
PspUnlockWorkingSetChangeExclusiveUnsafe();
while( 1 )
{
v6 = (VOID **)P;
if( P == &P )
break;
if( *((PVOID **)P + 1) != &P )
goto LABEL_12;
v7 = *(_QWORD *)P;
if( *(PVOID *)(*(_QWORD *)P + 8i64) != P )
goto LABEL_12;
P = *(PVOID *)P;
*(_QWORD *)(v7 + 8) = &P;
ObfDereferenceObjectWithTag(v6[2], 0x624A7350ui64);
ExFreePoolWithTag(v6, 0x72437350u);
}
}Referenced by:
NtSetInformationJobObject
PspSetJobLimitsJobPostCallback