KiSelectReadyThreadEx
_KTHREAD *__stdcall KiSelectReadyThreadEx(_KPRCB *Prcb, _ETHREAD *CompareThread, UINT8 SkipZero){
unsigned int v6;
__int64 v7;
unsigned int v8;
INT64 v9;
_ETHREAD *result;
_KSCB *v11;
bool v12;
_ETHREAD *v13;
int v14;
if( CompareThread )
{
v6 = *((char *)CompareThread + 195);
if( *((_BYTE *)CompareThread + 195) == 31 )
return 0i64;
v7 = *((_QWORD *)CompareThread + 13);
v8 = v6 + 1;
if( (SkipZero & 2) != 0 )
v8 = v6;
if( v7 )
{
v11 = (_KSCB *)(*((unsigned int *)Prcb + 54) + v7);
if( v11 )
{
v12 = Prcb == KeGetCurrentPrcb() || CompareThread != *((_ETHREAD **)Prcb + 1);
KiGetThreadEffectiveRankNonZero(CompareThread, v11, (_KPRCB *)SkipZero, v12, 0i64);
if( v14 )
{
KiChooseLowestRankedThread(Prcb, v13, v8);
return(_KTHREAD *)result;
}
}
}
v9 = v8;
return KiSelectReadyThread(v9, Prcb);
}
result = (_ETHREAD *)KiSelectReadyThread(1i64, Prcb);
if( !result )
{
result = (_ETHREAD *)KiSelectLowestRankedThread((__int64)Prcb);
if( !result && (SkipZero & 1) == 0 )
{
v9 = 0i64;
return KiSelectReadyThread(v9, Prcb);
}
}
return(_KTHREAD *)result;
}Referenced by:
KeDelayExecutionThread
KeSetActualBasePriorityThread
KeYieldExecution
KiApplyForegroundBoostThread
KiSchedulerApc
KiSetPriorityThread