KiRemoveThreadFromSchedulingGroup

VOID __stdcall KiRemoveThreadFromSchedulingGroup(_ETHREAD *Thread){
  _ETHREAD *CurrentThread; 
  struct _KPRCB *CurrentPrcb; 
  char v4; 
  UINT8 v5; 
  UINT8 v6; 
  _KPRCB *v7; 
  _KPRCB *v8; 
  UINT64 SpinCount; 
  UINT64 v11; 
  _KPRCB *ControlPrcb; 
  _KSHARED_READY_QUEUE *ControlReadyQueue; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  ControlPrcb = 0i64;
  ControlReadyQueue = 0i64;
  CurrentPrcb = KeGetCurrentPrcb();
  if( Thread == CurrentThread )
  {
    ControlPrcb = CurrentPrcb;
    _disable();
    KiUpdateTotalCyclesCurrentThread(CurrentPrcb, &Thread->Tcb, 0i64);
    _enable();
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( CurrentPrcb->PrcbLock );
    }
    _interlockedbittestandreset((volatile signed __int32 *)Thread, 0x12u);
    Thread->Tcb.SchedulingGroup = 0i64;
    KeUpdateThreadSchedulingProperties(&Thread->Tcb, 2u, CurrentPrcb);
    _InterlockedAnd64((volatile signed __int64 *)&CurrentPrcb->PrcbLock, 0i64);
  }
  else
  {
    v4 = 0;
    LODWORD(v11) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
    {
      do
        KeYieldProcessorEx(&v11);
      while( Thread->Tcb.ThreadLock );
    }
    KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
    v6 = v5;
    if( (Thread->Tcb._bf_0 & 0x2000) != 0 )
    {
      KiRemoveThreadFromScbQueue(ControlPrcb, Thread->Tcb.QueuedScb, Thread, (unsigned int)Thread->Tcb.Priority);
      v4 = 1;
    }
    _interlockedbittestandreset((volatile signed __int32 *)Thread, 0x12u);
    Thread->Tcb.SchedulingGroup = 0i64;
    if( (*(&Thread->Tcb.MiscFlags + 1) & 0x800) != 0 )
      _interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xBu);
    v7 = ControlPrcb;
    KeUpdateThreadSchedulingProperties(&Thread->Tcb, v6, ControlPrcb);
    if( v4 )
      KiAddThreadToPrcbQueue(v7, &Thread->Tcb, (unsigned int)Thread->Tcb.Priority, 0i64, 0);
    KiReleaseThreadStateLock(v8, (_KSHARED_READY_QUEUE *)v7);
    KiReleaseThreadLockSafe((INT64)Thread);
  }
}

Referenced by:

KeTerminateThread
KiSetThreadSchedulingGroup