PpmTranslateIdleAccounting
UINT64 __fastcall PpmTranslateIdleAccounting(_PROCESSOR_POWER_STATE *a1, __int64 a2, UINT64 *a3){
UINT64 *v3;
_PROC_IDLE_ACCOUNTING *IdleAccounting;
unsigned int StateCount;
UINT64 result;
__int64 v9;
unsigned int *p_Count;
__int64 v11;
UINT64 PriorIdleTime;
UINT64 v13;
unsigned int *v14;
_DWORD *v15;
__int64 v16;
unsigned int v17;
unsigned int *v18;
__int64 v19;
unsigned int v20;
UINT64 v21;
unsigned int v22;
unsigned int v23;
int v24;
__int64 v25;
unsigned int *v26;
v3 = a3;
PpmUpdateProcessorIdleAccounting(a1);
IdleAccounting = a1->IdleAccounting;
StateCount = IdleAccounting->StateCount;
*(_DWORD *)a2 = IdleAccounting->StateCount;
*(_DWORD *)(a2 + 4) = IdleAccounting->TotalTransitions;
*(_DWORD *)(a2 + 8) = IdleAccounting->ResetCount;
*(_DWORD *)(a2 + 12) = IdleAccounting->AbortCount;
*(_QWORD *)(a2 + 16) = IdleAccounting->StartTime;
result = IdleAccounting->PriorIdleTime;
if( StateCount )
{
v9 = a2 + 32;
p_Count = &IdleAccounting->State[0].IdleTimeBuckets[20].Count;
v11 = StateCount;
PriorIdleTime = IdleAccounting->PriorIdleTime;
do
{
PriorIdleTime += *((_QWORD *)p_Count - 104);
v13 = PopQpcFrequency;
*(_DWORD *)v9 = *(p_Count - 206) + *(p_Count - 205) + *(p_Count - 204);
*(_DWORD *)(v9 + 4) = *(p_Count - 205);
*(_DWORD *)(v9 + 20) = *(p_Count - 206);
*(_DWORD *)(v9 + 8) = *(p_Count - 203);
*(_QWORD *)(v9 - 8) = PpmConvertTime(*((_QWORD *)p_Count - 104), v13, 0xF4240ui64);
*(_DWORD *)(v9 + 12) = PpmConvertTime(*((_QWORD *)p_Count - 101), v13, 0xF4240ui64);
*(_DWORD *)(v9 + 16) = PpmConvertTime(*((_QWORD *)p_Count - 100), v13, 0xF4240ui64);
v14 = p_Count - 130;
v15 = (_DWORD *)(v9 + 36);
v16 = 16i64;
do
{
*(_QWORD *)(v15 - 3) = PpmConvertTime(*((_QWORD *)v14 - 2), v13, 0xF4240ui64);
*(v15 - 1) = PpmConvertTime(*((_QWORD *)v14 - 1), v13, 0xF4240ui64);
*v15 = PpmConvertTime(*(_QWORD *)v14, v13, 0xF4240ui64);
v15 += 6;
v17 = v14[2];
v14 += 8;
*(v15 - 5) = v17;
--v16;
}
while( v16 );
v18 = p_Count - 164;
v19 = 4i64;
do
{
v20 = v18[4];
if( v20 )
{
*(_DWORD *)(v9 + 40) += v20;
v21 = PopQpcFrequency;
*(_QWORD *)(v9 + 24) += PpmConvertTime(*((_QWORD *)v18 - 1), PopQpcFrequency, 0xF4240ui64);
v22 = PpmConvertTime(*(_QWORD *)v18, v21, 0xF4240ui64);
v23 = PpmConvertTime(*((_QWORD *)v18 + 1), v21, 0xF4240ui64);
if( *(_DWORD *)(v9 + 32) > v22 )
*(_DWORD *)(v9 + 32) = v22;
if( *(_DWORD *)(v9 + 36) < v23 )
*(_DWORD *)(v9 + 36) = v23;
}
v18 += 8;
--v19;
}
while( v19 );
v24 = *(_DWORD *)(v9 + 8);
v25 = 6i64;
v26 = p_Count;
do
{
v24 += *v26;
v26 += 8;
*(_DWORD *)(v9 + 8) = v24;
--v25;
}
while( v25 );
v9 += 416i64;
p_Count += 250;
--v11;
}
while( v11 );
result = PriorIdleTime;
v3 = a3;
}
if( v3 )
{
result = PpmConvertTime(result, PopQpcFrequency, 0xF4240ui64);
*v3 = result;
}
return result;
}Referenced by:
PpmEventTraceProcessorIdleAccounting
PpmWmiFireIdleAccountingEvent