PspSetNetRateControl
INT64 __stdcall PspSetNetRateControl(PVOID JobObjectInformation, UINT64 JobObjectInformationLength, _EJOB *Job){
char v4;
int v5;
int v6;
int v7;
int v8;
int v9;
_ETHREAD *CurrentThread;
unsigned int JobFlags;
int v12;
UINT64 v13;
int v14;
struct _JOB_NET_RATE_CONTROL *NetRateControl;
_EJOB *RootJob;
INT64 v18;
int v19;
_DWORD v20[5];
__int64 v21;
__int128 v22;
__int128 JobObjectInformationa;
__int64 v24;
JobObjectInformationa = 0i64;
v24 = 0i64;
v22 = 0i64;
RootJob = 0i64;
v4 = 0;
memmove((UINT8 *)&v22, (UINT8 *)JobObjectInformation, (unsigned int)JobObjectInformationLength);
if( (DWORD2(v22) & 0xFFFFFFF8) == 0 )
{
v6 = BYTE8(v22) & 1;
if( (BYTE8(v22) & 1) != 0 )
{
v7 = BYTE8(v22) & 4;
if( (BYTE8(v22) & 4) != 0 && BYTE12(v22) > 0x40u )
return(unsigned int)-1073741811;
v8 = BYTE8(v22) & 4;
if( (BYTE8(v22) & 6) == 0 )
return(unsigned int)-1073741811;
}
else
{
v7 = BYTE8(v22) & 4;
v8 = v7;
}
v18 = 0i64;
memset(v20, 0, 12);
v21 = 0i64;
*(_QWORD *)&v20[3] = &Job->ContainerId;
v19 = 0;
v9 = BYTE8(v22) & 2;
if( (BYTE8(v22) & 2) != 0 )
{
LODWORD(v21) = v21 | 0x10;
*(_QWORD *)&v20[1] = v22;
}
if( v8 )
{
LODWORD(v21) = v21 | 8;
BYTE4(v21) = BYTE12(v22);
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PspLockRootJobExclusive(Job, CurrentThread, &RootJob);
PspLockJobConditionally(Job, &RootJob);
JobFlags = Job->JobFlags;
v12 = JobFlags & 0x2000000;
v13 = JobFlags & 0x4000000;
if( (_DWORD)v13 )
v18 = *((_QWORD *)Job->NetRateControl + 7);
if( (_BYTE)v6 )
{
if( v12 )
{
if( (_DWORD)v13 )
LODWORD(v21) = v21 | 2;
}
else
{
LODWORD(v21) = v21 | 1;
}
}
else if( (_DWORD)v13 )
{
LODWORD(v21) = v21 | 4;
}
if( (v21 & 1) != 0 )
{
v5 = PspSetJobRateControl(Job, v13);
if( v5 < 0 )
goto LABEL_36;
v4 = 1;
v14 = PspNetRateControlDispatch((INT64)&v18);
}
else
{
if( (v21 & 7) != 0 )
{
v5 = PspNetRateControlDispatch((INT64)&v18);
if( v5 < 0 )
goto LABEL_36;
}
v14 = PspSetJobRateControl(Job, v13);
}
v5 = v14;
if( v14 < 0 )
goto LABEL_37;
if( v6 )
{
if( v9 )
{
*((_DWORD *)Job->NetRateControl + 12) |= 1u;
*((_QWORD *)Job->NetRateControl + 5) = *(_QWORD *)&v20[1];
}
if( v7 )
{
*((_DWORD *)Job->NetRateControl + 12) |= 2u;
*((_BYTE *)Job->NetRateControl + 64) = BYTE4(v21);
}
*((_QWORD *)Job->NetRateControl + 7) = v18;
NetRateControl = Job->NetRateControl;
LODWORD(JobObjectInformationa) = *((_DWORD *)NetRateControl + 12);
*((_QWORD *)&JobObjectInformationa + 1) = *((_QWORD *)NetRateControl + 5);
LOBYTE(v24) = *((_BYTE *)NetRateControl + 64);
}
LABEL_36:
if( v5 >= 0 )
{
LABEL_39:
PspUnlockJobConditionally(Job, &RootJob);
PspUnlockJob((__int64)RootJob, (__int64)CurrentThread);
return(unsigned int)v5;
}
LABEL_37:
if( v4 )
PspSetJobRateControl(Job, v13);
goto LABEL_39;
}
return(unsigned int)-1073741811;
}Referenced by:
NtSetInformationJobObject