PspSetJobIoAttribution
NTSTATUS __stdcall PspSetJobIoAttribution(_EJOB *Job, UINT8 Enable, UINT8 UserReference, UINT64 NumberOfReferences){
char v4;
int v5;
unsigned int v9;
unsigned int v10;
_EPROCESS *v11;
_EPROCESS *v12;
NTSTATUS v13;
const _EVENT_DESCRIPTOR *v14;
REGHANDLE v15;
unsigned int v17;
int v18;
unsigned int v19;
_EJOB *v20;
VOID *v21;
INT64 *v22;
_EPROCESS *v23;
INT64 JobPostCallback[2];
UINT64 v25;
_EVENT_DATA_DESCRIPTOR UserData;
_EPROCESS **v27;
int v28;
int v29;
INT64 **v30;
int v31;
int v32;
v4 = 0;
v25 = 0i64;
v5 = NumberOfReferences;
*(_OWORD *)JobPostCallback = 0i64;
if( !Enable )
{
if( !UserReference )
goto LABEL_22;
v17 = *((_DWORD *)Job + 336);
if( v17 < (unsigned int)NumberOfReferences )
{
v12 = 0i64;
v13 = -1073741811;
goto LABEL_14;
}
v18 = v17 - NumberOfReferences;
*((_DWORD *)Job + 336) = v18;
if( v18 )
{
v12 = (_EPROCESS *)*((_QWORD *)Job + 169);
}
else
{
LABEL_22:
v19 = *((_DWORD *)Job + 337);
v12 = (_EPROCESS *)*((_QWORD *)Job + 169);
if( v19 > (unsigned int)NumberOfReferences )
{
*((_DWORD *)Job + 337) = v19 - NumberOfReferences;
}
else
{
PspRemoveIoAttribution(Job);
*((_DWORD *)Job + 337) = 0;
}
}
goto LABEL_11;
}
if( PspIsSetJobIoAttribution(Job, Enable) )
{
v12 = 0i64;
v13 = -1073741637;
goto LABEL_14;
}
if( UserReference )
{
v9 = *((_DWORD *)Job + 336);
if( v9 + v5 < v9 )
{
v12 = 0i64;
v13 = -1073741670;
goto LABEL_14;
}
if( v9 )
{
*((_DWORD *)Job + 336) = v9 + v5;
LABEL_26:
v12 = (_EPROCESS *)*((_QWORD *)Job + 169);
goto LABEL_11;
}
*((_DWORD *)Job + 336) = v5;
v4 = 1;
}
v10 = *((_DWORD *)Job + 337);
if( v10 + v5 < v10 )
{
v12 = 0i64;
v13 = -1073741670;
goto LABEL_12;
}
if( v10 )
{
*((_DWORD *)Job + 337) = v10 + v5;
goto LABEL_26;
}
v11 = (_EPROCESS *)IoDiskIoAttributionAllocate(Job, 0i64);
v12 = v11;
if( v11 )
{
IoStartDiskIoAttributionForContext(v11);
LODWORD(v20) = 5;
LOBYTE(v25) = 1;
PspEnumJobsAndProcessesInJobHierarchy(
Job,
(INT64 *)PspSetJobIoAttributionJobPreCallback,
0i64,
PspSetJobIoAttributionProcessCallback,
JobPostCallback,
v20,
v21,
v22,
v23,
v12,
Job,
v25);
*((_DWORD *)Job + 337) = v5;
*((_QWORD *)Job + 169) = v12;
LABEL_11:
v4 = 0;
v13 = 0;
goto LABEL_12;
}
v12 = 0i64;
v13 = -1073741801;
LABEL_12:
if( v4 )
*((_DWORD *)Job + 336) -= v5;
LABEL_14:
LODWORD(v21) = *((_DWORD *)Job + 309);
v14 = (const _EVENT_DESCRIPTOR *)PsDiskIoAttributionStart;
v23 = v12;
v15 = *(&ExBootDevicesRemovedEvent + 245);
if( !Enable )
v14 = &PsDiskIoAttributionStop;
LODWORD(v22) = v13;
if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 245), v14) )
{
UserData.Reserved = 0;
v29 = 0;
v32 = 0;
UserData.Ptr = (unsigned __int64)&v21;
UserData.Size = 4;
v27 = &v23;
v31 = 4;
v30 = &v22;
v28 = 8;
EtwWrite(v15, v14, 0, 3u, &UserData);
}
return v13;
}Referenced by:
NtSetInformationJobObject
PspSetJobIoRateControl