WMI/WmiProvider.cs
author moel.mich
Sun, 08 May 2011 22:10:13 +0000
changeset 279 6bce967ba1b5
parent 229 940d86b60be7
child 344 3145aadca3d2
permissions -rw-r--r--
Fixed the bus and core clock reading on AMD family 10h model Ah CPUs. The new "Core Performance Boost" feature of these CPUs resulted in very low accuracy of the bus speed (and as a consequence also an inaccurate TSC multiplier). This fixed Issue 205.
paulwerelds@224
     1
/*
paulwerelds@224
     2
  
paulwerelds@224
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
paulwerelds@224
     4
paulwerelds@224
     5
  The contents of this file are subject to the Mozilla Public License Version
paulwerelds@224
     6
  1.1 (the "License"); you may not use this file except in compliance with
paulwerelds@224
     7
  the License. You may obtain a copy of the License at
paulwerelds@224
     8
 
paulwerelds@224
     9
  http://www.mozilla.org/MPL/
paulwerelds@224
    10
paulwerelds@224
    11
  Software distributed under the License is distributed on an "AS IS" basis,
paulwerelds@224
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
paulwerelds@224
    13
  for the specific language governing rights and limitations under the License.
paulwerelds@224
    14
paulwerelds@224
    15
  The Original Code is the Open Hardware Monitor code.
paulwerelds@224
    16
paulwerelds@224
    17
  The Initial Developer of the Original Code is 
paulwerelds@224
    18
  Paul Werelds <paul@werelds.net>.
paulwerelds@224
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
paulwerelds@224
    20
  the Initial Developer. All Rights Reserved.
paulwerelds@224
    21
paulwerelds@224
    22
  Contributor(s):
paulwerelds@224
    23
paulwerelds@224
    24
  Alternatively, the contents of this file may be used under the terms of
paulwerelds@224
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
paulwerelds@224
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
paulwerelds@224
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
paulwerelds@224
    28
  of those above. If you wish to allow use of your version of this file only
paulwerelds@224
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
paulwerelds@224
    30
  use your version of this file under the terms of the MPL, indicate your
paulwerelds@224
    31
  decision by deleting the provisions above and replace them with the notice
paulwerelds@224
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
paulwerelds@224
    33
  the provisions above, a recipient may use your version of this file under
paulwerelds@224
    34
  the terms of any one of the MPL, the GPL or the LGPL.
paulwerelds@224
    35
 
paulwerelds@224
    36
*/
paulwerelds@224
    37
paulwerelds@223
    38
using System;
paulwerelds@223
    39
using System.Collections.Generic;
paulwerelds@223
    40
using System.Management.Instrumentation;
paulwerelds@223
    41
using OpenHardwareMonitor.Hardware;
paulwerelds@223
    42
paulwerelds@223
    43
[assembly: Instrumented("root/OpenHardwareMonitor")]
paulwerelds@223
    44
paulwerelds@223
    45
[System.ComponentModel.RunInstaller(true)]
paulwerelds@223
    46
public class InstanceInstaller : DefaultManagementProjectInstaller { }
paulwerelds@223
    47
paulwerelds@227
    48
