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