KiSelectProcessorToPreempt

_KPRCB *__stdcall KiSelectProcessorToPreempt(_ETHREAD *Thread, _KPRCB *IdealPrcb, UINT64 Affinity, UINT64 PreferredSet){
  UINT64 v5; 
  UINT8 *v8; 
  __int64 v9; 
  char *v10; 
  __int64 v11; 
  CHAR IsQosGroupingActive; 
  int v13; 
  unsigned int v14; 
  char v15; 
  __int64 v16; 
  unsigned int v17; 
  char *v18; 
  unsigned int v19; 
  char *v20; 
  _BYTE v22[64]; 
  v5 = *((_QWORD *)IdealPrcb + 4232) & Affinity;
  if( ((v5 - 1) & v5) != 0 )
  {
    v8 = (UINT8 *)*((_QWORD *)IdealPrcb + 4233);
    v9 = v8[593];
    v10 = &v22[v9];
    memmove(&v22[v9], v8 + 528, v8[592]);
    v11 = *(_QWORD *)(*((_QWORD *)IdealPrcb + 24) + 360i64);
    IsQosGroupingActive = KiIsQosGroupingActive();
    v16 = (unsigned int)(v13 + 2);
    if( IsQosGroupingActive )
    {
      if( (v11 & v5) != 0 && (unsigned __int8)*((_DWORD *)Thread + 128) - (unsigned int)v16 <= (unsigned int)v16 )
      {
        v17 = v9;
        if( (unsigned int)v9 < v14 )
        {
          v18 = &v22[v9];
          do
          {
            if( ((v16 << v17) & v11 & 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 * *((unsigned __int8 *)IdealPrcb + 208) + v13]);
      v19 = v9;
      if( (unsigned int)v9 < v14 )
      {
        v20 = &v22[v9];
        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 * *((unsigned __int8 *)IdealPrcb + 208) + v13]);
    while( (unsigned int)v9 < v14 )
    {
      if( ((v16 << v9) & v5) != 0 && *v10 < v15 )
      {
        v15 = *v10;
        v13 = v9;
      }
      LODWORD(v9) = v16 + v9;
      v10 += v16;
    }
    if( v13 >= 0 )
      return *(&KiProcessorBlock
             + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * *((unsigned __int8 *)IdealPrcb + 208) + v13]);
  }
  return IdealPrcb;
}

Referenced by:

KiHeteroChooseTargetProcessor