KiFindReadyThread

_KTHREAD *__stdcall KiFindReadyThread(
        _KPRCB *TargetPrcb,
        _KPRCB *Prcb,
        _KSHARED_READY_QUEUE *ReadyQueue,
        UINT64 PrioritySet){
  unsigned __int64 GroupSetMember; 
  _LIST_ENTRY *DispatcherReadyListHead; 
  unsigned int v6; 
  _KPRCB *v7; 
  int v8; 
  unsigned int v9; 
  _LIST_ENTRY **p_Flink; 
  _LIST_ENTRY *v11; 
  unsigned int v12; 
  _LIST_ENTRY **p_Blink; 
  unsigned __int64 Blink; 
  _ETHREAD *result; 
  _LIST_ENTRY *v16; 
  __int64 v17; 
  _KSCB *v18; 
  unsigned __int64 v19; 
  _KPRCB *Prcba; 
  unsigned int QueueIndex; 

  Prcba = Prcb;
  GroupSetMember = TargetPrcb->GroupSetMember;
  DispatcherReadyListHead = Prcb->DispatcherReadyListHead;
  v6 = PrioritySet;
  if( !Prcb )
    DispatcherReadyListHead = ReadyQueue->ReadyListHead;
  v7 = TargetPrcb;
  v8 = 64;
LABEL_4:
  _BitScanReverse(&v9, v6);
  v6 ^= 1 << v9;
  p_Flink = &DispatcherReadyListHead[v9].Flink;
  QueueIndex = v9;
  v11 = *p_Flink;
  while( 1 )
  {
    v12 = BYTE5(v11[-6].Flink);
    p_Blink = &v11[-14].Blink;
    Blink = (unsigned __int64)v11[22].Blink;
    if( v12 >= 5 )
    {
      v12 = KiConvertDynamicHeteroPolicy((_ETHREAD *)&v11[-14].Blink, (_KHETERO_CPU_POLICY)Prcb, v7);
      v7 = TargetPrcb;
    }
    if( v12 )
    {
      Prcb = (_KPRCB *)v7->ParentNode;
      v19 = Blink & *(&Prcb->GroupSetMember + 3 * (int)v12);
      if( v19 )
        Blink = v19;
    }
    if( (GroupSetMember & Blink) != 0 )
    {
      v16 = p_Blink[13];
      if( !v16 )
        break;
      v18 = (_KSCB *)((char *)v16 + v7->ScbOffset);
      if( !v18 || !KiCheckForMaxOverQuotaScb(v18) )
        break;
    }
    v11 = v11->Flink;
    --v8;
    if( v11 == (_LIST_ENTRY *)p_Flink || !v8 )
    {
      if( !v6 || !v8 )
        return 0i64;
      goto LABEL_4;
    }
  }
  if( Prcba )
    KiRemoveThreadFromReadyQueue(Prcba, v11, QueueIndex);
  else
    KiRemoveThreadFromSharedReadyQueue(ReadyQueue, (_KTHREAD *)&v11[-14].Blink, QueueIndex);
  result = (_ETHREAD *)&v11[-14].Blink;
  *((_DWORD *)p_Blink + 134) = *(_DWORD *)(v17 + 36);
  return &result->Tcb;
}

Referenced by:

KiSearchForNewThreadOnProcessor