PspSetJobRateControl

NTSTATUS __stdcall PspSetJobRateControl(_EJOB *Job, UINT64 TypeSetFlags){
  char v2; 
  int v3; 
  int v4; 
  int v5; 
  _JOB_RATE_CONTROL_HEADER *v6; 
  int v7; 
  _JOB_RATE_CONTROL_HEADER *RateControl; 
  _EJOB *v10; 
  _EJOB *v11; 
  _EJOB *v13; 
  INT64 JobPostCallback[2]; 
  __int128 v15; 
  VOID *v16; 
  UINT64 v17; 

  v3 = *((_DWORD *)Job + 330);
  v16 = 0i64;
  v4 = 0;
  v5 = v3 & 0x4000000;
  v6 = 0i64;
  v7 = v3 & 0x2000000;
  *(_OWORD *)JobPostCallback = 0i64;
  v15 = 0i64;
  if( (v2 & 1) != 0 )
  {
    if( !v5 )
    {
      if( v7 )
      {
        v4 = -1073741637;
        goto LABEL_15;
      }
      RateControl = PspAllocateRateControl(PspJobMinRateControl);
      v6 = RateControl;
      if( !RateControl )
      {
        v4 = -1073741801;
        goto LABEL_15;
      }
      *((_QWORD *)Job + 164) = RateControl;
      _InterlockedOr((volatile signed __int32 *)Job + 330, 0x4000000u);
      PspModifyAncestorBits(Job, 0x2000000ui64, 1u);
    }
    LODWORD(v16) = 0;
    LODWORD(v13) = 5;
    BYTE4(v16) = 1;
    v4 = PspEnumJobsAndProcessesInJobHierarchy(
           Job,
           (INT64 *)PspSetRateControlJobPreCallback,
           0i64,
           PspSetRateControlProcessCallback,
           JobPostCallback,
           v13,
           (VOID *)JobPostCallback[0],
           (INT64 *)JobPostCallback[1],
           (_EPROCESS *)v15,
           Job,
           v16,
           v17);
  }
  else
  {
    if( !v5 )
    {
      v4 = -1073741811;
      goto LABEL_15;
    }
    PspRemoveRateControl(Job);
  }
  if( v4 >= 0 )
    return v4;
  if( v6 )
    PspFreeRateControl(v6, PspJobMinRateControl);
LABEL_15:
  *((_QWORD *)Job + 164) = 0i64;
  _InterlockedAnd((volatile signed __int32 *)Job + 330, 0xFBFFFFFF);
  if( !v7 )
  {
    PspModifyAncestorBits(Job, 0x2000000ui64, 0);
    JobPostCallback[0] &= (unsigned __int64)v10;
    JobPostCallback[1] &= (unsigned __int64)v10;
    LODWORD(v16) = (unsigned int)v10 & (unsigned int)v16;
    LODWORD(v13) = 5;
    BYTE4(v16) = (_BYTE)v10;
    PspEnumJobsAndProcessesInJobHierarchy(
      v11,
      (INT64 *)PspSetRateControlJobPreCallback,
      v10,
      PspSetRateControlProcessCallback,
      JobPostCallback,
      v13,
      (VOID *)JobPostCallback[0],
      (INT64 *)JobPostCallback[1],
      0i64,
      0i64,
      v16,
      v17);
  }
  return v4;
}

Referenced by:

PspSetNetRateControl