WMI/WmiProvider.cs
author moel.mich
Sun, 23 Sep 2012 18:37:43 +0000
changeset 380 573f1fff48b2
parent 240 631ab73d1ae1
child 390 88d699a65cc2
permissions -rw-r--r--
Fixed Issue 387. The new implementation does not try to start a ring 0 driver that already exists, but could not be opened. It tries to delete the driver and install it new. The driver is now stored temporarily in the application folder. The driver is not correctly removed on system shutdown.
paulwerelds@224
     1
/*
paulwerelds@224
     2
 
moel@344
     3
  This Source Code Form is subject to the terms of the Mozilla Public
moel@344
     4
  License, v. 2.0. If a copy of the MPL was not distributed with this
moel@344
     5
  file, You can obtain one at http://mozilla.org/MPL/2.0/.
paulwerelds@224
     6
 
moel@344
     7
  Copyright (C) 2009-2010 Paul Werelds <paul@werelds.net>
moel@344
     8
	
paulwerelds@224
     9
*/
paulwerelds@224
    10
paulwerelds@223
    11
using System;
paulwerelds@223
    12
using System.Collections.Generic;
paulwerelds@223
    13
using System.Management.Instrumentation;
paulwerelds@223
    14
using OpenHardwareMonitor.Hardware;
paulwerelds@223
    15
paulwerelds@223
    16
[assembly: Instrumented("root/OpenHardwareMonitor")]
paulwerelds@223
    17
paulwerelds@223
    18
[System.ComponentModel.RunInstaller(true)]
paulwerelds@223
    19
public class InstanceInstaller : DefaultManagementProjectInstaller { }
paulwerelds@223
    20
paulwerelds@227
    21
namespace OpenHardwareMonitor.WMI {
paulwerelds@224
    22
  /// <summary>
paulwerelds@224
    23
  /// The WMI Provider.
paulwerelds@224
    24
  /// This class is not exposed to WMI itself.
paulwerelds@224
    25
  /// </summary>
paulwerelds@223
    26
  public class WmiProvider : IDisposable {
paulwerelds@225
    27
    private List<IWmiObject> activeInstances;
paulwerelds@223
    28
paulwerelds@223
    29
    public WmiProvider(IComputer computer) {
paulwerelds@225
    30
      activeInstances = new List<IWmiObject>();
paulwerelds@223
    31
paulwerelds@223
    32
      foreach (IHardware hardware in computer.Hardware)
paulwerelds@223
    33
        ComputerHardwareAdded(hardware);
paulwerelds@223
    34
paulwerelds@223
    35
      computer.HardwareAdded += ComputerHardwareAdded;
paulwerelds@223
    36
      computer.HardwareRemoved += ComputerHardwareRemoved;
paulwerelds@223
    37
    }
paulwerelds@223
    38
paulwerelds@223
    39
    public void Update() {
paulwerelds@225
    40
      foreach (IWmiObject instance in activeInstances)
paulwerelds@223
    41
        instance.Update();
paulwerelds@223
    42
    }
paulwerelds@223
    43
paulwerelds@223
    44
    #region Eventhandlers
paulwerelds@223
    45
    
paulwerelds@223
    46
    private void ComputerHardwareAdded(IHardware hardware) {
paulwerelds@223
    47
      if (!Exists(hardware.Identifier.ToString())) {
paulwerelds@223
    48
        foreach (ISensor sensor in hardware.Sensors)
paulwerelds@223
    49
          HardwareSensorAdded(sensor);
paulwerelds@223
    50
paulwerelds@223
    51
        hardware.SensorAdded += HardwareSensorAdded;
paulwerelds@223
    52
        hardware.SensorRemoved += HardwareSensorRemoved;
paulwerelds@223
    53
paulwerelds@223
    54
        Hardware hw = new Hardware(hardware);
paulwerelds@225
    55
        activeInstances.Add(hw);
paulwerelds@223
    56
moel@240
    57
        try {
moel@240
    58
          Instrumentation.Publish(hw);
moel@240
    59
        } catch (Exception) { }
paulwerelds@223
    60
      }
paulwerelds@223
    61
paulwerelds@223
    62
      foreach (IHardware subHardware in hardware.SubHardware)
paulwerelds@223
    63
        ComputerHardwareAdded(subHardware);
paulwerelds@223
    64
    }
paulwerelds@223
    65
paulwerelds@223
    66
    private void HardwareSensorAdded(ISensor data) {
paulwerelds@223
    67
      Sensor sensor = new Sensor(data);
paulwerelds@225
    68
      activeInstances.Add(sensor);
paulwerelds@223
    69
moel@240
    70
      try {
moel@240
    71
        Instrumentation.Publish(sensor);
moel@240
    72
      } catch (Exception) { }
paulwerelds@223
    73
    }
paulwerelds@223
    74
paulwerelds@223
    75
    private void ComputerHardwareRemoved(IHardware hardware) {
paulwerelds@223
    76
      hardware.SensorAdded -= HardwareSensorAdded;
paulwerelds@223
    77
      hardware.SensorRemoved -= HardwareSensorRemoved;
paulwerelds@223
    78
      
paulwerelds@223
    79
      foreach (ISensor sensor in hardware.Sensors) 
paulwerelds@223
    80
        HardwareSensorRemoved(sensor);
paulwerelds@223
    81
      
paulwerelds@223
    82
      foreach (IHardware subHardware in hardware.SubHardware)
paulwerelds@223
    83
        ComputerHardwareRemoved(subHardware);
paulwerelds@223
    84
paulwerelds@223
    85
      RevokeInstance(hardware.Identifier.ToString());
paulwerelds@223
    86
    }
paulwerelds@223
    87
paulwerelds@223
    88
    private void HardwareSensorRemoved(ISensor sensor) {
paulwerelds@223
    89
      RevokeInstance(sensor.Identifier.ToString());
paulwerelds@223
    90
    }
paulwerelds@223
    91
paulwerelds@223
    92
    #endregion
paulwerelds@223
    93
paulwerelds@223
    94
    #region Helpers
paulwerelds@223
    95
    
paulwerelds@223
    96
    private bool Exists(string identifier) {
paulwerelds@225
    97
      return activeInstances.Exists(h => h.Identifier == identifier);
paulwerelds@223
    98
    }
paulwerelds@223
    99
paulwerelds@223
   100
    private void RevokeInstance(string identifier) {
paulwerelds@225
   101
      int instanceIndex = activeInstances.FindIndex(
paulwerelds@223
   102
        item => item.Identifier == identifier.ToString()
paulwerelds@223
   103
      );
paulwerelds@223
   104
moel@240
   105
      try {
moel@240
   106
        Instrumentation.Revoke(activeInstances[instanceIndex]);
moel@240
   107
      } catch (Exception) { }
paulwerelds@223
   108
paulwerelds@225
   109
      activeInstances.RemoveAt(instanceIndex);
paulwerelds@223
   110
    }
paulwerelds@223
   111
paulwerelds@223
   112
    #endregion
paulwerelds@223
   113
paulwerelds@223
   114
    public void Dispose() {
moel@240
   115
      foreach (IWmiObject instance in activeInstances) {
moel@240
   116
        try {
moel@240
   117
          Instrumentation.Revoke(instance);
moel@240
   118
        } catch (Exception) { }
moel@240
   119
      }
paulwerelds@225
   120
      activeInstances = null;
paulwerelds@223
   121
    }
paulwerelds@223
   122
  }
paulwerelds@223
   123
}