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