PopInitializeHeteroProcessors

VOID __stdcall PopInitializeHeteroProcessors(){
  CHAR v0; 
  CHAR v1; 
  char v2; 
  char v3; 
  char v4; 
  unsigned __int8 v5; 
  char *v6; 
  unsigned int v7; 
  __int64 v8; 
  unsigned __int8 v9; 
  __int64 v10; 
  unsigned __int8 v11; 
  int v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  char v16; 
  unsigned int ActiveProcessorCount; 
  _BYTE *v18; 
  signed __int64 v19; 
  __int64 v20; 
  CHAR v21; 
  EVENT_DESCRIPTOR *v22; 
  UINT64 *v23; 
  _WORD *v24; 
  __int64 v25; 
  __int64 v26; 
  __int16 v27; 
  UINT8 MostFavoredClass[4]; 
  __int16 v29; 
  unsigned int ProcessorNumber; 
  unsigned int ProcessorNumber_4; 
  unsigned __int16 *v32[2]; 
  __int16 v33; 
  int v34; 
  __int16 v35; 
  unsigned __int16 *v36[2]; 
  __int16 v37; 
  int v38; 
  __int16 v39; 
  EVENT_DATA_DESCRIPTOR UserData; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  __int64 v47; 
  __int64 v48; 
  v1 = v0;
  v2 = 0;
  v3 = 1;
  if( (PpmBackgroundProfile || PpmEntryLevelPerfProfile || PpmMultimediaQosProfile)
    && PpmPerfSchedulerDirectedPerfStatesSupported
    && (unsigned int)KeQueryActiveProcessorCountEx(0) >= 2 )
  {
    v2 = 1;
  }
  v4 = v2;
  if( PpmPerfVmQosSupported )
    v4 = 1;
  if( !v4 || (v5 = 1, PpmPerfQosGroupPolicyDisable) )
    v5 = 0;
  if( v1 )
  {
    v6 = (char *)PpmHeteroCapabilityTest;
    v7 = 0;
    if( *(_DWORD *)PpmHeteroCapabilityTest )
    {
      do
      {
        v8 = v7++;
        *(_WORD *)&v6[2 * v8 + 7 + v8] = 0;
      }
      while( v7 < *(_DWORD *)v6 );
    }
    PpmHeteroComputeRelativePerformance();
    PpmHeteroUpdateHgsConfiguration();
    v9 = PopDetectSimulatedHeteroProcessors((__int64)v6);
    *(_DWORD *)MostFavoredClass = v9;
    v10 = v9 != 0;
    if( !v9 )
    {
      v11 = PpmHeteroDetectHgsCores((INT64)v6);
      *(_DWORD *)MostFavoredClass = v11;
      if( v11 )
      {
        LODWORD(v10) = 5;
      }
      else
      {
        v34 = 0;
        v35 = 0;
        ProcessorNumber = 0;
        if( (unsigned __int8)PpmHeteroNominalPerformanceClasses > 1u
          || (unsigned __int8)PpmHeteroHighestPerformanceClasses > 1u )
        {
          v32[1] = (unsigned __int16 *)PpmPerfStatesRegistered.Bitmap[0];
          v33 = 0;
          v32[0] = (unsigned __int16 *)&PpmPerfStatesRegistered;
          if( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, v32) )
          {
            do
            {
              v13 = ProcessorNumber;
              KeGetPrcb(ProcessorNumber);
              v15 = *(_QWORD *)(v14 + 33128);
              if( (unsigned __int8)PpmHeteroNominalPerformanceClasses <= 1u )
                v16 = *(_BYTE *)(v15 + 206);
              else
                v16 = *(_BYTE *)(v15 + 205);
              v6[2 * v13 + 8 + v13] = v16;
            }
            while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, v32) );
            v3 = 1;
          }
          v6[5] = 1;
          v12 = 1;
        }
        else
        {
          v12 = 0;
        }
        *(_DWORD *)MostFavoredClass = v12;
        if( v12 )
        {
          LODWORD(v10) = 3;
        }
        else if( v5 )
        {
          *(_DWORD *)MostFavoredClass = 1;
          LODWORD(v10) = 4;
        }
      }
    }
    if( (_DWORD)v10 == PopHeteroSystem )
    {
      v3 = 0;
      ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
      if( ActiveProcessorCount )
      {
        v18 = v6 + 7;
        v19 = (_BYTE *)PpmHeteroCapability - v6;
        v20 = ActiveProcessorCount;
        do
        {
          if( v18[v19] != *v18 || v18[v19 + 1] != v18[1] )
            v3 = 1;
          v18 += 3;
          --v20;
        }
        while( v20 );
      }
    }
  }
  else
  {
    LODWORD(v10) = PopHeteroSystem;
    v6 = (char *)PpmHeteroCapability;
    v3 = 0;
    *(_DWORD *)MostFavoredClass = PopHeteroSystem != 0;
  }
  v21 = PopConfigureHeteroPolicies((unsigned int)v10, v1);
  if( (v3 || (_DWORD)v10 && v21 || PpmPerfQosSupportedAndAllowed != v5)
    && (unsigned int)KeConfigureHeteroProcessors((_KAFFINITY_EX *)v6, v5, (UINT8)MostFavoredClass, v23) )
  {
    PsEnumProcesses((__int64(__fastcall *)(unsigned __int64, __int64))PopUpdateSingleProcessHeteroPolicies, 0i64);
  }
  if( *(_DWORD *)MostFavoredClass )
  {
    PopHeteroSystem = v10;
    if( v6 != PpmHeteroCapability )
      memmove((UINT8 *)PpmHeteroCapability, (UINT8 *)v6, 3 * (*(_DWORD *)v6 + 2));
    if( v5 )
      PpmIdleEnableIdleDurationExpirationTimeout();
    goto LABEL_56;
  }
  v24 = PpmHeteroCapability;
  v22 = 0i64;
  PopHeteroSystem = 0;
  if( *(_DWORD *)PpmHeteroCapability )
  {
    do
    {
      v25 = (unsigned int)v22;
      v22 = (EVENT_DESCRIPTOR *)(unsigned int)((_DWORD)v22 + 1);
      *(_WORD *)((char *)&v24[v25 + 3] + v25 + 1) = 0;
      *((_BYTE *)&v24[v25 + 3] + v25) = 0;
      v24[2] = 0;
    }
    while( (unsigned int)v22 < *(_DWORD *)v24 );
  }
  if( v4 )
