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