PspSetNetRateControl
NTSTATUS __stdcall PspSetNetRateControl(VOID *JobObjectInformation, UINT64 JobObjectInformationLength, _EJOB *Job){
char v4;
int v5;
int v6;
int v7;
int v8;
int v9;
_ETHREAD *CurrentThread;
int v11;
int v12;
UINT64 v13;
NTSTATUS v14;
__int64 v15;
_EJOB *RootJob;
_SYSTEM_NET_RATE_CONTROL_CONTEXT_HEADER Header;
int v19;
_DWORD v20[5];
__int64 v21;
__int128 v22;
__int128 JobObjectInformationa;
__int64 v24;
JobObjectInformationa = 0i64;
v24 = 0i64;
v22 = 0i64;
RootJob = 0i64;
v4 = 0;
memmove(&v22, JobObjectInformation, 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 -1073741811;
v8 = BYTE8(v22) & 4;
if( (BYTE8(v22) & 6) == 0 )
return -1073741811;
}
else
{
v7 = BYTE8(v22) & 4;
v8 = v7;
}
Header = 0i64;
memset(v20, 0, 12);
v21 = 0i64;
*(_QWORD *)&v20[3] = (char *)Job + 1240;
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);
v11 = *((_DWORD *)Job + 330);
v12 = v11 & 0x2000000;
v13 = v11 & 0x4000000;
if( (_DWORD)v13 )
Header = *(_SYSTEM_NET_RATE_CONTROL_CONTEXT_HEADER *)(*((_QWORD *)Job + 164) + 56i64);
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(&Header);
}
else
{
if( (v21 & 7) != 0 )
{
v5 = PspNetRateControlDispatch(&Header);
if( v5 < 0 )
goto LABEL_36;
}
v14 = PspSetJobRateControl(Job, v13);
}
v5 = v14;
if( v14 < 0 )
goto LABEL_37;
if( v6 )
{
if( v9 )
{
*(_DWORD *)(*((_QWORD *)Job + 164) + 48i64) |= 1u;
*(_QWORD *)(*((_QWORD *)Job + 164) + 40i64) = *(_QWORD *)&v20[1];
}
if( v7 )
{
*(_DWORD *)(*((_QWORD *)Job + 164) + 48i64) |= 2u;
*(_BYTE *)(*((_QWORD *)Job + 164) + 64i64) = BYTE4(v21);
}
*(_SYSTEM_NET_RATE_CONTROL_CONTEXT_HEADER *)(*((_QWORD *)Job + 164) + 56i64) = Header;
v15 = *((_QWORD *)Job + 164);
LODWORD(JobObjectInformationa) = *(_DWORD *)(v15 + 48);
*((_QWORD *)&JobObjectInformationa + 1) = *(_QWORD *)(v15 + 40);
LOBYTE(v24) = *(_BYTE *)(v15 + 64);
}
LABEL_36:
if( v5 >= 0 )
{
LABEL_39:
PspUnlockJobConditionally(Job, &RootJob);
PspUnlockJob(RootJob, CurrentThread);
return v5;
}
LABEL_37:
if( v4 )
PspSetJobRateControl(Job, v13);
goto LABEL_39;
}
return -1073741811;
}Referenced by:
NtSetInformationJobObject