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