KeSetThreadChargeOnlySchedulingGroup

UINT8 __stdcall KeSetThreadChargeOnlySchedulingGroup(_ETHREAD *Thread, _KSCHEDULING_GROUP *SchedulingGroup){
  struct _KPRCB *CurrentPrcb; 
  struct _KPRCB *v6; 
  __int64 v7; 
  UINT64 SpinCount; 
  if( (*((_DWORD *)Thread + 30) & 0x200) != 0 )
  {
    if( SchedulingGroup )
      return 0;
  }
  else if( !SchedulingGroup || *((_QWORD *)Thread + 13) )
  {
    return 0;
  }
  KeGetCurrentIrql();
  __writecr8(2ui64);
  CurrentPrcb = KeGetCurrentPrcb();
  _disable();
  KiUpdateTotalCyclesCurrentThread((__int64)CurrentPrcb, (__int64)Thread, 0i64);
  _enable();
  v6 = KeGetCurrentPrcb();
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((_QWORD *)CurrentPrcb + 6) );
    v7 = *((_QWORD *)v6 + 4247);
    if( v7 && *((_BYTE *)v6 + 32) <= 1u )
      ++*(_DWORD *)(v7 + 24);
  }
  if( SchedulingGroup )
  {
    _interlockedbittestandset((volatile signed __int32 *)Thread + 30, 9u);
    *((_QWORD *)Thread + 13) = SchedulingGroup;
    _interlockedbittestandset((volatile signed __int32 *)Thread, 0x12u);
  }
  else
  {
    _interlockedbittestandreset((volatile signed __int32 *)Thread, 0x12u);
    *((_QWORD *)Thread + 13) = 0i64;
    _interlockedbittestandreset((volatile signed __int32 *)Thread + 30, 9u);
  }
  _InterlockedAnd64((volatile signed __int64 *)CurrentPrcb + 6, 0i64);
  __writecr8(0i64);
  return 1;
}

Referenced by:

NtSetInformationThread
PsImpersonateContainerOfThread
PspExitThread