HalEnumerateProcessors

INT64 __fastcall HalEnumerateProcessors(UINT64 MaximumPhysicalProcessors){
  unsigned int v1; 
  unsigned int v2; 
  unsigned int v3; 
  int v4; 
  int v5; 
  _DWORD *v6; 
  INT64 v7; 
  unsigned int MaximumRegisteredProcessorCount; 
  v1 = MaximumPhysicalProcessors;
  v2 = 1;
  v3 = 1;
  v4 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) * *((_DWORD *)KeGetCurrentPrcb() + 38) - 1);
  v5 = v4 & *(_DWORD *)(HalpInterruptProcessorState + 8);
  if( (unsigned int)HalpInterruptProcessorCount > 1 )
  {
    v6 = (_DWORD *)(HalpInterruptProcessorState + 72);
    do
    {
      if( v5 != (v4 & *v6) )
      {
        ++v3;
        v5 = v4 & *v6;
        if( v3 > v1 )
          break;
      }
      ++v2;
      v6 += 16;
    }
    while( v2 < (unsigned int)HalpInterruptProcessorCount );
  }
  if( HalpInterruptProcessorCap && HalpInterruptProcessorCap < v2 )
    v2 = HalpInterruptProcessorCap;
  if( (unsigned int)HalpInterruptModel() - 1 > 3 )
    v2 = 1;
  MaximumRegisteredProcessorCount = HalpQueryMaximumRegisteredProcessorCount(v7);
  if( v2 >= MaximumRegisteredProcessorCount )
    return MaximumRegisteredProcessorCount;
  return v2;
}

Referenced by:

HvlpSelectLpSet
KeStartAllProcessors