namespace OpenHardwareMonitor.WMI {
paulwerelds@224
    49
  /// <summary>
paulwerelds@224
    50
  /// The WMI Provider.
paulwerelds@224
    51
  /// This class is not exposed to WMI itself.
paulwerelds@224
    52
  /// </summary>
paulwerelds@223
    53
  public class WmiProvider : IDisposable {
paulwerelds@225
    54
    private List<IWmiObject> activeInstances;
paulwerelds@223
    55
paulwerelds@223
    56
    public WmiProvider(IComputer computer) {
paulwerelds@225
    57
      activeInstances = new List<IWmiObject>();
paulwerelds@223
    58
paulwerelds@223
    59
      foreach (IHardware hardware in computer.Hardware)
paulwerelds@223
    60
        ComputerHardwareAdded(hardware);
paulwerelds@223
    61
paulwerelds@223
    62
      computer.HardwareAdded += ComputerHardwareAdded;
paulwerelds@223
    63
      computer.HardwareRemoved += ComputerHardwareRemoved;
paulwerelds@223
    64
    }
paulwerelds@223
    65
paulwerelds@223
    66
    public void Update() {
paulwerelds@225
    67
      foreach (IWmiObject instance in activeInstances)
paulwerelds@223
    68
        instance.Update();
paulwerelds@223
    69
    }
paulwerelds@223
    70
paulwerelds@223
    71
    #region Eventhandlers
paulwerelds@223
    72
    
paulwerelds@223
    73
    private void ComputerHardwareAdded(IHardware hardware) {
paulwerelds@223
    74
      if (!Exists(hardware.Identifier.ToString())) {
paulwerelds@223
    75
        foreach (ISensor sensor in hardware.Sensors)
paulwerelds@223
    76
          HardwareSensorAdded(sensor);
paulwerelds@223
    77
paulwerelds@223
    78
        hardware.SensorAdded += HardwareSensorAdded;
paulwerelds@223
    79
        hardware.SensorRemoved += HardwareSensorRemoved;
paulwerelds@223
    80
paulwerelds@223
    81
        Hardware hw = new Hardware(hardware);
paulwerelds@225
    82
        activeInstances.Add(hw);
paulwerelds@223
    83
moel@240
    84
        try {
moel@240
    85
          Instrumentation.Publish(hw);
moel@240
    86
        } catch (Exception) { }
paulwerelds@223
    87
      }
paulwerelds@223
    88
paulwerelds@223
    89
      foreach (IHardware subHardware in hardware.SubHardware)
paulwerelds@223
    90
        ComputerHardwareAdded(subHardware);
paulwerelds@223
    91
    }
paulwerelds@223
    92
paulwerelds@223
    93
    private void HardwareSensorAdded(ISensor data) {
paulwerelds@223
    94
      Sensor sensor = new Sensor(data);
paulwerelds@225
    95
      activeInstances.Add(sensor);
paulwerelds@223
    96
moel@240
    97
      try {
moel@240
    98
        Instrumentation.Publish(sensor);
moel@240
    99
      } catch (Exception) { }
paulwerelds@223
   100
    }
paulwerelds@223
   101
paulwerelds@223
   102
    private void ComputerHardwareRemoved(IHardware hardware) {
paulwerelds@223
   103
      hardware.SensorAdded -= HardwareSensorAdded;
paulwerelds@223
   104
      hardware.SensorRemoved -= HardwareSensorRemoved;
paulwerelds@223
   105
      
paulwerelds@223
   106
      foreach (ISensor sensor in hardware.Sensors) 
paulwerelds@223
   107
        HardwareSensorRemoved(sensor);
paulwerelds@223
   108
      
paulwerelds@223
   109
      foreach (IHardware subHardware in hardware.SubHardware)
paulwerelds@223
   110
        ComputerHardwareRemoved(subHardware);
paulwerelds@223
   111
paulwerelds@223
   112
      RevokeInstance(hardware.Identifier.ToString());
paulwerelds@223
   113
    }
paulwerelds@223
   114
paulwerelds@223
   115
    private void HardwareSensorRemoved(ISensor sensor) {
paulwerelds@223
   116
      RevokeInstance(sensor.Identifier.ToString());
paulwerelds@223
   117
    }
paulwerelds@223
   118
paulwerelds@223
   119
    #endregion
paulwerelds@223
   120
paulwerelds@223
   121
    #region Helpers
paulwerelds@223
   122
    
paulwerelds@223
   123
    private bool Exists(string identifier) {
paulwerelds@225
   124
      return activeInstances.Exists(h => h.Identifier == identifier);
paulwerelds@223
   125
    }
paulwerelds@223
   126
paulwerelds@223
   127
    private void RevokeInstance(string identifier) {
paulwerelds@225
   128
      int instanceIndex = activeInstances.FindIndex(
paulwerelds@223
   129
        item => item.Identifier == identifier.ToString()
paulwerelds@223
   130
      );
paulwerelds@223
   131
moel@240
   132
      try {
moel@240
   133
        Instrumentation.Revoke(activeInstances[instanceIndex]);
moel@240
   134
      } catch (Exception) { }
paulwerelds@223
   135
paulwerelds@225
   136
      activeInstances.RemoveAt(instanceIndex);
paulwerelds@223
   137
    }
paulwerelds@223
   138
paulwerelds@223
   139
    #endregion
paulwerelds@223
   140
paulwerelds@223
   141
    public void Dispose() {
moel@240
   142
      foreach (IWmiObject instance in activeInstances) {
moel@240
   143
        try {
moel@240
   144
          Instrumentation.Revoke(instance);
moel@240
   145
        } catch (Exception) { }
moel@240
   146
      }
paulwerelds@225
   147
      activeInstances = null;
paulwerelds@223
   148
    }
paulwerelds@223
   149
  }
paulwerelds@223
   150
}