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