PspSetJobRateControl
NTSTATUS __stdcall PspSetJobRateControl(_EJOB *Job, UINT64 TypeSetFlags){
char v2;
int v3;
int v4;
int v5;
_JOB_RATE_CONTROL_HEADER *v6;
int v7;
_JOB_RATE_CONTROL_HEADER *RateControl;
_EJOB *v10;
_EJOB *v11;
_EJOB *v13;
INT64 JobPostCallback[2];
__int128 v15;
VOID *v16;
UINT64 v17;
v3 = *((_DWORD *)Job + 330);
v16 = 0i64;
v4 = 0;
v5 = v3 & 0x4000000;
v6 = 0i64;
v7 = v3 & 0x2000000;
*(_OWORD *)JobPostCallback = 0i64;
v15 = 0i64;
if( (v2 & 1) != 0 )
{
if( !v5 )
{
if( v7 )
{
v4 = -1073741637;
goto LABEL_15;
}
RateControl = PspAllocateRateControl(PspJobMinRateControl);
v6 = RateControl;
if( !RateControl )
{
v4 = -1073741801;
goto LABEL_15;
}
*((_QWORD *)Job + 164) = RateControl;
_InterlockedOr((volatile signed __int32 *)Job + 330, 0x4000000u);
PspModifyAncestorBits(Job, 0x2000000ui64, 1u);
}
LODWORD(v16) = 0;
LODWORD(v13) = 5;
BYTE4(v16) = 1;
v4 = PspEnumJobsAndProcessesInJobHierarchy(
Job,
(INT64 *)PspSetRateControlJobPreCallback,
0i64,
PspSetRateControlProcessCallback,
JobPostCallback,
v13,
(VOID *)JobPostCallback[0],
(INT64 *)JobPostCallback[1],
(_EPROCESS *)v15,
Job,
v16,
v17);
}
else
{
if( !v5 )
{
v4 = -1073741811;
goto LABEL_15;
}
PspRemoveRateControl(Job);
}
if( v4 >= 0 )
return v4;
if( v6 )
PspFreeRateControl(v6, PspJobMinRateControl);
LABEL_15:
*((_QWORD *)Job + 164) = 0i64;
_InterlockedAnd((volatile signed __int32 *)Job + 330, 0xFBFFFFFF);
if( !v7 )
{
PspModifyAncestorBits(Job, 0x2000000ui64, 0);
JobPostCallback[0] &= (unsigned __int64)v10;
JobPostCallback[1] &= (unsigned __int64)v10;
LODWORD(v16) = (unsigned int)v10 & (unsigned int)v16;
LODWORD(v13) = 5;
BYTE4(v16) = (_BYTE)v10;
PspEnumJobsAndProcessesInJobHierarchy(
v11,
(INT64 *)PspSetRateControlJobPreCallback,
v10,
PspSetRateControlProcessCallback,
JobPostCallback,
v13,
(VOID *)JobPostCallback[0],
(INT64 *)JobPostCallback[1],
0i64,
0i64,
v16,
v17);
}
return v4;
}Referenced by:
PspSetNetRateControl