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