PpmInstallFeedbackCounters

VOID __stdcall PpmInstallFeedbackCounters(_KPRCB *Prcb, _PROC_FEEDBACK_COUNTER **Counters){
  _KPRCB *v2; 
  __int64 Number; 
  unsigned __int8 CurrentIrql; 
  __int64 v6; 
  _PROC_FEEDBACK *p_PerfFeedback; 
  UINT64 PerformanceCounter; 
  bool v9; 
  signed __int64 v10; 
  _PROC_FEEDBACK_COUNTER *v11; 
  UINT64 Value; 
  _GROUP_AFFINITY v13; 
  _GROUP_AFFINITY PreviousAffinity; 
  int v15; 

  LODWORD(Value) = 0;
  v2 = Prcb;
  Number = Prcb->Number;
  v13 = 0i64;
  *(_DWORD *)v13.Reserved = 0;
  LODWORD(Number) = KiProcessorIndexToNumberMappingTable[Number];
  *(_DWORD *)&v13.Group = (unsigned __int16)((unsigned int)Number >> 6);
  v13.Reserved[2] = 0;
  v13.Mask = 1i64 << (Number & 0x3F);
  PreviousAffinity = 0i64;
  KeSetSystemGroupAffinityThread(&v13, &PreviousAffinity);
  CurrentIrql = KeGetCurrentIrql();
  v6 = 2i64;
  __writecr8(2ui64);
  p_PerfFeedback = &v2->PowerState.PerfFeedback;
  PerformanceCounter = KeQueryPerformanceCounter(0i64);
  PpmContinueActiveTimeAccumulation(v2, PerformanceCounter);
  LOWORD(v2) = v15;
  _disable();
  v9 = ((unsigned __int16)v2 & 0x200) != 0;
  KxAcquireSpinLock(&p_PerfFeedback->Lock);
  v10 = (char *)p_PerfFeedback - (char *)Counters;
  do
  {
    v11 = *Counters;
    if( *Counters )
    {
      if( v11->DiscardIdleTime )
      {
        p_PerfFeedback->CounterDiscardsIdleTime = 1;
        v11 = *Counters;
      }
      *(_PROC_FEEDBACK_COUNTER **)((char *)Counters + v10 + 24) = v11;
      *(_PROC_FEEDBACK_COUNTER **)((char *)Counters + v10 + 64) = (_PROC_FEEDBACK_COUNTER *)(100
                                                                                           * p_PerfFeedback->UnscaledTime);
      PpmPerfFeedbackCounterRead(*Counters, 1u, &Value);
    }
    ++Counters;
    --v6;
  }
  while( v6 );
  if( p_PerfFeedback->Counters[1] )
  {
    p_PerfFeedback->KernelTimesIndex = 1;
  }
  else if( p_PerfFeedback->Counters[0] )
  {
    p_PerfFeedback->KernelTimesIndex = 0;
  }
  KxReleaseSpinLock(&p_PerfFeedback->Lock);
  if( v9 )
    _enable();
  __writecr8(CurrentIrql);
  KeRevertToUserGroupAffinityThread(&PreviousAffinity);
}

Referenced by:

PpmRegisterPerfStates