Hardware/WinRing0.cs
author moel.mich
Sat, 02 Oct 2010 18:15:46 +0000
changeset 206 1fa8eddc24a7
parent 196 5e9a8595296c
permissions -rw-r--r--
Replaced HttpUtility.UrlEncode with Uri.EscapeDataString and deleted the reference to the System.Web assembly. The System.Web assembly seems to be missing on some .NET 4.0 installations (and the overhead of using it is a bit large, just for the UrlEncode method).
moel@1
     1
/*
moel@1
     2
  
moel@1
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@1
     4
moel@1
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@1
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@1
     7
  the License. You may obtain a copy of the License at
moel@1
     8
 
moel@1
     9
  http://www.mozilla.org/MPL/
moel@1
    10
moel@1
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@1
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@1
    13
  for the specific language governing rights and limitations under the License.
moel@1
    14
moel@1
    15
  The Original Code is the Open Hardware Monitor code.
moel@1
    16
moel@1
    17
  The Initial Developer of the Original Code is 
moel@1
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@1
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@1
    20
  the Initial Developer. All Rights Reserved.
moel@1
    21
moel@1
    22
  Contributor(s):
moel@1
    23
moel@1
    24
  Alternatively, the contents of this file may be used under the terms of
moel@1
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@1
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@1
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@1
    28
  of those above. If you wish to allow use of your version of this file only
moel@1
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@1
    30
  use your version of this file under the terms of the MPL, indicate your
moel@1
    31
  decision by deleting the provisions above and replace them with the notice
moel@1
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@1
    33
  the provisions above, a recipient may use your version of this file under
moel@1
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@1
    35
 
moel@1
    36
*/
moel@1
    37
moel@1
    38
using System;
moel@1
    39
using System.Runtime.InteropServices;
moel@162
    40
using System.Threading;
moel@1
    41
moel@1
    42
