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