KeSetProcessSchedulingGroup

_KSCHEDULING_GROUP *__stdcall KeSetProcessSchedulingGroup(
        _EPROCESS *TargetProcess,
        _KSCHEDULING_GROUP *SchedulingGroup){
  unsigned __int8 CurrentIrql; 
  _KSCHEDULING_GROUP *v5; 
  _EPROCESS *i; 

  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&TargetProcess->Pcb.ProcessLock);
  v5 = TargetProcess->Pcb.SchedulingGroup;
  if( v5 != SchedulingGroup )
  {
    for( i = (_EPROCESS *)TargetProcess->Pcb.ThreadListHead.Flink;
          i != (_EPROCESS *)&TargetProcess->Pcb.ThreadListHead;
          i = *(_EPROCESS **)i->Pcb.gap0 )
    {
      if( *((_KSCHEDULING_GROUP **)&i[-1].Vm.Shared.ShadowMapping + 5) != SchedulingGroup )
        KiSetThreadSchedulingGroup((_KTHREAD *)&i[-1].Vm.Shared.ReleasedCommitDebt, SchedulingGroup);
    }
    TargetProcess->Pcb.SchedulingGroup = SchedulingGroup;
  }
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&TargetProcess->Pcb.ProcessLock);
  __writecr8(CurrentIrql);
  return v5;
}

Referenced by:

PspSetProcessSchedulingGroup
PspTerminateProcess