namespace OpenHardwareMonitor.Hardware {
moel@1
    43
moel@165
    44
  internal class WinRing0 {
moel@167
    45
moel@167
    46
    private WinRing0() { }
moel@1
    47
    
moel@1
    48
    public enum OlsDllStatus{
moel@1
    49
      OLS_DLL_NO_ERROR                        = 0,
moel@1
    50
      OLS_DLL_UNSUPPORTED_PLATFORM            = 1,
moel@1
    51
      OLS_DLL_DRIVER_NOT_LOADED               = 2,
moel@1
    52
      OLS_DLL_DRIVER_NOT_FOUND                = 3,
moel@1
    53
      OLS_DLL_DRIVER_UNLOADED                 = 4,
moel@1
    54
      OLS_DLL_DRIVER_NOT_LOADED_ON_NETWORK    = 5,
moel@1
    55
      OLS_DLL_UNKNOWN_ERROR                   = 9
moel@1
    56
    }
moel@1
    57
moel@195
    58
    private static bool available;
moel@167
    59
    private static Mutex isaBusMutex;
moel@1
    60
moel@1
    61
    private static string GetDllName() {   
moel@195
    62
      int p = (int)Environment.OSVersion.Platform;
moel@1
    63
      if ((p == 4) || (p == 128)) {
moel@1
    64
        if (IntPtr.Size == 4) {
moel@1
    65
          return "libring0.so";
moel@1
    66
        } else {
moel@1
    67
          return "libring0x64.so";
moel@1
    68
        }
moel@1
    69
      } else {
moel@1
    70
        if (IntPtr.Size == 4) {
moel@1
    71
          return "WinRing0.dll";
moel@1
    72
        } else {
moel@1
    73
          return "WinRing0x64.dll";
moel@1
    74
        }
moel@1
    75
      }                       
moel@1
    76
    }
moel@1
    77
    
moel@1
    78
    private delegate bool InitializeOlsDelegate();
moel@1
    79
    private delegate void DeinitializeOlsDelegate();
moel@1
    80
    
moel@1
    81
    public delegate bool IsCpuidDelegate();
moel@90
    82
    public delegate bool CpuidTxDelegate(uint index, uint ecxValue,
moel@90
    83
      out uint eax, out uint ebx, out uint ecx, out uint edx,
moel@90
    84
      UIntPtr threadAffinityMask);
moel@46
    85
    public delegate bool RdmsrDelegate(uint index, out uint eax, out uint edx);
moel@46
    86
    public delegate bool RdmsrTxDelegate(uint index, out uint eax, out uint edx,
moel@46
    87
      UIntPtr threadAffinityMask);
moel@1
    88
    public delegate byte ReadIoPortByteDelegate(ushort port);
moel@1
    89
    public delegate void WriteIoPortByteDelegate(ushort port, byte value);
moel@1
    90
    public delegate bool ReadPciConfigDwordExDelegate(uint pciAddress, 
moel@1
    91
      uint regAddress, out uint value);
moel@14
    92
    public delegate bool WritePciConfigDwordExDelegate(uint pciAddress, 
moel@201
    93
      uint regAddress, uint value);    
moel@201
    94
    public delegate bool RdtscDelegate(out uint eax, out uint edx);
moel@46
    95
    public delegate bool RdtscTxDelegate(out uint eax, out uint edx,
moel@201
    96
      UIntPtr threadAffinityMask);    
moel@201
    97
    public delegate bool WrmsrDelegate(uint index, uint eax, uint edx);
moel@201
    98
    public delegate bool WrmsrTxDelegate(uint index, uint eax, uint edx,
moel@46
    99
      UIntPtr threadAffinityMask);
moel@1
   100
moel@195
   101
    private static readonly InitializeOlsDelegate InitializeOls = 
moel@167
   102
      CreateDelegate<InitializeOlsDelegate>("InitializeOls");
moel@195
   103
    private static readonly DeinitializeOlsDelegate DeinitializeOls =
moel@167
   104
      CreateDelegate<DeinitializeOlsDelegate>("DeinitializeOls");
moel@1
   105
moel@167
   106
    public static readonly IsCpuidDelegate IsCpuid =
moel@167
   107
      CreateDelegate<IsCpuidDelegate>("IsCpuid");
moel@167
   108
    public static readonly CpuidTxDelegate CpuidTx =
moel@167
   109
      CreateDelegate<CpuidTxDelegate>("CpuidTx");
moel@167
   110
    public static readonly RdmsrDelegate Rdmsr =
moel@167
   111
      CreateDelegate<RdmsrDelegate>("Rdmsr");
moel@167
   112
    public static readonly RdmsrTxDelegate RdmsrTx =
moel@167
   113
      CreateDelegate<RdmsrTxDelegate>("RdmsrTx");
moel@167
   114
    public static readonly ReadIoPortByteDelegate ReadIoPortByte =
moel@167
   115
      CreateDelegate<ReadIoPortByteDelegate>("ReadIoPortByte");
moel@167
   116
    public static readonly WriteIoPortByteDelegate WriteIoPortByte =
moel@167
   117
      CreateDelegate<WriteIoPortByteDelegate>("WriteIoPortByte");
moel@167
   118
    public static readonly ReadPciConfigDwordExDelegate ReadPciConfigDwordEx =
moel@167
   119
      CreateDelegate<ReadPciConfigDwordExDelegate>("ReadPciConfigDwordEx");
moel@167
   120
    public static readonly WritePciConfigDwordExDelegate WritePciConfigDwordEx =
moel@167
   121
      CreateDelegate<WritePciConfigDwordExDelegate>("WritePciConfigDwordEx");
moel@167
   122
    public static readonly RdtscDelegate Rdtsc =
moel@167
   123
      CreateDelegate<RdtscDelegate>("Rdtsc");
moel@201
   124
    public static readonly RdtscTxDelegate RdtscTx =
moel@201
   125
      CreateDelegate<RdtscTxDelegate>("RdtscTx");    
moel@201
   126
    public static readonly WrmsrDelegate Wrmsr =
moel@201
   127
      CreateDelegate<WrmsrDelegate>("Wrmsr");
moel@201
   128
    public static readonly WrmsrTxDelegate WrmsrTx =
moel@201
   129
      CreateDelegate<WrmsrTxDelegate>("WrmsrTx");
moel@167
   130
 
moel@167
   131
    private static T CreateDelegate<T>(string entryPoint) where T : class {
moel@1
   132
      DllImportAttribute attribute = new DllImportAttribute(GetDllName());
moel@1
   133
      attribute.CallingConvention = CallingConvention.Winapi;
moel@1
   134
      attribute.PreserveSig = true;
moel@1
   135
      attribute.EntryPoint = entryPoint;
moel@1
   136
      attribute.CharSet = CharSet.Auto;
moel@167
   137
      T result;
moel@167
   138
      PInvokeDelegateFactory.CreateDelegate(attribute, out result);
moel@167
   139
      return result;
moel@1
   140
    }
moel@1
   141
moel@167
   142
    public static void Open() {
moel@1
   143
      try {
moel@1
   144
        if (InitializeOls != null && InitializeOls())
moel@1
   145
          available = true;
moel@167
   146
      } catch (DllNotFoundException) { }   
moel@167
   147
      
moel@162
   148
      isaBusMutex = new Mutex(false, "Access_ISABUS.HTP.Method");
moel@1
   149
    }
moel@167
   150
moel@1
   151
    public static bool IsAvailable {
moel@1
   152
      get { return available; }
moel@1
   153
    }
moel@1
   154
moel@167
   155
    public static void Close() {
moel@167
   156
      if (available)
moel@167
   157
        DeinitializeOls();        
moel@167
   158
      isaBusMutex.Close();      
moel@167
   159
    }    
moel@167
   160
moel@163
   161
    public static bool WaitIsaBusMutex(int millisecondsTimeout) {
moel@162
   162
      try {
moel@167
   163
        return isaBusMutex.WaitOne(millisecondsTimeout, false);
moel@167
   164
      } catch (AbandonedMutexException) { return false; } 
moel@167
   165
        catch (InvalidOperationException) { return false; }     
moel@162
   166
    }
moel@162
   167
moel@162
   168
    public static void ReleaseIsaBusMutex() {
moel@162
   169
      isaBusMutex.ReleaseMutex();
moel@196
   170
    }
moel@196
   171
moel@196
   172
    public const uint InvalidPciAddress = 0xFFFFFFFF;
moel@196
   173
moel@196
   174
    public static uint GetPciAddress(byte bus, byte device, byte function)	{
moel@196
   175
      return 
moel@196
   176
        (uint)(((bus & 0xFF) << 8) | ((device & 0x1F) << 3) | (function & 7));
moel@196
   177
    }
moel@1
   178
  }
moel@1
   179
}