ExpQueryProcessorInformationCounters

VOID __stdcall ExpQueryProcessorInformationCounters(
        _KPRCB *Prcb,
        UINT8 CollectIdleCounters,
        UINT8 CollectPerfCounters,
        UINT8 CollectThroughputCounters,
        PCW_PROCESSOR_INFO *OneProcInfo){
  __int64 IdleTicks; 
  __int64 KernelTicks; 
  __int64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  _KPRCB *v18; 
  PROCESSOR_NUMBER ProcessorNumber; 
  UINT64 a5[2]; 
  __int128 v21; 
  _SYSTEM_PROCESSOR_TICK_INFORMATION TickInfo; 
  __int128 v23; 
  __int128 v24; 
  _SYSTEM_PROCESSOR_IDLE_INFORMATION IdleInfo; 

  ProcessorNumber.Group = Prcb->Group;
  ProcessorNumber.Number = Prcb->GroupIndex;
  ProcessorNumber.Reserved = 0;
  memset(&IdleInfo, 0, sizeof(IdleInfo));
  TickInfo = 0i64;
  if( CollectIdleCounters )
  {
    PoGetIdleTimes(&ProcessorNumber, &IdleInfo, &TickInfo);
    IdleTicks = TickInfo.IdleTicks;
    KernelTicks = TickInfo.KernelTicks;
    OneProcInfo->C1Time = IdleInfo.C1Time;
    OneProcInfo->C1Transitions = IdleInfo.C1Transitions;
    OneProcInfo->C2Time = IdleInfo.C2Time;
    OneProcInfo->C2Transitions = IdleInfo.C2Transitions;
    OneProcInfo->C3Time = IdleInfo.C3Time;
    OneProcInfo->C3Transitions = IdleInfo.C3Transitions;
    OneProcInfo->StallTime = TickInfo.StallTime;
    v10 = (unsigned int)KeMaximumIncrement;
    v11 = (unsigned int)KeMaximumIncrement * IdleTicks;
    v12 = (unsigned int)KeMaximumIncrement * KernelTicks;
    OneProcInfo->IdleTime = v11;
    v13 = v12 - v11;
    v14 = v11 + v10 * Prcb->AvailableTime;
  }
  else
  {
    OneProcInfo->IdleTime = 0i64;
    v13 = 0i64;
    OneProcInfo->C1Time = 0i64;
    OneProcInfo->C2Time = 0i64;
    OneProcInfo->C3Time = 0i64;
    OneProcInfo->C1Transitions = 0i64;
    OneProcInfo->C2Transitions = 0i64;
    OneProcInfo->C3Transitions = 0i64;
    OneProcInfo->StallTime = 0i64;
    v14 = 0i64;
  }
  OneProcInfo->AvailableTime = v14;
  OneProcInfo->KernelTime = v13;
  v15 = (unsigned int)KeMaximumIncrement;
  v16 = (unsigned int)KeMaximumIncrement * (unsigned __int64)Prcb->UserTime;
  *(_OWORD *)a5 = 0i64;
  v21 = 0i64;
  v23 = 0i64;
  OneProcInfo->UserTime = v16;
  OneProcInfo->Interrupts = Prcb->InterruptCount;
  v17 = v15 * Prcb->InterruptTime;
  v24 = 0i64;
  OneProcInfo->InterruptTime = v17;
  OneProcInfo->DpcCount = Prcb->DpcData[0].DpcCount;
  OneProcInfo->DpcRate = Prcb->DpcRequestRate;
  OneProcInfo->DpcTime = v15 * Prcb->DpcTime;
  OneProcInfo->ClockInterrupts = Prcb->ClockInterrupts;
  OneProcInfo->AverageIdleTime = OneProcInfo->C1Time + OneProcInfo->C2Time + OneProcInfo->C3Time;
  OneProcInfo->IdleBreakEvents = OneProcInfo->C1Transitions + OneProcInfo->C2Transitions + OneProcInfo->C3Transitions;
  v18 = (_KPRCB *)((unsigned __int64)&v23 & -(__int64)(CollectThroughputCounters != 0));
  if( CollectPerfCounters || v18 )
    PoGetPerfStateAndParkingInfo(&ProcessorNumber, (UINT64)a5, v18, 0i64);
  OneProcInfo->ParkingStatus = BYTE13(v21);
  OneProcInfo->CurrentFrequency = HIDWORD(a5[0]);
  OneProcInfo->PercentMaxFrequency = a5[1];
  OneProcInfo->StateFlags = a5[0];
  *(_QWORD *)&OneProcInfo->PerformanceLimit = *(_QWORD *)((char *)&v21 + 4);
  *(_OWORD *)&OneProcInfo->NominalThroughput = v23;
  OneProcInfo->ScaledKernelThroughput = v24;
  OneProcInfo->ScaledFrequency = *((_QWORD *)&v24 + 1);
}

Referenced by:

ExProcessorCounterSetCallback