KeSetSchedulingGroupWeights

INT64 __fastcall KeSetSchedulingGroupWeights(UINT64 a1, INT64 a2, INT64 a3){
  __int64 v3; 
  INT64 v6; 
  INT64 v7; 
  int v8; 
  _QWORD *v9; 
  __int64 v10; 
  INT64 result; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  v3 = (unsigned int)a1;
  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock(&KiSchedulingGroupLock, &LockHandle);
  if( (_DWORD)v3 )
  {
    v6 = a2;
    v7 = a3 - a2;
    do
    {
      v8 = *(_DWORD *)(*(_QWORD *)v6 + 4i64);
      if( (v8 & 1) != 0 )
      {
        *(_DWORD *)(*(_QWORD *)v6 + 4i64) = v8 & 0xFFFFFFFE;
        if( KiUpdateMinimumWeight(1, 0, *(_DWORD **)(*(_QWORD *)v6 + 96i64)) )
          KiAssignSchedulingGroupWeights(1, 0, *(_QWORD *)(*(_QWORD *)v6 + 96i64));
      }
      v9 = *(_QWORD **)v6;
      v10 = *(_QWORD *)(v7 + v6);
      v6 += 8i64;
      *v9 = v10;
      --v3;
    }
    while( v3 );
  }
  KiUpdateMinimumWeight(0, 1, *(_DWORD **)(*(_QWORD *)a2 + 96i64));
  KiAssignSchedulingGroupWeights(0, 1, *(_QWORD *)(*(_QWORD *)a2 + 96i64));
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  result = (unsigned int)KiIrqlFlags;
  __writecr8(LockHandle.OldIrql);
  return result;
}

Referenced by:

NtSetInformationJobObject
PsSetCpuQuotaInformation