PoGetPerfStateAndParkingInfo
CHAR __fastcall PoGetPerfStateAndParkingInfo(PROCESSOR_NUMBER *ProcNumber, INT64 a2, INT64 a3, UINT64 *a4){
unsigned int ProcessorIndexFromNumber;
__int64 v9;
_DWORD *v10;
__int64 v11;
unsigned int v12;
unsigned int v13;
UINT64 v14;
unsigned __int8 CurrentIrql;
INT64 v16;
int ThroughputInfoCallback;
int v18;
int v20[4];
int v21;
INT64 v22;
__int64 v23;
memset((INT64)&v23, 0i64);
v20[0] = 0;
*(_OWORD *)a2 = 0i64;
*(_OWORD *)(a2 + 16) = 0i64;
ProcessorIndexFromNumber = KeGetProcessorIndexFromNumber(ProcNumber);
KeGetPrcb(ProcessorIndexFromNumber);
v10 = *(_DWORD **)(v9 + 33128);
v11 = v9;
PpmPerfGetCurrentState(
v9,
(_DWORD *)(a2 + 4),
(unsigned int *)v20,
(_DWORD *)(a2 + 8),
(_DWORD *)a2,
(_DWORD *)(a2 + 24));
if( v10 )
{
v12 = v10[79];
*(_DWORD *)(a2 + 12) = v10[96];
v13 = v10[94];
if( v13 >= v10[95] )
v13 = v10[95];
*(_DWORD *)(a2 + 16) = v13;
if( v10[80] != v10[82] )
*(_BYTE *)(a2 + 28) = 1;
if( v13 < 0x64 )
*(_DWORD *)(a2 + 24) |= 1u;
LODWORD(v14) = (unsigned int)(100 * v20[0]) / v10[79];
}
else
{
v12 = *(_DWORD *)(v11 + 68);
LODWORD(v14) = 100;
}
*(_DWORD *)(a2 + 20) = v14;
LOBYTE(v14) = *(_BYTE *)(v11 + 33212);
*(_BYTE *)(a2 + 29) = v14;
if( a4 )
{
v14 = *(_QWORD *)(v11 + 33216);
*a4 = v14;
}
if( a3 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v16 = v12;
ThroughputInfoCallback = PpmGetThroughputInfoCallback((struct _KPRCB *)v11, a3, v12);
LOBYTE(v14) = CurrentIrql;
__writecr8(CurrentIrql);
if( ThroughputInfoCallback < 0 )
{
v21 = 1310721;
memset((INT64)&v22, 0i64);
v18 = KeGetProcessorIndexFromNumber(ProcNumber);
KeAddProcessorAffinityEx(&v21, v18);
LOBYTE(v14) = PopExecuteOnTargetProcessors((INT64)&v21, (INT64)PpmGetThroughputInfoCallback, a3, v16);
}
}
return v14;
}Referenced by:
ExpQueryProcessorInformationCounters
ExpQuerySystemInformation