KiSelectReadyThreadEx
_KTHREAD *__stdcall KiSelectReadyThreadEx(_KPRCB *Prcb, _ETHREAD *CompareThread, UINT8 SkipZero){
unsigned int Priority;
_KSCHEDULING_GROUP *volatile SchedulingGroup;
unsigned int v8;
INT64 v9;
_ETHREAD *result;
_KSCB *v11;
bool v12;
_ETHREAD *v13;
int v14;
if( CompareThread )
{
Priority = CompareThread->Tcb.Priority;
if( CompareThread->Tcb.Priority == 31 )
return 0i64;
SchedulingGroup = CompareThread->Tcb.SchedulingGroup;
v8 = Priority + 1;
if( (SkipZero & 2) != 0 )
v8 = Priority;
if( SchedulingGroup )
{
v11 = (_KSCB *)((char *)SchedulingGroup + Prcb->ScbOffset);
if( v11 )
{
v12 = Prcb == KeGetCurrentPrcb() || CompareThread != Prcb->CurrentThread;
KiGetThreadEffectiveRankNonZero(CompareThread, v11, (_KPRCB *)SkipZero, v12, 0i64);
if( v14 )
return KiChooseLowestRankedThread(Prcb, &v13->Tcb, v8);
}
}
v9 = v8;
return KiSelectReadyThread(v9, Prcb);
}
result = (_ETHREAD *)KiSelectReadyThread(1i64, Prcb);
if( !result )
{
result = (_ETHREAD *)KiSelectLowestRankedThread(Prcb);
if( !result && (SkipZero & 1) == 0 )
{
v9 = 0i64;
return KiSelectReadyThread(v9, Prcb);
}
}
return &result->Tcb;
}Referenced by:
KeDelayExecutionThread
KeSetActualBasePriorityThread
KeYieldExecution
KiApplyForegroundBoostThread
KiSchedulerApc
KiSetPriorityThread