KiSelectNextThread
VOID __stdcall KiSelectNextThread(_KPRCB *Prcb, _SINGLE_LIST_ENTRY *ReadyList){
_KTHREAD *v4;
char v5;
__int64 v6;
_ETHREAD *v7;
char v8;
INT64 v9;
UINT64 Preempted;
while( 1 )
{
v4 = (_ETHREAD *)KiSelectReadyThread(1i64, Prcb);
if( !v4 )
{
v4 = (_ETHREAD *)KiSelectLowestRankedThread((__int64)Prcb);
if( !v4 )
v4 = (_ETHREAD *)KiSelectReadyThread(0i64, Prcb);
}
if( !v4 )
goto LABEL_5;
if( KiCheckThreadAffinity((INT64)v4) )
goto LABEL_15;
if( !ReadyList )
break;
KiInsertDeferredReadyList((INT64)ReadyList, (INT64)v4);
}
LODWORD(Preempted) = 1;
KiAddThreadToReadyQueue(Prcb, 0i64, (_KTHREAD *)v4, 1u, Preempted);
v4 = 0i64;
LABEL_15:
if( !v4 )
{
LABEL_5:
v4 = (_ETHREAD *)*((_QWORD *)Prcb + 3);
KiSetProcessorIdle(Prcb, 1ui64, 1ui64);
}
if( (*((_BYTE *)v4 + 2) & 4) == 0 || (KiIsThreadRankNonZero(v4, Prcb), v5 = 1, !v8) )
v5 = *((_BYTE *)v4 + 195);
**((_BYTE **)Prcb + 7) = v5;
v6 = *((_QWORD *)Prcb + 4247);
if( v6 )
{
v9 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v4 != *((_ETHREAD **)Prcb + 3) )
v9 = (unsigned int)v5;
KiSetSchedulerAssistPriority(*((volatile INT32 **)Prcb + 4247), v9, 0);
v6 = *((_QWORD *)Prcb + 4247);
}
v7 = (_ETHREAD *)*((_QWORD *)Prcb + 3);
*((_QWORD *)Prcb + 2) = v4;
if( v6 )
*(_BYTE *)(v6 + 16) = v4 == v7;
if( *((_BYTE *)v4 + 388) == 1 )
*((_DWORD *)v4 + 33) = *((_DWORD *)v4 + 33) - *((_DWORD *)v4 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v4 + 388) = 3;
}Referenced by:
KeWaitForMultipleObjects
KeWaitForSingleObject
KiExitThreadWait
KiGroupSchedulingQuantumEnd
KiQuantumEnd
KiRescheduleThreadAfterAffinityChange
KiSearchForNewThreadOnProcessor
KiSetHeteroPolicyThread
KiSetSystemAffinityThread
KiUpdateGlobalCpuSetConfiguration