KiSelectIdleProcessor

_KPRCB *__stdcall KiSelectIdleProcessor(
        UINT64 AffinityMask,
        _KPRCB *CurrentPrcb,
        _KNODE *PreferredNode,
        _KPRCB *PreferredPrcb){
  _KPRCB *v5; 
  UINT64 v9; 
  __int64 v10; 
  char v11; 
  int v12; 
  unsigned __int64 IdleNonParkedCpuSet; 
  UINT64 v14; 
  UINT64 v15; 
  char v16; 
  unsigned __int64 v17; 
  _QWORD a2[4]; 
  char v20; 
  char v21; 
  v5 = 0i64;
  if( PreferredPrcb )
  {
LABEL_4:
    IdleNonParkedCpuSet = PreferredNode->IdleNonParkedCpuSet;
    v14 = AffinityMask & PreferredNode->IdleNonParkedCpuSet;
    v15 = v14;
    a2[0] = v14;
    if( v21 )
    {
      if( v14 )
      {
LABEL_6:
        if( (*(_BYTE *)&PreferredNode->Flags & 0x20) == 0 )
          goto LABEL_15;
        if( v20 && KiFindRankBiasedIdleSmtSet((INT64)PreferredPrcb, a2) )
        {
LABEL_12:
          v14 = a2[0];
          goto LABEL_15;
        }
        v14 = a2[0];
        if( (a2[0] & PreferredNode->IdleSmtSet) != 0 )
        {
          if( !v20
            || (unsigned int)((0x101010101010101i64
                             * ((((IdleNonParkedCpuSet - ((IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                               + (((IdleNonParkedCpuSet - ((IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
                               + ((((IdleNonParkedCpuSet - ((IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                                 + (((IdleNonParkedCpuSet - ((IdleNonParkedCpuSet >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 >= KiPerfIsoEnabled )
          {
            v14 = a2[0] & PreferredNode->IdleSmtSet;
LABEL_15:
            if( (v14 & *((_QWORD *)PreferredPrcb + 25)) != 0 )
            {
              return PreferredPrcb;
            }
            else
            {
              if( (v14 & *((_QWORD *)PreferredPrcb + 4235)) != 0 )
              {
                v14 &= *((_QWORD *)PreferredPrcb + 4235);
              }
              else if( (KiCacheAwareScheduling & 1) != 0 && (v14 & *((_QWORD *)PreferredPrcb + 4237)) != 0 )
              {
                v14 &= *((_QWORD *)PreferredPrcb + 4237);
              }
              v16 = *((_BYTE *)PreferredPrcb + 209);
              _BitScanForward64(&v17, __ROR8__(v14, v16));
              return *(&KiProcessorBlock
                     + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * *((unsigned __int8 *)PreferredPrcb + 208)
                                                                        + (((unsigned __int8)v17 + v16) & 0x3F)]);
            }
          }
        }
        else if( !v20 )
        {
          if( *((_KNODE **)CurrentPrcb + 24) != PreferredNode )
            goto LABEL_15;
          KiReduceByEffectiveIdleSmtSet(CurrentPrcb, a2);
          goto LABEL_12;
        }
        return v5;
      }
      IdleNonParkedCpuSet = PreferredNode->IdleCpuSet & PreferredNode->SoftParkedSet;
      v14 = AffinityMask & IdleNonParkedCpuSet;
      a2[0] = AffinityMask & IdleNonParkedCpuSet;
      v15 = AffinityMask & IdleNonParkedCpuSet;
    }
    if( !v15 )
      return v5;
    goto LABEL_6;
  }
  v9 = AffinityMask & PreferredNode->Affinity.Mask;
  if( v9 )
  {
    v10 = (__int64)*(&KiProcessorBlock + PreferredNode->ThreadSeed);
    v11 = *(_BYTE *)(v10 + 209);
    v12 = *(unsigned __int8 *)(v10 + 208);
    _BitScanForward64((unsigned __int64 *)&v10, __ROR8__(v9, v11));
    PreferredPrcb = *(&KiProcessorBlock
                    + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * v12 + (((_BYTE)v10 + v11) & 0x3F)]);
    goto LABEL_4;
  }
  return 0i64;
}

Referenced by:

KiChooseTargetProcessor