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