PpmSetProfilePolicySetting
NTSTATUS __stdcall PpmSetProfilePolicySetting(
_GUID *ProfileGuid,
_GUID *SettingGuid,
_SYSTEM_POWER_CONDITION PowerCondition,
UINT8 *NewValue,
UINT64 ValueLength){
NTSTATUS v5;
_PPM_POLICY_SETTINGS_MASK v6;
__int64 v9;
unsigned int v10;
GUID **v11;
INT64 v12;
unsigned int v13;
unsigned int v14;
unsigned __int8 v15;
__int64 v16;
__int64 v17;
unsigned int v18;
__int64 v19;
_PPM_ENGINE_SETTINGS *v20;
UINT8 *v21;
UINT8 v22;
char v23;
char v25;
__int64 v26;
_PPM_ENGINE_SETTINGS *v27;
__int64 v28;
unsigned int v29;
__int64 v30;
__int64 v31;
unsigned __int64 v32;
bool v33;
UINT8 v34;
char v35;
UINT64 SettingValueSize;
UINT64 SettingValueSizea;
UINT64 SettingValueSizeb;
UINT64 SettingValueSizec;
_SYSTEM_POWER_CONDITION v40;
char v41;
char v42;
INT64 v43;
_PPM_POLICY_ACTION_MASK ActionMask[2];
UINT64 v45;
_PPM_POLICY_SETTINGS_MASK SettingMask;
__int64 v47;
UINT8 *v48;
GUID v49;
v5 = 0;
v6.Value = PowerCondition;
v48 = NewValue;
LOBYTE(v40) = 0;
v42 = 0;
LOBYTE(v43) = 0;
if( !(_DWORD)ValueLength || !NewValue )
return -1073741811;
if( PowerCondition )
goto LABEL_7;
v9 = *(_QWORD *)&ProfileGuid->Data1 - *(_QWORD *)&GUID_POWER_POLICY_PROFILE_LOW_POWER.Data1;
if( *(_QWORD *)&ProfileGuid->Data1 == *(_QWORD *)&GUID_POWER_POLICY_PROFILE_LOW_POWER.Data1 )
v9 = *(_QWORD *)ProfileGuid->Data4 - *(_QWORD *)GUID_POWER_POLICY_PROFILE_LOW_POWER.Data4;
if( v9 )
{
LABEL_7:
v10 = 0;
v11 = &off_140CFAB48;
LABEL_8:
v12 = (INT64)(v11 - 1);
v13 = 0;
v14 = ((*((_BYTE *)v11 + 29) & 4) != 0) + 1;
v49 = **v11;
v15 = v49.Data4[7];
while( 1 )
{
v16 = *(_QWORD *)&v49.Data1 - *(_QWORD *)&SettingGuid->Data1;
if( *(_QWORD *)&v49.Data1 == *(_QWORD *)&SettingGuid->Data1 )
v16 = *(_QWORD *)v49.Data4 - *(_QWORD *)SettingGuid->Data4;
if( !v16 )
break;
++v15;
++v13;
v49.Data4[7] = v15;
if( v13 >= v14 )
{
++v10;
v11 += 5;
if( v10 < 0x35 )
goto LABEL_8;
return -1073741275;
}
}
v17 = 1i64 << *(_BYTE *)(v12 + 36);
v18 = v13;
if( (*(_BYTE *)(v12 + 37) & 1) != 0 )
PpmAcquireLock((_PPM_LOCK *)((char *)&stru_140C23628 + 1048));
else
PopAcquireRwLockExclusive((_POP_RW_LOCK *)((char *)&stru_140C23628 + 984));
*(_QWORD *)&v49.Data1 = *(&stru_140C00F40 + 365);
ActionMask[0] = (_PPM_POLICY_ACTION_MASK)*(&stru_140C23628 + 441);
v19 = *(_QWORD *)&ProfileGuid->Data1 - *(_QWORD *)&NullGuid.Data1;
if( *(_QWORD *)&ProfileGuid->Data1 == *(_QWORD *)&NullGuid.Data1 )
v19 = *(_QWORD *)ProfileGuid->Data4 - *(_QWORD *)NullGuid.Data4;
if( v19 )
{
v29 = 0;
if( !PpmProfileCount )
{
LABEL_60:
PpmInfoReleaseLocks(v12);
return -1073741275;
}
while( 1 )
{
v30 = PpmProfiles + 5552i64 * v29;
v31 = *(_QWORD *)(v30 + 12) - *(_QWORD *)&ProfileGuid->Data1;
if( !v31 )
v31 = *(_QWORD *)(v30 + 20) - *(_QWORD *)ProfileGuid->Data4;
if( !v31 )
break;
if( ++v29 >= (unsigned __int8)PpmProfileCount )
goto LABEL_60;
}
LODWORD(v45) = *(_DWORD *)(v12 + 32);
v32 = v30 + 2736 * v6.Value + 40;
v33 = (*(_BYTE *)(v12 + 37) & 4) == 0;
SettingMask.Value = v32 + *(_QWORD *)(v12 + 24) + v13 * (unsigned int)v45;
if( !v33 && !v13 && (v17 & *(_QWORD *)(v32 + 8)) == 0 )
v18 = 1;
LODWORD(SettingValueSize) = ValueLength;
v34 = PpmInfoAdjustSetting(
(_PPM_POLICY_CONFIG_ENTRY *)v12,
(_PPM_ENGINE_SETTINGS *)(v30 + 2736 * v6.Value + 40),
v13,
v18,
v48,
SettingValueSize);
*(_QWORD *)(v32 + 8i64 * v13) |= v17;
if( v34 )
{
LODWORD(SettingValueSizec) = v45;
PpmEventTraceProfileSetting(
*(_BYTE *)(v30 + 8),
*(INT8 **)v12,
*(_GUID **)(v12 + 8),
v13,
(UINT8 *)SettingMask.Value,
SettingValueSizec,
v6._bf_0,
0,
v40,
v43);
if( *(_QWORD *)&v49.Data1 == v30 )
{
v35 = v42;
if( *(_DWORD *)ActionMask == v6._bf_0 )
v35 = 1;
v42 = v35;
}
if( PpmBackgroundProfile == v30 || PpmMultimediaQosProfile == v30 || PpmEntryLevelPerfProfile == v30 )
{
v23 = v43;
if( *(_DWORD *)ActionMask == v6._bf_0 )
v23 = 1;
goto LABEL_23;
}
}
}
else
{
SettingMask.Value = v6.Value;
v47 = 2736 * v6.Value;
v20 = &PpmDefaultProfile.Settings[v6.Value];
LODWORD(v45) = *(_DWORD *)(v12 + 32);
v21 = (UINT8 *)v20 + *(_QWORD *)(v12 + 24) + v13 * (unsigned int)v45;
if( (*(_BYTE *)(v12 + 37) & 4) != 0 && !v13 && (v17 & v20->ExplicitSetting[1].Value) == 0 )
{
LOBYTE(v40) = 1;
v18 = 1;
}
LODWORD(SettingValueSize) = ValueLength;
v22 = PpmInfoAdjustSetting(
(_PPM_POLICY_CONFIG_ENTRY *)v12,
&PpmDefaultProfile.Settings[v6.Value],
v13,
v18,
v48,
SettingValueSize);
v20->ExplicitSetting[v13].Value |= v17;
if( v22 )
{
LODWORD(SettingValueSizea) = v45;
PpmEventTraceProfileSetting(
PpmDefaultProfile.Id,
*(INT8 **)v12,
*(_GUID **)(v12 + 8),
v13,
v21,
SettingValueSizea,
v6._bf_0,
0,
v40,
v43);
v25 = v42;
if( *(_POP_PPM_PROFILE **)&v49.Data1 == &PpmDefaultProfile )
{
v25 = v42;
if( *(_DWORD *)ActionMask == v6._bf_0 )
v25 = 1;
v42 = v25;
}
if( PpmProfileCount )
{
v26 = (unsigned __int8)PpmProfileCount;
*(_QWORD *)&ActionMask[0].Value = (int)ActionMask[0];
v27 = (_PPM_ENGINE_SETTINGS *)(v47 + 40 + PpmProfiles);
v45 = v47 + 40;
v28 = -40i64;
v47 = -40i64;
do
{
if( (*(_QWORD *)&v27->PerfIncreaseThreshold[8 * v13 + v28] & v17) == 0
&& (!v13 || (v17 & v27->ExplicitSetting[0].Value) == 0) )
{
if( (*(_BYTE *)(v12 + 37) & 4) != 0 && !v13 )
{
if( v41 )
{
if( (v17 & *(_QWORD *)((_BYTE *)&v27->PerfFrequencyCap[1] + v28)) == 0 )
v18 = 1;
}
else
{
v18 = 0;
}
}
LODWORD(SettingValueSizeb) = ValueLength;
PpmInfoAdjustSetting((_PPM_POLICY_CONFIG_ENTRY *)v12, v27, v13, v18, v48, SettingValueSizeb);
v28 = v47;
if( *(_PPM_ENGINE_SETTINGS **)&v49.Data1 == (_PPM_ENGINE_SETTINGS *)((char *)v27 - v45)
&& *(_QWORD *)&ActionMask[0].Value == SettingMask.Value )
{
v25 = 1;
}
}
v27 = (_PPM_ENGINE_SETTINGS *)((char *)v27 + 5552);
--v26;
}
while( v26 );
v42 = v25;
}
}
}
v23 = v43;
LABEL_23:
ActionMask[0] = 0;
if( v42 || PopHeteroSystem && PpmPerfSchedulerDirectedPerfStatesSupported && v23 )
{
SettingMask.Value = 1i64 << *(_BYTE *)(v12 + 36);
PpmGetPolicyAction(&SettingMask, ActionMask);
if( (*(_BYTE *)(v12 + 37) & 1) != 0 )
{
PpmReapplyPerfPolicy(ActionMask);
}
else
{
PpmReapplyIdlePolicy();
PopReleaseRwLock((_POP_RW_LOCK *)((char *)&stru_140C23628 + 984));
}
}
else
{
PpmInfoReleaseLocks(v12);
}
}
return v5;
}Referenced by:
PopSetNewPolicyValue
PpmProcessSettingsFromQueryTable