PoGetPerfStateAndParkingInfo
CHAR __fastcall PoGetPerfStateAndParkingInfo(PPROCESSOR_NUMBER ProcNumber, UINT64 a5, _KPRCB *a3, UINT64 *a4){
unsigned int ProcessorIndexFromNumber;
_KPRCB *Prcb;
_PROC_PERF_DOMAIN *Domain;
_KPRCB *v11;
unsigned int NominalFrequency;
unsigned int MaxPolicyPercent;
UINT64 SnapTimeLast;
unsigned __int8 CurrentIrql;
UINT64 v16;
NTSTATUS ThroughputInfoCallback;
unsigned int v18;
UINT64 *Flags;
UINT64 *LimitReasons;
__int64 GuaranteedFrequency[2];
_KAFFINITY_EX Affinity;
memset(Affinity.Bitmap, 0i64, sizeof(Affinity.Bitmap));
LODWORD(GuaranteedFrequency[0]) = 0;
*(_OWORD *)a5 = 0i64;
*(_OWORD *)(a5 + 16) = 0i64;
ProcessorIndexFromNumber = KeGetProcessorIndexFromNumber(&ProcNumber->Group);
Prcb = KeGetPrcb(ProcessorIndexFromNumber);
Domain = Prcb->PowerState.CheckContext.Domain;
v11 = Prcb;
PpmPerfGetCurrentState(
Prcb,
(UINT64 *)(a5 + 4),
(UINT64 *)GuaranteedFrequency,
(UINT64 *)(a5 + 8),
(UINT64 *)a5,
(UINT64 *)(a5 + 24));
if( Domain )
{
NominalFrequency = Domain->NominalFrequency;
*(_DWORD *)(a5 + 12) = Domain->QosPolicies[0].MinPolicyPercent;
MaxPolicyPercent = Domain->QosPolicies[0].MaxPolicyPercent;
if( MaxPolicyPercent >= Domain->QosPolicies[0].MaxEquivalentFrequencyPercent )
MaxPolicyPercent = Domain->QosPolicies[0].MaxEquivalentFrequencyPercent;
*(_DWORD *)(a5 + 16) = MaxPolicyPercent;
if( Domain->MaxPercent != Domain->MinThrottlePercent )
*(_BYTE *)(a5 + 28) = 1;
if( MaxPolicyPercent < 0x64 )
*(_DWORD *)(a5 + 24) |= 1u;
LODWORD(SnapTimeLast) = 100 * LODWORD(GuaranteedFrequency[0]) / Domain->NominalFrequency;
}
else
{
NominalFrequency = v11->MHz;
LODWORD(SnapTimeLast) = 100;
}
*(_DWORD *)(a5 + 20) = SnapTimeLast;
LOBYTE(SnapTimeLast) = v11->PowerState.Parked;
*(_BYTE *)(a5 + 29) = SnapTimeLast;
if( a4 )
{
SnapTimeLast = v11->PowerState.SnapTimeLast;
*a4 = SnapTimeLast;
}
if( a3 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v16 = NominalFrequency;
ThroughputInfoCallback = PpmGetThroughputInfoCallback(v11, (UINT64)a3, NominalFrequency);
LOBYTE(SnapTimeLast) = CurrentIrql;
__writecr8(CurrentIrql);
if( ThroughputInfoCallback < 0 )
{
*(_DWORD *)&Affinity.Count = 1310721;
memset(&Affinity.Reserved, 0i64, 0xA4u);
v18 = KeGetProcessorIndexFromNumber(&ProcNumber->Group);
KeAddProcessorAffinityEx(&Affinity.Count, v18);
LOBYTE(SnapTimeLast) = PopExecuteOnTargetProcessors(
&Affinity,
(INT64 *)PpmGetThroughputInfoCallback,
a3,
v16,
(UINT64)Flags,
(UINT64)LimitReasons,
GuaranteedFrequency[0]);
}
}
return SnapTimeLast;
}Referenced by:
ExpQueryProcessorInformationCounters
ExpQuerySystemInformation