KeSetSchedulingGroupCpuRates

VOID __fastcall KeSetSchedulingGroupCpuRates(
        UINT64 Count,
        _KSCHEDULING_GROUP **SchedulingGroups,
        _KSCHEDULING_GROUP_POLICY *CpuRates){
  _KSCHEDULING_GROUP *v5; 
  unsigned int AllFlags; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock(&KiSchedulingGroupLock, &LockHandle);
  v5 = *SchedulingGroups;
  AllFlags = (*SchedulingGroups)->Policy.AllFlags;
  if( (AllFlags & 1) == 0 )
  {
    v5->Policy.AllFlags = AllFlags | 1;
    KiUpdateMinimumWeight(0, 1, &(*SchedulingGroups)->Parent->Policy);
    KiAssignSchedulingGroupWeights(0, 0, (__int64)(*SchedulingGroups)->Parent);
    v5 = *SchedulingGroups;
  }
  v5->Policy = *CpuRates;
  KiUpdateCpuTargetByRate(*SchedulingGroups, 1u);
  if( KiUpdateMinimumWeight(1, 1, &(*SchedulingGroups)->Parent->Policy) )
    KiAssignSchedulingGroupWeights(1, 0, (__int64)(*SchedulingGroups)->Parent);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

NtSetInformationJobObject