KiSelectProcessorToPreempt

_KPRCB *__stdcall KiSelectProcessorToPreempt(_ETHREAD *Thread, _KPRCB *IdealPrcb, UINT64 Affinity, UINT64 PreferredSet){
  unsigned __int64 v5; 
  _KSHARED_READY_QUEUE *SharedReadyQueue; 
  __int64 LowProcIndex; 
  char *v10; 
  unsigned __int64 SmtSet; 
  INT8 IsQosGroupingActive; 
  int v13; 
  unsigned int v14; 
  char v15; 
  __int64 v16; 
  unsigned int v17; 
  char *v18; 
  unsigned int v19; 
  char *v20; 
  _BYTE v22[64]; 

  v5 = IdealPrcb->SharedReadyQueueMask & Affinity;
  if( ((v5 - 1) & v5) != 0 )
  {
    SharedReadyQueue = IdealPrcb->SharedReadyQueue;
    LowProcIndex = SharedReadyQueue->LowProcIndex;
    v10 = &v22[LowProcIndex];
    memmove(&v22[LowProcIndex], SharedReadyQueue->RunningSummary, SharedReadyQueue->Span);
    SmtSet = IdealPrcb->ParentNode->QosGroupingSets.SmtSet;
    IsQosGroupingActive = KiIsQosGroupingActive();
    v16 = (unsigned int)(v13 + 2);
    if( IsQosGroupingActive )
    {
      if( (SmtSet & v5) != 0 && (unsigned __int8)Thread->Tcb.ThreadFlags2 - (unsigned int)v16 <= (unsigned int)v16 )
      {
        v17 = LowProcIndex;
        if( (unsigned int)LowProcIndex < v14 )
        {
          v18 = &v22[LowProcIndex];
          do
          {
            if( ((v16 << v17) & SmtSet & v5) != 0 && *v18 < v15 )
            {
              v15 = *v18;
              v13 = v17;
            }
            v17 += v16;
            v18 += v16;
          }
          while( v17 < v14 );
        }
      }
    }
    if( PreferredSet )
    {
      if( v13 >= 0 )
        return *(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * IdealPrcb->Group + v13]);
      v19 = LowProcIndex;
      if( (unsigned int)LowProcIndex < v14 )
      {
        v20 = &v22[LowProcIndex];
        do
        {
          if( ((v16 << v19) & PreferredSet) != 0 && *v20 < v15 )
          {
            v15 = *v20;
            v13 = v19;
          }
          v19 += v16;
          v20 += v16;
        }
        while( v19 < v14 );
      }
    }
    if( v13 >= 0 )
      return *(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * IdealPrcb->Group + v13]);
    while( (unsigned int)LowProcIndex < v14 )
    {
      if( ((v16 << LowProcIndex) & v5) != 0 && *v10 < v15 )
      {
        v15 = *v10;
        v13 = LowProcIndex;
      }
      LODWORD(LowProcIndex) = v16 + LowProcIndex;
      v10 += v16;
    }
    if( v13 >= 0 )
      return *(&KiProcessorBlock + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * IdealPrcb->Group + v13]);
  }
  return IdealPrcb;
}

Referenced by:

KiHeteroChooseTargetProcessor