PspSetJobIoAttribution
NTSTATUS __stdcall PspSetJobIoAttribution(_EJOB *Job, UINT8 Enable, UINT8 UserReference, UINT64 NumberOfReferences){
char v4;
unsigned int v5;
unsigned int v9;
unsigned int v10;
EX_RUNDOWN_REF *v11;
void *DiskIoAttributionContext;
NTSTATUS v13;
EVENT_DESCRIPTOR *v14;
UINT64 v15;
unsigned int DiskIoAttributionUserRefCount;
unsigned int v18;
unsigned int DiskIoAttributionRefCount;
unsigned int JobId;
NTSTATUS v21;
void *v22;
__int64 v23[2];
__int64 v24;
EVENT_DATA_DESCRIPTOR UserData;
__int64 *v26;
int v27;
int v28;
int *v29;
int v30;
int v31;
v4 = 0;
v24 = 0i64;
v5 = NumberOfReferences;
*(_OWORD *)v23 = 0i64;
if( !Enable )
{
if( !UserReference )
goto LABEL_22;
DiskIoAttributionUserRefCount = Job->DiskIoAttributionUserRefCount;
if( DiskIoAttributionUserRefCount < (unsigned int)NumberOfReferences )
{
DiskIoAttributionContext = 0i64;
v13 = -1073741811;
goto LABEL_14;
}
v18 = DiskIoAttributionUserRefCount - NumberOfReferences;
Job->DiskIoAttributionUserRefCount = v18;
if( v18 )
{
DiskIoAttributionContext = Job->DiskIoAttributionContext;
}
else
{
LABEL_22:
DiskIoAttributionRefCount = Job->DiskIoAttributionRefCount;
DiskIoAttributionContext = Job->DiskIoAttributionContext;
if( DiskIoAttributionRefCount > (unsigned int)NumberOfReferences )
{
Job->DiskIoAttributionRefCount = DiskIoAttributionRefCount - NumberOfReferences;
}
else
{
PspRemoveIoAttribution(Job);
Job->DiskIoAttributionRefCount = 0;
}
}
goto LABEL_11;
}
if( PspIsSetJobIoAttribution(Job, Enable, 0) )
{
DiskIoAttributionContext = 0i64;
v13 = -1073741637;
goto LABEL_14;
}
if( UserReference )
{
v9 = Job->DiskIoAttributionUserRefCount;
if( v9 + v5 < v9 )
{
DiskIoAttributionContext = 0i64;
v13 = -1073741670;
goto LABEL_14;
}
if( v9 )
{
Job->DiskIoAttributionUserRefCount = v9 + v5;
LABEL_26:
DiskIoAttributionContext = Job->DiskIoAttributionContext;
goto LABEL_11;
}
Job->DiskIoAttributionUserRefCount = v5;
v4 = 1;
}
v10 = Job->DiskIoAttributionRefCount;
if( v10 + v5 < v10 )
{
DiskIoAttributionContext = 0i64;
v13 = -1073741670;
goto LABEL_12;
}
if( v10 )
{
Job->DiskIoAttributionRefCount = v10 + v5;
goto LABEL_26;
}
v11 = IoDiskIoAttributionAllocate(Job, 0i64);
DiskIoAttributionContext = v11;
if( v11 )
{
IoStartDiskIoAttributionForContext(v11);
v23[0] = (__int64)DiskIoAttributionContext;
LOBYTE(v24) = 1;
v23[1] = (__int64)Job;
PspEnumJobsAndProcessesInJobHierarchy(
Job,
PspSetJobIoAttributionJobPreCallback,
0i64,
(__int64(__fastcall *)(_QWORD *, __int64))PspSetJobIoAttributionProcessCallback,
(__int64)v23,
5);
Job->DiskIoAttributionRefCount = v5;
Job->DiskIoAttributionContext = DiskIoAttributionContext;
LABEL_11:
v4 = 0;
v13 = 0;
goto LABEL_12;
}
DiskIoAttributionContext = 0i64;
v13 = -1073741801;
LABEL_12:
if( v4 )
Job->DiskIoAttributionUserRefCount -= v5;
LABEL_14:
JobId = Job->JobId;
v14 = (EVENT_DESCRIPTOR *)PsDiskIoAttributionStart;
v22 = DiskIoAttributionContext;
v15 = *(_QWORD *)EtwpPsProvRegHandle;
if( !Enable )
v14 = (EVENT_DESCRIPTOR *)&PsDiskIoAttributionStop;
v21 = v13;
if( EtwEventEnabled(*(UINT64 *)EtwpPsProvRegHandle, v14, (EVENT_DESCRIPTOR *)UserReference) )
{
UserData.Reserved = 0;
v28 = 0;
v31 = 0;
UserData.Ptr = (unsigned __int64)&JobId;
UserData.Size = 4;
v26 = (__int64 *)&v22;
v30 = 4;
v29 = &v21;
v27 = 8;
EtwWrite(v15, v14, 0i64, 3ui64, &UserData);
}
return v13;
}Referenced by:
NtSetInformationJobObject
PspSetJobIoRateControl