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