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