PpmPerfCalculateQosClassPolicies

CHAR __stdcall PpmPerfCalculateQosClassPolicies(INT64 a1){
  char v1; 
  __int64 v3; 
  unsigned int v4; 
  __int64 v5; 
  int v6; 
  __int64 v7; 
  __int64 PerfPolicyClass; 
  int v9; 
  _PPM_ENGINE_SETTINGS *v10; 
  __int64 v11; 
  __int64 Value; 
  __int64 v13; 
  int v14; 
  __int64 v15; 
  __int64 v16; 
  int v17; 
  _SIZE_T *v18; 
  __int64 v19; 
  int v20; 
  __int64 v21; 
  unsigned int v22; 
  _WORD *v23; 
  unsigned int i; 
  unsigned int j; 
  __int64 v27; 
  __int64 v28; 
  _DWORD *v29; 
  unsigned int v30; 
  unsigned int v31; 
  unsigned int v32; 
  unsigned int v33; 
  unsigned __int8 ThrottlingPolicy; 
  char v35; 
  char v36; 
  char v37; 
  int v38; 
  __int64 v39; 
  _SIZE_T *v40; 
  __int128 v41; 
  __int64 v42; 
  int v43; 
  __int64 v44; 
  unsigned int v45; 
  unsigned int v46; 
  unsigned int v47; 
  unsigned int v48; 
  unsigned int v49; 
  unsigned int v50; 
  CHAR v51; 
  char v52; 
  int v53; 
  __int128 Source2; 
  __int64 v55; 
  int v56; 

  v1 = 0;
  v52 = 0;
  v51 = 0;
  v3 = 0i64;
  v50 = 0;
  v4 = 0;
  v53 = *(&stru_140C23628 + 441);
  v5 = 0i64;
  PerfPolicyClass = (unsigned __int8)PpmGetPerfPolicyClass(*(_BYTE **)(a1 + 16));
  v9 = v7 + 64;
  while( 1 )
  {
    v55 = 0i64;
    v56 = 0;
    Source2 = 0i64;
    if( v4 )
    {
      switch( v4 )
      {
        case 1u:
          v11 = PpmEntryLevelPerfProfile;
          break;
        case 2u:
          v11 = PpmBackgroundProfile;
          break;
        case 3u:
          v11 = PpmMultimediaQosProfile;
          v3 = a1 + 376;
          break;
        default:
          if( PpmMultimediaQosProfile == v7 )
            v10 = (_PPM_ENGINE_SETTINGS *)v7;
          else
            v10 = &PpmDefaultProfile.Settings[v6];
          goto LABEL_12;
      }
      if( !v11 )
      {
        v10 = (_PPM_ENGINE_SETTINGS *)v7;
        goto LABEL_12;
      }
      v27 = v6;
      v28 = v11 + 40;
    }
    else
    {
      v27 = *(&stru_140C23628 + 441);
      v28 = *(&stru_140C00F40 + 365) + 40i64;
    }
    v10 = (_PPM_ENGINE_SETTINGS *)(2736 * v27 + v28);
LABEL_12:
    if( v10 )
    {
      Value = v10->ExplicitSetting[0].Value;
      v13 = v10->ExplicitSetting[PerfPolicyClass].Value;
    }
    else
    {
      Value = v7;
      v13 = v7;
    }
    if( v3 )
    {
      v14 = *(_DWORD *)(v3 + 24);
      v15 = *(_QWORD *)(v3 + 16);
      Source2 = *(_OWORD *)v3;
      if( !PopHeteroSystem )
        LODWORD(v7) = v9;
      v55 = v15;
      v56 = v14;
      if( PpmPerfQosGroupPolicyDisable )
        LODWORD(v7) = v7 | 0x100;
      if( !PpmPerfSchedulerDirectedPerfStatesSupported )
        LODWORD(v7) = v7 | 0x80;
      if( v10 )
      {
        if( (v13 & 0x400000040C0i64) == 0 && (Value & 0x1C000000C00i64) == 0 )
          LODWORD(v7) = v7 | 4;
      }
      else
      {
        LODWORD(v7) = v7 | 2;
      }
      v16 = *(_QWORD *)(*(&stru_140C00F40 + 365) + 12i64) - *(_QWORD *)&GUID_POWER_POLICY_PROFILE_LOW_LATENCY.Data1;
      if( !v16 )
        v16 = *(_QWORD *)(*(&stru_140C00F40 + 365) + 20i64) - *(_QWORD *)GUID_POWER_POLICY_PROFILE_LOW_LATENCY.Data4;
      v17 = v7 | 0x20;
      if( v16 )
        v17 = v7;
      v7 = 0i64;
      if( *(&stru_140C23628 + 3472) )
        v17 |= 0x10u;
      if( PpmPerfQosDisableRefcount )
        v17 |= 1u;
      if( v17 )
      {
        v18 = RtlCompareMemory((const VOID *)(a1 + 28i64 * v4 + 376), &Source2, 28);
        v19 = v55;
        if( v18 == (_SIZE_T *)28 )
          v1 = 1;
        v20 = v56;
        v21 = 28 * v5;
        v51 = v1;
        *(_OWORD *)(v21 + a1 + 376) = Source2;
        *(_QWORD *)(v21 + a1 + 392) = v19;
        *(_DWORD *)(v21 + a1 + 400) = v20;
        *(_DWORD *)(a1 + 4 * v5 + 516) = v17;
        goto LABEL_35;
      }
      LOBYTE(v9) = 64;
    }
    if( v4 == 3 )
    {
      Value = 0x1C000000C00i64;
      v13 = 0x400000040C0i64;
    }
    v29 = (_DWORD *)v7;
    if( v4 != 3 )
      v29 = (_DWORD *)v3;
    v3 = (__int64)v29;
    if( PpmPerfEppViaPerfControl != (_BYTE)v7
      && (!v29 || (BYTE4(v13) & (unsigned __int8)v9) != 0 && v29[4] < v10->EnergyPerfPreference[PerfPolicyClass]) )
    {
      LODWORD(v55) = v10->EnergyPerfPreference[PerfPolicyClass];
    }
    if( !v29
      || ((unsigned __int8)v13 & (unsigned __int8)v9) != 0 && v29[2] > (unsigned int)v10->PerfMinPolicy[PerfPolicyClass] )
    {
      v30 = v10->PerfMinPolicy[PerfPolicyClass];
      DWORD2(Source2) = v30;
    }
    else
    {
      v30 = DWORD2(Source2);
    }
    if( v29 && ((v13 & 0x80u) == 0i64 || *v29 <= (unsigned int)v10->PerfMaxPolicy[PerfPolicyClass]) )
    {
      v31 = Source2;
    }
    else
    {
      v31 = v10->PerfMaxPolicy[PerfPolicyClass];
      LODWORD(Source2) = v31;
    }
    v32 = v10->PerfFrequencyCap[PerfPolicyClass];
    v33 = *(_DWORD *)(a1 + 320);
    if( v32 )
    {
      v45 = ((*(_DWORD *)(a1 + 316) >> 1) + 100 * v32) / *(_DWORD *)(a1 + 316);
      if( v45 < v33 )
        v33 = v45;
      LODWORD(v7) = 0;
    }
    if( !v3 || (v13 & 0x40000000000i64) != 0 && *(_DWORD *)(v3 + 4) > v33 )
      DWORD1(Source2) = v33;
    else
      v33 = DWORD1(Source2);
    if( PpmPerfAutonomousActivityWindowViaPerfControl != (_BYTE)v7 && (!v3 || (Value & 0x8000000000i64) != 0) )
      HIDWORD(Source2) = v10->AutonomousActivityWindow;
    if( !v3 || (Value & 0x400) != 0 && *(_BYTE *)(v3 + 22) != (_BYTE)v7 && v10->PerfBoostMode == (_DWORD)v7 )
      BYTE6(v55) = v10->PerfBoostMode;
    if( !v3 || (v13 & 0x4000) != 0 && *(_BYTE *)(v3 + 23) > v10->LatencyHintPerf[PerfPolicyClass] )
      HIBYTE(v55) = v10->LatencyHintPerf[PerfPolicyClass];
    ThrottlingPolicy = v10->ThrottlingPolicy;
    if( ThrottlingPolicy == 1 || ThrottlingPolicy == 2 && *(_BYTE *)(a1 + 356) != (_BYTE)v7 )
      v35 = 1;
    else
      v35 = v7;
    if( !v3 || (Value & 0x800) != 0 )
      BYTE5(v55) = v35;
    if( v10->AutonomousPreference == (_BYTE)v7 || (v36 = v7, *(_BYTE *)(a1 + 359) == (_BYTE)v7) )
      v36 = 1;
    if( !v3 || (Value & 0x10000000000i64) != 0 )
    {
      v37 = v52;
      if( v36 )
        v37 = 1;
      BYTE4(v55) = v36;
      v52 = v37;
    }
    if( v31 < v30 )
      v31 = v30;
    LODWORD(Source2) = v31;
    if( v33 < v30 )
      v33 = v30;
    DWORD1(Source2) = v33;
    if( v4 == 4 )
    {
      v46 = *(unsigned __int8 *)(a1 + 483);
      v47 = v33;
      if( v31 < v33 )
        v47 = v31;
      if( v47 >= v46 )
      {
        v48 = *(unsigned __int8 *)(a1 + 483);
      }
      else
      {
        v48 = v33;
        if( v31 < v33 )
          v48 = v31;
      }
      if( v30 <= v48 )
      {
        v49 = v33;
        if( v31 < v33 )
          v49 = v31;
        if( v49 >= v46 )
        {
          DWORD2(Source2) = *(unsigned __int8 *)(a1 + 483);
        }
        else
        {
          if( v31 < v33 )
            v33 = v31;
          DWORD2(Source2) = v33;
        }
      }
    }
    if( v36
      && ((v38 = PpmHeteroQosBias[v5], v38 == 1)
       || v38 == 3 && *(_BYTE *)(a1 + 204) > (unsigned __int8)v7
       || v38 == 2 && *(_BYTE *)(a1 + 204) == (_BYTE)v7) )
    {
      LOBYTE(v56) = 1;
    }
    else
    {
      LOBYTE(v56) = v7;
    }
    v39 = 28i64 * v4;
    v40 = RtlCompareMemory((const VOID *)(v39 + a1 + 376), &Source2, 28);
    v1 = v51;
    v41 = Source2;
    v42 = v55;
    if( v40 != (_SIZE_T *)28 )
      v1 = 1;
    *(_DWORD *)(a1 + 4 * v5 + 516) = 0;
    v43 = v56;
    v44 = 28 * v5;
    v51 = v1;
    *(_OWORD *)(v44 + a1 + 376) = v41;
    *(_QWORD *)(v44 + a1 + 392) = v42;
    *(_DWORD *)(v44 + a1 + 400) = v43;
    if( v3 && RtlCompareMemory((const VOID *)v3, &Source2, 28) == (_SIZE_T *)28 )
    {
      *(_DWORD *)(a1 + 4 * v5 + 516) = 8;
LABEL_35:
      v22 = v50;
      goto LABEL_36;
    }
    v3 = v39 + a1 + 376;
    v22 = ++v50;
LABEL_36:
    v6 = v53;
    ++v4;
    ++v5;
    v9 = 64;
    if( v4 >= 5 )
      break;
    v7 = 0i64;
  }
  v23 = (_WORD *)(a1 + 536);
  *(_BYTE *)(a1 + 546) = v22 > 1;
  *(_BYTE *)(a1 + 360) = v52;
  for( i = 0; i < 5; ++i )
  {
    *v23 = 0;
    for( j = 0; j < 5; ++j )
    {
      if( i == j
        || RtlCompareMemory((const VOID *)(a1 + 28i64 * i + 376), (const VOID *)(28i64 * j + a1 + 376), 28) == (_SIZE_T *)28 )
      {
        *v23 |= 1 << j;
      }
    }
    ++v23;
  }
  return v51;
}

Referenced by:

PpmPerfUpdateDomainPolicy