PpmUpdateProcessorPolicy
__int16 __fastcall PpmUpdateProcessorPolicy(_WORD *a1, __int64 a2){
int started;
char *v5;
unsigned __int64 v6;
unsigned __int64 v7;
INT64 *v8;
unsigned int i;
__int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
_DWORD v14[4];
_KAFFINITY_EX Affinity2;
v14[0] = 0;
memset((INT64)Affinity2.Bitmap, 0i64);
LOWORD(started) = PpmAllowedActions & *a1;
v5 = (char *)PpmCurrentProfile + 2736 * dword_140C23D0C;
LOWORD(v14[0]) = started;
if( !a2 && (v14[0] & 0x400) != 0 )
{
LOWORD(started) = 0;
if( (*((_QWORD *)KeGetCurrentPrcb() + 4276) & 0x8000000000i64) != 0 )
{
v11 = __readmsr(0xDB0u);
v12 = v11 & 0xFFFFFFFFFFFFFFFEui64;
if( v5[160] )
v12 = v11 | 1;
LOWORD(started) = v12;
__writemsr(0xDB0u, v12);
}
}
v14[0] &= ~0x400u;
if( LOWORD(v14[0]) )
{
v6 = (unsigned int)(10000 * *((_DWORD *)v5 + 15));
if( v6 <= KeMaximumIncrement )
LODWORD(v7) = 0;
else
v7 = (v6 - KeMaximumIncrement) / 0x2710;
PpmPerfTimeWindow = v7;
if( !PpmPerfControlStartPolicyUpdate || (started = PpmPerfControlStartPolicyUpdate(), started >= 0) )
{
if( a2 )
{
v8 = *(INT64 **)a2;
}
else
{
a2 = PpmPerfDomainHead;
v8 = &PpmPerfDomainHead;
}
*(_DWORD *)&Affinity2.Count = 1310721;
memset((INT64)&Affinity2.Reserved, 0i64);
while( (INT64 *)a2 != v8 )
{
KeOrAffinityEx((_KAFFINITY_EX *)(a2 + 24), &Affinity2, &Affinity2);
for( i = 0; i < *(_DWORD *)(a2 + 200); ++i )
{
v10 = *(_QWORD *)(a2 + 216) + 136i64 * i;
if( !*(_DWORD *)(v10 + 16) )
PpmUpdateTargetProcessorPolicy(a2, (__int64 *)v10, v14, (__int64)(v5 + 40));
}
a2 = *(_QWORD *)a2;
}
PopExecuteOnTargetProcessors(
(INT64)&PpmPerfStatesRegistered,
(INT64)PpmUpdateProcessorPolicyCallback,
(INT64)v14,
(INT64)(v5 + 40));
LOWORD(started) = (_WORD)PpmPerfControlCompletePolicyUpdate;
if( PpmPerfControlCompletePolicyUpdate )
LOWORD(started) = PpmPerfControlCompletePolicyUpdate();
}
}
return started;
}Referenced by:
PpmCheckInitProcessors
PpmPerfReApplyStates
PpmReapplyPerfPolicy
PpmRegisterPerfStates