KeSetSchedulingGroupCpuRates

VOID __stdcall KeSetSchedulingGroupCpuRates(
        _KSCHEDULING_GROUP **SchedulingGroups,
        _KSCHEDULING_GROUP_POLICY *CpuRates,
        _KSCHEDULING_GROUP_POLICY a3){
  UINT64 v5; 
  _KPRCB *v6; 
  _KSCHEDULING_GROUP_POLICY v7; 
  int v8; 
  UINT64 v9; 
  char v10; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&KiSchedulingGroupLock, &LockHandle);
  v7 = *CpuRates;
  v8 = *(_DWORD *)(*(_QWORD *)CpuRates + 4i64);
  if( (v8 & 1) == 0 )
  {
    LOBYTE(v5) = 1;
    *(_DWORD *)(*(_QWORD *)&v7 + 4i64) = v8 | 1;
    KiUpdateMinimumWeight(WeightBased, v5, *(_KSCHEDULING_GROUP **)(*(_QWORD *)CpuRates + 96i64));
    KiAssignSchedulingGroupWeights(WeightBased, 0, *(_KSCHEDULING_GROUP **)(*(_QWORD *)CpuRates + 96i64));
    v7 = *CpuRates;
  }
  **(_QWORD **)&v7 = **(_QWORD **)&a3;
  KiUpdateCpuTargetByRate(*(_KSCHEDULING_GROUP **)CpuRates, 1u, v6);
  LOBYTE(v9) = 1;
  KiUpdateMinimumWeight(RateBased, v9, *(_KSCHEDULING_GROUP **)(*(_QWORD *)CpuRates + 96i64));
  if( v10 )
    KiAssignSchedulingGroupWeights(RateBased, 0, *(_KSCHEDULING_GROUP **)(*(_QWORD *)CpuRates + 96i64));
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

NtSetInformationJobObject