LABEL_56:
    PpmPerfQosSupportedAndConfigured = 1;
  if( ((PopHeteroSystem - 1) & 0xFFFFFFFA) != 0 || PopHeteroSystem == 6 )
    PpmHeteroPolicy = 0;
  else
    PpmHeteroPolicy = PpmHeteroDesiredPolicy;
  if( PpmPerfArtificialDomainSetting == -1 )
    PpmPerfArtificialDomainEnabled = PopHeteroSystem != 0;
  v38 = 0;
  v39 = 0;
  ProcessorNumber_4 = 0;
  if( PpmEtwRegistered && EtwEventEnabled(PpmEtwHandle, (EVENT_DESCRIPTOR *)&PPM_ETW_PROCESSOR_CLASS_UPDATE, v22) )
  {
    v36[1] = (unsigned __int16 *)qword_140C11268[0];
    v36[0] = (unsigned __int16 *)&PpmCheckRegistered;
    v37 = 0;
    while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber_4, v36) )
    {
      KeGetPrcb(ProcessorNumber_4);
      v27 = *(unsigned __int8 *)(v26 + 208);
      UserData.Ptr = (unsigned __int64)&v29;
      v29 = v27;
      v45 = v26 + 33209;
      v41 = v26 + 209;
      v47 = v26 + 33210;
      v43 = v26 + 33208;
      *(_QWORD *)&UserData.Size = 2i64;
      v42 = 1i64;
      v44 = 1i64;
      v46 = 1i64;
      v48 = 1i64;
      EtwWrite(PpmEtwHandle, (EVENT_DESCRIPTOR *)&PPM_ETW_PROCESSOR_CLASS_UPDATE, 0i64, 5ui64, &UserData);
    }
  }
  PpmEventHeteroPolicy(0);
  PpmPerfQosSupportedAndAllowed = v5;
}

Referenced by:

PoInitSystem
PpmReapplyPerfPolicy