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