PspAddSchedulingGroupToJobChain

NTSTATUS __stdcall PspAddSchedulingGroupToJobChain(_EJOB *BaseJob, _EJOB *PolicyJob){
  __int64 *v3; 
  __int64 *PoolWithTag; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  _KSCHEDULING_GROUP *v10; 
  __int64 v11; 
  __int64 **v12; 
  CHAR *RateControl; 
  __int64 *v15; 
  __int64 v16; 
  _QWORD *v17; 
  __int64 v18; 
  CHAR **v19; 
  __int64 v20; 
  _QWORD *v21; 
  __int64 P[2]; 
  P[1] = (__int64)P;
  v3 = P;
  P[0] = (__int64)P;
  if( PolicyJob )
  {
    PoolWithTag = (__int64 *)ExAllocatePoolWithTag(PagedPool, 0x18ui64, 0x624A7350ui64);
    v3 = PoolWithTag;
    if( !PoolWithTag )
      return -1073741670;
    PoolWithTag[2] = (__int64)PolicyJob;
    v6 = P[0];
    if( *(__int64 **)(P[0] + 8) != P )
LABEL_15:
      __fastfail(3u);
    *v3 = P[0];
    v3[1] = (__int64)P;
    *(_QWORD *)(v6 + 8) = v3;
    P[0] = (__int64)v3;
  }
  if( !BaseJob )
    goto LABEL_6;
  while( 1 )
  {
    if( (BaseJob->JobFlags & 0x20) != 0 )
      goto LABEL_6;
    RateControl = PspAllocateRateControl(2i64);
    BaseJob->CpuRateControl = (struct _JOB_CPU_RATE_CONTROL *)RateControl;
    if( !RateControl )
      break;
    *((_DWORD *)RateControl + 33) |= 3u;
    *((_DWORD *)RateControl + 32) = 655370000;
    *((_DWORD *)BaseJob->CpuRateControl + 11) = *((_DWORD *)RateControl + 32);
    *((_DWORD *)BaseJob->CpuRateControl + 10) |= 0x40u;
    v15 = (__int64 *)ExAllocatePoolWithTag(PagedPool, 0x18ui64, 0x624A7350ui64);
    v3 = v15;
    if( !v15 )
    {
      PspFreeRateControl((CHAR **)BaseJob->CpuRateControl, 2i64);
      BaseJob->CpuRateControl = 0i64;
      break;
    }
    _InterlockedOr((volatile signed __int32 *)&BaseJob->1320, 0x20u);
    v15[2] = (__int64)BaseJob;
    v16 = P[0];
    if( *(__int64 **)(P[0] + 8) != P )
      goto LABEL_15;
    *v3 = P[0];
    v3[1] = (__int64)P;
    *(_QWORD *)(v16 + 8) = v3;
    P[0] = (__int64)v3;
    BaseJob = BaseJob->ParentJob;
    if( !BaseJob )
    {
LABEL_6:
      while( v3 != P )
      {
        v7 = v3[2];
        v8 = *(_QWORD *)(v7 + 1072);
        v9 = *(_QWORD *)(v7 + 1008);
        if( v8 )
        {
          v10 = (_KSCHEDULING_GROUP *)(*(_QWORD *)(v8 + 1008) + 128i64);
        }
        else
        {
          v10 = *(_KSCHEDULING_GROUP **)(v7 + 1016);
          if( PsCpuFairShareEnabled && v10 )
            ObfReferenceObjectWithTag(*(PVOID *)(v7 + 1112), 0x624A7350u);
        }
        KeInsertSchedulingGroup((_KSCHEDULING_GROUP *)(v9 + 128), *(_KSCHEDULING_GROUP_POLICY *)(v9 + 128), v10);
        if( *(_QWORD *)(v7 + 1016) )
          PspEnumJobsAndProcessesInJobHierarchy(
            (PVOID)v7,
            PspSetCpuRateControlJobPreCallback,
            (unsigned int(__fastcall *)(__int64, __int64))PspSetCpuRateControlJobPostCallback,
            0i64,
            0i64,
            8);
        PspEnumJobsAndProcessesInJobHierarchy(
          (PVOID)v7,
          PspSetCpuRateControlJobPreCallback,
          (unsigned int(__fastcall *)(__int64, __int64))PspSetCpuRateControlJobPostCallback,
          0i64,
          *(_QWORD *)(v7 + 1008),
          8);
        v11 = *v3;
        if( *(__int64 **)(*v3 + 8) != v3 )
          goto LABEL_15;
        v12 = (__int64 **)v3[1];
        if( *v12 != v3 )
          goto LABEL_15;
        *v12 = (__int64 *)v11;
        *(_QWORD *)(v11 + 8) = v12;
        ExFreePoolWithTag(v3, 0x624A7350u);
        v3 = (__int64 *)P[0];
      }
      return 0;
    }
  }
  while( 1 )
  {
    v17 = (_QWORD *)P[0];
    if( (__int64 *)P[0] == P )
      return -1073741670;
    v18 = *(_QWORD *)(P[0] + 16);
    v19 = *(CHAR ***)(v18 + 1008);
    if( v19 )
    {
      PspFreeRateControl(v19, 2i64);
      *(_QWORD *)(v18 + 1008) = 0i64;
      _InterlockedAnd((volatile signed __int32 *)(v18 + 1320), 0xFFFFFFDF);
    }
    v20 = *v17;
    if( *(_QWORD **)(*v17 + 8i64) != v17 )
      goto LABEL_15;
    v21 = (_QWORD *)v17[1];
    if( (_QWORD *)*v21 != v17 )
      goto LABEL_15;
    *v21 = v20;
    *(_QWORD *)(v20 + 8) = v21;
    ExFreePoolWithTag(v17, 0x624A7350u);
  }
}

Referenced by:

NtSetInformationJobObject
PspEstablishJobHierarchy