KiRemoveThreadFromSchedulingGroup

void __fastcall KiRemoveThreadFromSchedulingGroup(__int64 a1){
  _ETHREAD *CurrentThread; 
  struct _KPRCB *CurrentPrcb; 
  char v4; 
  UINT8 v5; 
  UINT8 v6; 
  _KPRCB *v7; 
  __int64 v8; 
  UINT64 SpinCount; 
  UINT64 v11; 
  _KPRCB *ControlPrcb; 
  _KSHARED_READY_QUEUE *ControlReadyQueue; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  ControlPrcb = 0i64;
  ControlReadyQueue = 0i64;
  CurrentPrcb = KeGetCurrentPrcb();
  if( (_ETHREAD *)a1 == CurrentThread )
  {
    ControlPrcb = CurrentPrcb;
    _disable();
    KiUpdateTotalCyclesCurrentThread((__int64)CurrentPrcb, a1, 0i64);
    _enable();
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((_QWORD *)CurrentPrcb + 6) );
    }
    _interlockedbittestandreset((volatile signed __int32 *)a1, 0x12u);
    *(_QWORD *)(a1 + 104) = 0i64;
    KeUpdateThreadSchedulingProperties((_KTHREAD *)a1, 2u, CurrentPrcb);
    _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
  }
  else
  {
    v4 = 0;
    LODWORD(v11) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
    {
      do
        KeYieldProcessorEx(&v11);
      while( *(_QWORD *)(a1 + 64) );
    }
    KiAcquireThreadStateLock((_ETHREAD *)a1, &ControlPrcb, &ControlReadyQueue);
    v6 = v5;
    if( (*(_DWORD *)(a1 + 116) & 0x2000) != 0 )
    {
      KiRemoveThreadFromScbQueue(ControlPrcb, *(_QWORD *)(a1 + 944), a1);
      v4 = 1;
    }
    _interlockedbittestandreset((volatile signed __int32 *)a1, 0x12u);
    *(_QWORD *)(a1 + 104) = 0i64;
    if( (*(_DWORD *)(a1 + 120) & 0x800) != 0 )
      _interlockedbittestandreset((volatile signed __int32 *)(a1 + 120), 0xBu);
    v7 = ControlPrcb;
    KeUpdateThreadSchedulingProperties((_KTHREAD *)a1, v6, ControlPrcb);
    if( v4 )
      KiAddThreadToPrcbQueue((__int64)v7, a1, *(char *)(a1 + 195), 0, 0);
    KiReleaseThreadStateLock(v8, (__int64)v7, (volatile signed __int64 *)ControlReadyQueue);
    KiReleaseThreadLockSafe(a1);
  }
}

Referenced by:

KeTerminateThread
KiSetThreadSchedulingGroup