KiTryLocalThreadSchedule

NTSTATUS __stdcall KiTryLocalThreadSchedule(INT64 a1, INT64 a2, INT64 a3, INT64 a4, CHAR a5, CHAR a6){
  __int64 v8; 
  unsigned __int64 *v9; 
  unsigned __int64 v10; 
  UINT64 v11; 
  INT64 v12; 
  int v13; 
  int v14; 
  unsigned __int64 v15; 
  UINT64 IdleCandidateSet[5]; 

  if( (*(_BYTE *)(a1 + 12588) & 1) == 0
    || *(_BYTE *)(a3 + 643) != 15 && *(_DWORD *)(a3 + 84) >= (unsigned int)KiShortExecutionCycles )
  {
    goto LABEL_2;
  }
  v9 = *(unsigned __int64 **)(a1 + 192);
  v10 = *v9;
  v11 = a4 & *v9;
  v12 = v11;
  IdleCandidateSet[0] = v11;
  if( a6 )
  {
    if( v11 )
      goto LABEL_7;
    v10 = v9[3] & v9[11];
    v11 = a4 & v10;
    IdleCandidateSet[0] = a4 & v10;
    v12 = a4 & v10;
  }
  if( !v12 )
    goto LABEL_2;
LABEL_7:
  if( (v12 & *(_QWORD *)(a1 + 33896)) != 0 )
  {
    v11 = v12 & *(_QWORD *)(a1 + 33896);
    IdleCandidateSet[0] = v11;
  }
  if( (*((_BYTE *)v9 + 181) & 0x20) == 0 )
    goto LABEL_13;
  if( !a5 || !KiFindRankBiasedIdleSmtSet(a1, IdleCandidateSet) )
  {
    v11 = IdleCandidateSet[0] & v9[1];
    if( v11 )
    {
      if( !a5
        || (unsigned int)((0x101010101010101i64
                         * ((((v10 - ((v10 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                           + (((v10 - ((v10 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
                           + ((((v10 - ((v10 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                             + (((v10 - ((v10 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 >= KiPerfIsoEnabled )
      {
LABEL_13:
        if( (v11 & ~*(_QWORD *)(a1 + 33880)) != 0 )
          v11 &= ~*(_QWORD *)(a1 + 33880);
        goto LABEL_15;
      }
LABEL_2:
      LODWORD(v8) = 0;
      return v8;
    }
    if( a5 )
      goto LABEL_2;
    if( !KiReduceByEffectiveIdleSmtSet((_KPRCB *)a1, IdleCandidateSet) )
    {
      v11 = IdleCandidateSet[0];
      goto LABEL_13;
    }
  }
  v11 = IdleCandidateSet[0];
LABEL_15:
  v13 = *(unsigned __int8 *)(a1 + 208);
  v14 = *(_DWORD *)(a1 + 33876);
  if( *(_BYTE *)(a2 + 208) == (_BYTE)v13 && (*(_QWORD *)(a1 + 33888) & *(_QWORD *)(a2 + 200)) != 0i64 )
    LOBYTE(v14) = *(_BYTE *)(a2 + 209);
  _BitScanForward64(&v15, __ROR8__(v11, v14));
  return(int)*(&KiProcessorBlock
              + (unsigned int)KiProcessorNumberToIndexMappingTable[64 * v13 + (((_BYTE)v15 + (_BYTE)v14) & 0x3F)]);
}

Referenced by:

KiChooseTargetProcessor