KeSetThreadChargeOnlySchedulingGroup

UINT8 __stdcall KeSetThreadChargeOnlySchedulingGroup(_ETHREAD *Thread, _KSCHEDULING_GROUP *SchedulingGroup){
  struct _KPRCB *CurrentPrcb; 
  struct _KPRCB *v6; 
  _DWORD *SchedulerAssist; 
  UINT64 SpinCount; 

  if( (*(&Thread->Tcb.MiscFlags + 1) & 0x200) != 0 )
  {
    if( SchedulingGroup )
      return 0;
  }
  else if( !SchedulingGroup || Thread->Tcb.SchedulingGroup )
  {
    return 0;
  }
  KeGetCurrentIrql();
  __writecr8(2ui64);
  CurrentPrcb = KeGetCurrentPrcb();
  _disable();
  KiUpdateTotalCyclesCurrentThread(CurrentPrcb, &Thread->Tcb, 0i64);
  _enable();
  v6 = KeGetCurrentPrcb();
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( CurrentPrcb->PrcbLock );
    SchedulerAssist = v6->SchedulerAssist;
    if( SchedulerAssist && v6->NestingLevel <= 1u )
      ++SchedulerAssist[6];
  }
  if( SchedulingGroup )
  {
    _interlockedbittestandset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 9u);
    Thread->Tcb.SchedulingGroup = SchedulingGroup;
    _interlockedbittestandset((volatile signed __int32 *)Thread, 0x12u);
  }
  else
  {
    _interlockedbittestandreset((volatile signed __int32 *)Thread, 0x12u);
    Thread->Tcb.SchedulingGroup = 0i64;
    _interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 9u);
  }
  _InterlockedAnd64((volatile signed __int64 *)&CurrentPrcb->PrcbLock, 0i64);
  __writecr8(0i64);
  return 1;
}

Referenced by:

NtSetInformationThread
PsImpersonateContainerOfThread
PspExitThread