KiSetThreadSchedulingGroup

VOID __fastcall KiSetThreadSchedulingGroup(INT64 a1, INT64 a2){
  struct _KPRCB *CurrentPrcb; 
  _KPRCB *v5; 
  UINT8 v6; 
  UINT8 v7; 
  __int64 v8; 
  _KSHARED_READY_QUEUE *v9; 
  INT64 v10[2]; 
  UINT64 SpinCount; 
  _KSHARED_READY_QUEUE *ControlReadyQueue; 
  _KPRCB *ControlPrcb; 
  ControlPrcb = 0i64;
  ControlReadyQueue = 0i64;
  if( a2 )
  {
    CurrentPrcb = 0i64;
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *(_QWORD *)(a1 + 64) );
    }
    KiAcquireThreadStateLock((_ETHREAD *)a1, &ControlPrcb, &ControlReadyQueue);
    *(_QWORD *)(a1 + 104) = a2;
    _interlockedbittestandset((volatile signed __int32 *)a1, 0x12u);
    v5 = ControlPrcb;
    v7 = v6;
    KeUpdateThreadSchedulingProperties((_KTHREAD *)a1, v6, ControlPrcb);
    v9 = ControlReadyQueue;
    if( v7 == 1 && ControlReadyQueue && (*(_DWORD *)(a1 + 120) & 0x2000) == 0 )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      KiRemoveThreadFromSharedReadyQueue((__int64)ControlReadyQueue, a1, *(_BYTE *)(a1 + 195));
      KiEnterDeferredReadyState(a1);
      v5 = ControlPrcb;
    }
    KiReleaseThreadStateLock(v8, (__int64)v5, (volatile signed __int64 *)v9);
    KiReleaseThreadLockSafe(a1);
    if( CurrentPrcb )
    {
      *(_QWORD *)(a1 + 216) = 0i64;
      v10[0] = a1 + 216;
      KiReadyDeferredReadyList(CurrentPrcb, v10);
    }
  }
  else
  {
    KiRemoveThreadFromSchedulingGroup(a1);
  }
}

Referenced by:

KeSetProcessSchedulingGroup