PpmUpdateProcessorIdleAccounting

VOID __stdcall PpmUpdateProcessorIdleAccounting(_PROCESSOR_POWER_STATE *PpmState){
  _PPM_IDLE_STATES *IdleStates; 
  unsigned __int64 IdleTimeLast; 
  __int64 ActualState; 
  char *v4; 
  unsigned __int64 *v5; 
  __int64 v6; 
  __int64 v7; 

  IdleStates = PpmState->IdleStates;
  if( PpmState->IdleStates->UnaccountedTransition )
  {
    IdleTimeLast = PpmState->IdleTimeLast;
    PpmState->IdleTimeLast = 0i64;
    ActualState = IdleStates->ActualState;
    PpmState->IdleTimeTotal += IdleTimeLast;
    v4 = (char *)PpmState->IdleAccounting + 1000 * ActualState;
    *((_QWORD *)v4 + 5) += IdleTimeLast;
    if( IdleStates->PreviousCancelReason == 3 )
    {
      if( IdleStates->PreviousStatus < 0 )
      {
        ++*((_DWORD *)v4 + 13);
      }
      else
      {
        ++*((_DWORD *)v4 + 14);
        v5 = (unsigned __int64 *)&PpmIdleIntervalLimits;
        v6 = 0i64;
        do
        {
          if( IdleTimeLast < *v5 )
            break;
          v6 = (unsigned int)(v6 + 1);
          v5 += 3;
        }
        while( (unsigned int)v6 < 0x1A );
        if( (unsigned int)v6 >= 0x1A )
        {
          ++*((_DWORD *)v4 + 15);
        }
        else
        {
          v7 = 32 * v6;
          *(_QWORD *)&v4[v7 + 208] += IdleTimeLast;
          ++*(_DWORD *)&v4[v7 + 232];
          if( IdleTimeLast < *(_QWORD *)&v4[v7 + 216] )
            *(_QWORD *)&v4[v7 + 216] = IdleTimeLast;
          if( IdleTimeLast > *(_QWORD *)&v4[v7 + 224] )
            *(_QWORD *)&v4[v7 + 224] = IdleTimeLast;
        }
        if( IdleTimeLast < *((_QWORD *)v4 + 8) )
          *((_QWORD *)v4 + 8) = IdleTimeLast;
        if( IdleTimeLast > *((_QWORD *)v4 + 9) )
          *((_QWORD *)v4 + 9) = IdleTimeLast;
      }
    }
    else
    {
      ++*((_DWORD *)v4 + 12);
    }
  }
  IdleStates->PreviousStatus = 0;
  IdleStates->PreviousCancelReason = 3;
  IdleStates->UnaccountedTransition = 0;
}

Referenced by:

PpmInstallNewIdleStates
PpmTranslateIdleAccounting