PspSetJobIoRateControl
NTSTATUS __stdcall PspSetJobIoRateControl(VOID *Job, _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *ControlInfo){
_ETHREAD *CurrentThread;
int v3;
__int64 v4;
_EX_PUSH_LOCK *v7;
unsigned int v8;
int v9;
char v10;
int v11;
const _EVENT_DESCRIPTOR *v12;
bool v13;
VOID *v15;
const wchar_t *v16;
UINT8 OldEntryDeactivated;
char NewEntryActivated[7];
_EJOB *RootJob;
VOID *OpaqueRateControl;
int v21;
int v22;
VOID *v23;
_EVENT_DATA_DESCRIPTOR UserData;
VOID **v25;
__int64 v26;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v27;
__int64 v28;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v29;
__int64 v30;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v31;
__int64 v32;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v33;
__int64 v34;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v35;
__int64 v36;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v37;
__int64 v38;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v39;
__int64 v40;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v41;
__int64 v42;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v43;
__int64 v44;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v45;
__int64 v46;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v47;
__int64 v48;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v49;
__int64 v50;
_JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v51;
__int64 v52;
const wchar_t *v53;
int v54;
int v55;
int *v56;
__int64 v57;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0;
v4 = -1i64;
RootJob = 0i64;
OpaqueRateControl = 0i64;
OldEntryDeactivated = 0;
--CurrentThread->Tcb.KernelApcDisable;
NewEntryActivated[0] = 0;
v7 = (_EX_PUSH_LOCK *)((char *)Job + 1512);
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Job + 189, 0i64);
v8 = 1;
if( (ControlInfo[9] & 1) != 0 )
{
PspLockRootJobExclusive((_EJOB *)Job, CurrentThread, &RootJob);
PspLockJobConditionally((_EJOB *)Job, &RootJob);
v3 = PspSetJobIoAttribution((_EJOB *)Job, 1u, 0, 1ui64);
if( v3 < 0 )
{
LABEL_12:
PspUnlockJobConditionally((_EJOB *)Job, &RootJob);
PspUnlockJob(RootJob, CurrentThread);
goto LABEL_13;
}
PspUnlockJobConditionally((_EJOB *)Job, &RootJob);
PspUnlockJob(RootJob, CurrentThread);
v3 = 0;
if( *((_QWORD *)ControlInfo + 3) )
{
v3 = PspSetJobIoRateControlForVolume(
(_EJOB *)Job,
ControlInfo,
&OldEntryDeactivated,
(UINT8 *)NewEntryActivated,
&OpaqueRateControl);
if( v3 < 0 )
goto LABEL_11;
}
else
{
if( !PspIoRateControlInfoIsAnySet(ControlInfo) )
{
if( !*((_QWORD *)Job + 180) )
goto LABEL_10;
OpaqueRateControl = (VOID *)*((_QWORD *)Job + 180);
PspIoRateEntryDeactivate((_PS_IO_CONTROL_ENTRY *)Job + 25);
LABEL_20:
v8 = 2;
LABEL_8:
if( NewEntryActivated[0] )
--v8;
goto LABEL_10;
}
PspIoRateEntryActivate((_PS_IO_CONTROL_ENTRY *)Job + 25, (_EJOB *)Job);
v3 = v9;
if( v9 < 0 )
{
LABEL_11:
PspLockRootJobExclusive((_EJOB *)Job, CurrentThread, &RootJob);
PspLockJobConditionally((_EJOB *)Job, &RootJob);
PspSetJobIoAttribution((_EJOB *)Job, 0, 0, v8);
goto LABEL_12;
}
OpaqueRateControl = (VOID *)*((_QWORD *)Job + 180);
NewEntryActivated[0] = 1;
}
v3 = 0;
if( !OldEntryDeactivated )
goto LABEL_8;
goto LABEL_20;
}
v15 = OpaqueRateControl;
if( *((_QWORD *)Job + 180) )
v15 = (VOID *)*((_QWORD *)Job + 180);
OpaqueRateControl = v15;
v8 = PspJobIoRateControlDisable((_EJOB *)Job);
LABEL_10:
if( v8 )
goto LABEL_11;
LABEL_13:
v10 = _InterlockedExchangeAdd64(&v7->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v10 & 2) != 0 && (v10 & 4) == 0 )
ExfTryToWakePushLock(v7);
KeAbPostRelease(v7);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
v23 = OpaqueRateControl;
v11 = *((_DWORD *)Job + 309);
v12 = (const _EVENT_DESCRIPTOR *)PsIoRateControlStart;
v21 = v11;
v13 = (ControlInfo[9] & 1) == 0;
v22 = v3;
if( v13 )
v12 = &PsIoRateControlStop;
if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 245), v12) )
{
v16 = L"Global";
if( *((_QWORD *)ControlInfo + 3) )
v16 = (const wchar_t *)*((_QWORD *)ControlInfo + 3);
do
++v4;
while( v16[v4] );
v53 = v16;
UserData.Ptr = (unsigned __int64)&v21;
v54 = 2 * v4 + 2;
v25 = &v23;
v55 = 0;
v29 = ControlInfo + 2;
*(_QWORD *)&UserData.Size = 4i64;
v31 = ControlInfo + 18;
v33 = ControlInfo + 4;
v35 = ControlInfo + 14;
v37 = ControlInfo + 20;
v39 = ControlInfo + 12;
v41 = ControlInfo + 16;
v43 = ControlInfo + 22;
v45 = ControlInfo + 24;
v47 = ControlInfo + 26;
v49 = ControlInfo + 28;
v56 = &v22;
v26 = 8i64;
v27 = ControlInfo;
v28 = 8i64;
v30 = 8i64;
v32 = 8i64;
v34 = 8i64;
v36 = 8i64;
v38 = 8i64;
v40 = 8i64;
v42 = 8i64;
v44 = 8i64;
v46 = 8i64;
v48 = 8i64;
v50 = 8i64;
v51 = ControlInfo + 9;
v52 = 4i64;
v57 = 4i64;
EtwWrite(*(&ExBootDevicesRemovedEvent + 245), v12, 0, 0x11u, &UserData);
}
return v3;
}Referenced by:
NtSetInformationJobObject