KiSetThreadSchedulingGroup

VOID __stdcall KiSetThreadSchedulingGroup(_ETHREAD *Thread, _KSCHEDULING_GROUP *SchedulingGroup){
  _KPRCB *CurrentPrcb; 
  _KPRCB *v5; 
  UINT8 v6; 
  UINT8 v7; 
  _KPRCB *v8; 
  _SINGLE_LIST_ENTRY ReadyList; 
  UINT64 SpinCount; 
  _KSHARED_READY_QUEUE *ControlReadyQueue; 
  _KPRCB *ControlPrcb; 

  ControlPrcb = 0i64;
  ControlReadyQueue = 0i64;
  if( SchedulingGroup )
  {
    CurrentPrcb = 0i64;
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( Thread->Tcb.ThreadLock );
    }
    KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
    Thread->Tcb.SchedulingGroup = SchedulingGroup;
    _interlockedbittestandset((volatile signed __int32 *)Thread, 0x12u);
    v5 = ControlPrcb;
    v7 = v6;
    KeUpdateThreadSchedulingProperties(&Thread->Tcb, v6, ControlPrcb);
    if( v7 == 1 && ControlReadyQueue && (*(&Thread->Tcb.MiscFlags + 1) & 0x2000) == 0 )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      KiRemoveThreadFromSharedReadyQueue(ControlReadyQueue, &Thread->Tcb, (unsigned int)Thread->Tcb.Priority);
      KiEnterDeferredReadyState((INT64)Thread);
      v5 = ControlPrcb;
    }
    KiReleaseThreadStateLock(v8, (_KSHARED_READY_QUEUE *)v5);
    KiReleaseThreadLockSafe((INT64)Thread);
    if( CurrentPrcb )
    {
      *(_QWORD *)Thread->Tcb.gapD8 = 0i64;
      ReadyList.Next = (_SINGLE_LIST_ENTRY *)Thread->Tcb.gapD8;
      KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
    }
  }
  else
  {
    KiRemoveThreadFromSchedulingGroup(&Thread->Tcb);
  }
}

Referenced by:

KeSetProcessSchedulingGroup