KiRescheduleThreadAfterAffinityChange

VOID __fastcall KiRescheduleThreadAfterAffinityChange(
        _ETHREAD *Thread,
        _GROUP_AFFINITY *Affinity,
        UINT8 State,
        _KPRCB *Prcb,
        _KSHARED_READY_QUEUE *SharedReadyQueue,
        _SINGLE_LIST_ENTRY *ReadyList){
  _KPRCB *v7; 
  __int64 v8; 
  _KPRCB *v9; 
  unsigned int Priority; 

  if( State == 1 )
  {
    Priority = Thread->Tcb.Priority;
    KiRemoveThreadFromAnyReadyQueue(Prcb, SharedReadyQueue, (__int64)Thread, Priority);
    KiPrepareReadyThreadForRescheduling(&Thread->Tcb, Priority, ReadyList);
  }
  else if( State == 2 )
  {
    if( !(unsigned int)KiPrcbInGroupAffinity(Prcb, Affinity) )
    {
      if( Thread->Tcb.WaitBlockFill6[68] == 2 )
      {
        _interlockedbittestandset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xCu);
        if( !*(_QWORD *)(v8 + 16) )
          KiSelectNextThread(v7, ReadyList);
      }
      else
      {
        Thread->Tcb.WaitRegister.Flags |= 8u;
      }
    }
  }
  else if( State == 3 && !(unsigned int)KiPrcbInGroupAffinity(Prcb, Affinity) )
  {
    KiSelectNextThread(v9, ReadyList);
    KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
  }
}

Referenced by:

KiSetAffinityThread
KiUpdateGlobalCpuSetConfiguration
KiUpdateThreadCpuSets