PpmPerfApplyProcessorState
UINT8 __stdcall PpmPerfApplyProcessorState(_KPRCB *Prcb, UINT8 Reapply){
_PROC_PERF_CONSTRAINT *Constraint;
_KPRCB *p_CheckContext;
_PROC_PERF_DOMAIN *Domain;
CHAR v6;
char v7;
_KPRCB *Master;
UINT8 v9;
UINT64 PerformanceCounter;
INT64 v11;
UINT64 *p_QosUpdateLock;
bool v13;
CHAR updated;
__int64 v15;
__int64 v16;
void(__fastcall *DomainPerfControlHandler)(unsigned __int64, _PERF_CONTROL_STATE_SELECTION *, unsigned __int8, unsigned __int8);
UINT64 IdleGenerationCounter;
UINT64 *v20;
__int16 v21;
_PROC_PERF_CONSTRAINT *v22;
Constraint = Prcb->PowerState.CheckContext.Constraint;
p_CheckContext = (_KPRCB *)&Prcb->PowerState.CheckContext;
Domain = Prcb->PowerState.CheckContext.Domain;
v22 = Constraint;
v6 = Reapply;
v7 = 1;
Master = (_KPRCB *)Domain->Master;
if( p_CheckContext == Master || (v9 = 0, Domain->InitiateAllProcessors) )
v9 = 1;
if( Domain->Coordination != 0xFD && Reapply )
v9 = 1;
if( Prcb != KeGetCurrentPrcb() && (p_CheckContext == Master || v9 && Domain->AffinitizeControl) )
return 0;
PerformanceCounter = KeQueryPerformanceCounter(0i64);
if( KeGetCurrentPrcb() != Prcb )
{
IdleGenerationCounter = PpmGetIdleGenerationCounter(Prcb);
if( IdleGenerationCounter )
{
updated = PpmUpdatePerformanceFeedback(Prcb, 0, 1, 0, 0i64);
if( !updated )
{
LABEL_30:
if( !updated )
return updated;
v6 = Reapply;
Constraint = v22;
goto LABEL_9;
}
if( IdleGenerationCounter == PpmGetIdleGenerationCounter(Prcb) )
{
updated = 1;
goto LABEL_30;
}
}
return 0;
}
PpmContinueActiveTimeAccumulation(Prcb, PerformanceCounter);
LABEL_9:
p_QosUpdateLock = &Constraint->QosUpdateLock;
if( Constraint->UseQosUpdateLock )
{
_disable();
v20 = &Constraint->QosUpdateLock;
v13 = (v21 & 0x200) != 0;
KxAcquireSpinLock(v20);
}
else
{
v7 = 0;
v13 = 0;
}
updated = PpmPerfArbitratorApplyProcessorState((INT64)Prcb, v9, v6, v11);
if( v7 )
{
KxReleaseSpinLock(p_QosUpdateLock);
if( v13 )
_enable();
}
if( updated )
{
if( p_CheckContext == (_KPRCB *)Domain->Master )
{
DomainPerfControlHandler = Domain->DomainPerfControlHandler;
if( DomainPerfControlHandler )
{
LOBYTE(v16) = Reapply;
LOBYTE(v15) = v9;
DomainPerfControlHandler(Domain->DomainContext, Domain->QosSelection, v15, v16);
}
}
if( !Reapply )
{
PpmEventLegacyProcessorPerfStateChange((INT64)Prcb);
PpmScaleIdleStateValues(&Prcb->PowerState);
PpmEventTraceExpectedUtility(p_CheckContext);
}
}
return updated;
}Referenced by:
PpmPerfAction
PpmPerfApplyProcessorStates