PpmUpdateProcessorPolicy
VOID __stdcall PpmUpdateProcessorPolicy(_PPM_POLICY_ACTION_MASK *ActionMask){
__int64 v1;
__int64 v2;
__int64 v4;
unsigned __int64 v5;
unsigned __int64 v6;
INT64 *v7;
unsigned int i;
__int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
UINT64 v12[2];
_KAFFINITY_EX Affinity2;
v2 = v1;
LODWORD(v12[0]) = 0;
memset(Affinity2.Bitmap, 0i64, sizeof(Affinity2.Bitmap));
v4 = *(&stru_140C00F40 + 365) + 2736i64 * *(&stru_140C23628 + 441);
LOWORD(v12[0]) = *(&stru_140C23628 + 1764) & ActionMask->Value;
if( !v2 && (v12[0] & 0x400) != 0 && (KeGetCurrentPrcb()->FeatureBits & 0x8000000000i64) != 0 )
{
v10 = __readmsr(0xDB0u);
v11 = v10 & 0xFFFFFFFFFFFFFFFEui64;
if( *(_BYTE *)(v4 + 160) )
v11 = v10 | 1;
__writemsr(0xDB0u, v11);
}
LODWORD(v12[0]) &= ~0x400u;
if( LOWORD(v12[0]) )
{
v5 = (unsigned int)(10000 * *(_DWORD *)(v4 + 60));
if( v5 <= (unsigned int)KeMaximumIncrement )
LODWORD(v6) = 0;
else
v6 = (v5 - (unsigned int)KeMaximumIncrement) / 0x2710;
*(&stru_140C23628 + 954) = v6;
if( !*(&stru_140C23628 + 483) || (int)(*(&stru_140C23628 + 483))() >= 0 )
{
if( v2 )
{
v7 = *(INT64 **)v2;
}
else
{
v2 = PpmPerfDomainHead;
v7 = &PpmPerfDomainHead;
}
*(_DWORD *)&Affinity2.Count = 1310721;
memset(&Affinity2.Reserved, 0i64, 0xA4u);
while( (INT64 *)v2 != v7 )
{
KeOrAffinityEx((INT8 *)(v2 + 24), &Affinity2.Count, (INT8 *)&Affinity2);
for( i = 0; i < *(_DWORD *)(v2 + 200); ++i )
{
v9 = *(_QWORD *)(v2 + 216) + 136i64 * i;
if( !*(_DWORD *)(v9 + 16) )
PpmUpdateTargetProcessorPolicy(v2, v9, v12, v4 + 40);
}
v2 = *(_QWORD *)v2;
}
PopExecuteOnTargetProcessors(
&PpmPerfStatesRegistered,
(INT64 *)PpmUpdateProcessorPolicyCallback,
(_KPRCB *)v12,
v4 + 40,
v12[0],
v12[1],
*(UINT64 *)&Affinity2.Count);
if( *(&stru_140C23628 + 482) )
(*(&stru_140C23628 + 482))();
}
}
}Referenced by:
PpmCheckInitProcessors
PpmPerfReApplyStates
PpmReapplyPerfPolicy
PpmRegisterPerfStates