KiRescheduleThreadAfterAffinityChange

UINT64 __stdcall KiRescheduleThreadAfterAffinityChange(
        _ETHREAD *Thread,
        _GROUP_AFFINITY *Affinity,
        UINT8 State,
        _KPRCB *Prcb,
        _KSHARED_READY_QUEUE *SharedReadyQueue,
        _SINGLE_LIST_ENTRY *ReadyList){
  _KPRCB *v7; 
  __int64 v8; 
  _KPRCB *v10; 
  unsigned int v11; 
  if( State == 1 )
  {
    v11 = *((char *)Thread + 195);
    KiRemoveThreadFromAnyReadyQueue(Prcb, SharedReadyQueue, (_KTHREAD *)Thread, v11);
    KiPrepareReadyThreadForRescheduling((_KTHREAD *)Thread, v11, ReadyList);
    return 0i64;
  }
  if( State != 2 )
  {
    if( State == 3 && !KiPrcbInGroupAffinity((__int64)Prcb, (__int64)Affinity) )
    {
      KiSelectNextThread(v10, ReadyList);
      KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
    }
    return 0i64;
  }
  if( KiPrcbInGroupAffinity((__int64)Prcb, (__int64)Affinity) )
    return 0i64;
  if( *((_BYTE *)Thread + 388) != 2 )
  {
    *((_BYTE *)Thread + 112) |= 8u;
    return 0i64;
  }
  _interlockedbittestandset((volatile signed __int32 *)Thread + 30, 0xCu);
  if( *(_QWORD *)(v8 + 16) )
    return 0i64;
  KiSelectNextThread(v7, ReadyList);
  return 1i64;
}

Referenced by:

KiSetAffinityThread
KiUpdateGlobalCpuSetConfiguration
KiUpdateThreadCpuSets