PpmRegisterPerfCap
__int64 __fastcall PpmRegisterPerfCap(int *a1){
unsigned int v2;
unsigned int v3;
_KPRCB *Prcb;
_PROC_PERF_CONSTRAINT *Constraint;
INT64 Domain;
unsigned int v7;
unsigned int v8;
unsigned int PlatformCap;
_KPRCB *CheckContext;
INT64 v12;
unsigned int v13;
unsigned int v14;
__int64 v15;
__int64 v16;
_KPRCB *v17;
PpmAcquireLock((_PPM_LOCK *)((char *)&stru_140C23628 + 1048));
v2 = 0;
if( !a1[5] )
{
v3 = a1[1];
if( v3 != -1 )
{
Prcb = KeGetPrcb(v3);
Constraint = Prcb->PowerState.CheckContext.Constraint;
Domain = (INT64)Prcb->PowerState.CheckContext.Domain;
goto LABEL_4;
}
LABEL_33:
PpmReleaseLock((INT64 *)&stru_140C23628 + 131);
return(unsigned int)-1073741811;
}
v12 = PpmPerfDomainHead;
v3 = -1;
Constraint = 0i64;
if( (INT64 *)PpmPerfDomainHead == &PpmPerfDomainHead )
goto LABEL_33;
do
{
v13 = *(_DWORD *)(v12 + 200);
Domain = v12;
v14 = 0;
if( v13 )
{
v15 = *(_QWORD *)(v12 + 216);
while( 1 )
{
v16 = v15 + 136i64 * v14;
if( *(_DWORD *)(v16 + 16) )
{
if( *(_DWORD *)(v16 + 20) == a1[1] )
break;
}
if( ++v14 >= v13 )
goto LABEL_25;
}
Constraint = (_PROC_PERF_CONSTRAINT *)(v15 + 136i64 * v14);
if( v16 )
break;
}
LABEL_25:
v12 = *(_QWORD *)v12;
}
while( (INT64 *)v12 != &PpmPerfDomainHead );
LABEL_4:
if( !Domain || !Constraint )
goto LABEL_33;
v7 = a1[2];
v8 = a1[3];
Constraint->LimitReasons = a1[4];
PlatformCap = Constraint->PlatformCap;
if( PlatformCap != v7 )
{
if( PlatformCap == 100 )
{
Constraint->PlatformCapStartTime = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
}
else if( v7 == 100 )
{
PopDiagTraceProcessorThrottleDurationPerfTrack(
(*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - Constraint->PlatformCapStartTime) / 0x2710,
v3);
Constraint->PlatformCapStartTime = 0i64;
}
CheckContext = (_KPRCB *)Constraint->CheckContext;
Constraint->PlatformCap = v7;
if( CheckContext )
{
PpmEventBiosCapChange(CheckContext, v7);
}
else if( !*(_DWORD *)(Domain + 208) )
{
PpmEventHiddenProcessorBiosCapChange(*(_QWORD *)(Domain + 16) - 33128i64, (unsigned int)a1[1], (NPTEXTMETRIC *)v7);
}
PopDiagTraceProcessorThrottlePerfTrack(100 - v7, v3);
}
if( Constraint->ThermalCap != v8 )
{
v17 = (_KPRCB *)Constraint->CheckContext;
Constraint->ThermalCap = v8;
if( v17 )
{
PpmEventThermalCapChange(v17, v8);
}
else if( !*(_DWORD *)(Domain + 208) )
{
PpmEventHiddenProcessorThermalCapChange(*(_QWORD *)(Domain + 16) - 33128i64, a1[1], v8);
}
}
*(_BYTE *)(Domain + 765) = 1;
PpmCheckApplyPerfConstraints(0);
return v2;
}Referenced by:
No references.