Hardware/Nvidia/NVAPI.cs
author moel.mich
Sun, 23 Sep 2012 18:37:43 +0000
changeset 380 573f1fff48b2
parent 334 013e148e8f12
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.
moel@1
     1
/*
moel@1
     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/.
moel@344
     6
 
moel@344
     7
  Copyright (C) 2009-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
moel@344
     8
	Copyright (C) 2011 Christian Vallières
moel@1
     9
 
moel@1
    10
*/
moel@1
    11
moel@1
    12
using System;
moel@1
    13
using System.Runtime.InteropServices;
moel@1
    14
using System.Text;
moel@1
    15
moel@1
    16
namespace OpenHardwareMonitor.Hardware.Nvidia {
moel@1
    17
moel@165
    18
  internal enum NvStatus {
moel@1
    19
    OK = 0,
moel@1
    20
    ERROR = -1,
moel@1
    21
    LIBRARY_NOT_FOUND = -2,
moel@1
    22
    NO_IMPLEMENTATION = -3,
moel@1
    23
    API_NOT_INTIALIZED = -4,
moel@1
    24
    INVALID_ARGUMENT = -5,
moel@1
    25
    NVIDIA_DEVICE_NOT_FOUND = -6,
moel@1
    26
    END_ENUMERATION = -7,
moel@1
    27
    INVALID_HANDLE = -8,
moel@1
    28
    INCOMPATIBLE_STRUCT_VERSION = -9,
moel@1
    29
    HANDLE_INVALIDATED = -10,
moel@1
    30
    OPENGL_CONTEXT_NOT_CURRENT = -11,
moel@1
    31
    NO_GL_EXPERT = -12,
moel@1
    32
    INSTRUMENTATION_DISABLED = -13,
moel@1
    33
    EXPECTED_LOGICAL_GPU_HANDLE = -100,
moel@1
    34
    EXPECTED_PHYSICAL_GPU_HANDLE = -101,
moel@1
    35
    EXPECTED_DISPLAY_HANDLE = -102,
moel@1
    36
    INVALID_COMBINATION = -103,
moel@1
    37
    NOT_SUPPORTED = -104,
moel@1
    38
    PORTID_NOT_FOUND = -105,
moel@1
    39
    EXPECTED_UNATTACHED_DISPLAY_HANDLE = -106,
moel@1
    40
    INVALID_PERF_LEVEL = -107,
moel@1
    41
    DEVICE_BUSY = -108,
moel@1
    42
    NV_PERSIST_FILE_NOT_FOUND = -109,
moel@1
    43
    PERSIST_DATA_NOT_FOUND = -110,
moel@1
    44
    EXPECTED_TV_DISPLAY = -111,
moel@1
    45
    EXPECTED_TV_DISPLAY_ON_DCONNECTOR = -112,
moel@1
    46
    NO_ACTIVE_SLI_TOPOLOGY = -113,
moel@1
    47
    SLI_RENDERING_MODE_NOTALLOWED = -114,
moel@1
    48
    EXPECTED_DIGITAL_FLAT_PANEL = -115,
moel@1
    49
    ARGUMENT_EXCEED_MAX_SIZE = -116,
moel@1
    50
    DEVICE_SWITCHING_NOT_ALLOWED = -117,
moel@1
    51
    TESTING_CLOCKS_NOT_SUPPORTED = -118,
moel@1
    52
    UNKNOWN_UNDERSCAN_CONFIG = -119,
moel@1
    53
    TIMEOUT_RECONFIGURING_GPU_TOPO = -120,
moel@1
    54
    DATA_NOT_FOUND = -121,
moel@1
    55
    EXPECTED_ANALOG_DISPLAY = -122,
moel@1
    56
    NO_VIDLINK = -123,
moel@1
    57
    REQUIRES_REBOOT = -124,
moel@1
    58
    INVALID_HYBRID_MODE = -125,
moel@1
    59
    MIXED_TARGET_TYPES = -126,
moel@1
    60
    SYSWOW64_NOT_SUPPORTED = -127,
moel@1
    61
    IMPLICIT_SET_GPU_TOPOLOGY_CHANGE_NOT_ALLOWED = -128,
moel@1
    62
    REQUEST_USER_TO_CLOSE_NON_MIGRATABLE_APPS = -129,
moel@1
    63
    OUT_OF_MEMORY = -130,
moel@1
    64
    WAS_STILL_DRAWING = -131,
moel@1
    65
    FILE_NOT_FOUND = -132,
moel@1
    66
    TOO_MANY_UNIQUE_STATE_OBJECTS = -133,
moel@1
    67
    INVALID_CALL = -134,
moel@1
    68
    D3D10_1_LIBRARY_NOT_FOUND = -135,
moel@1
    69
    FUNCTION_NOT_FOUND = -136
moel@165
    70
  }
moel@1
    71
moel@165
    72
  internal enum NvThermalController {
moel@1
    73
    NONE = 0,
moel@309
    74
    GPU_INTERNAL,
moel@1
    75
    ADM1032,
moel@309
    76
    MAX6649,
moel@309
    77
    MAX1617,
moel@309
    78
    LM99,
moel@309
    79
    LM89,
moel@309
    80
    LM64,
moel@1
    81
    ADT7473,
moel@1
    82
    SBMAX6649,
moel@309
    83
    VBIOSEVT,
moel@309
    84
    OS,
moel@1
    85
    UNKNOWN = -1,
moel@165
    86
  }
moel@1
    87
moel@165
    88
  internal enum NvThermalTarget {
moel@1
    89
    NONE = 0,
moel@1
    90
    GPU = 1,
moel@1
    91
    MEMORY = 2,
moel@1
    92
    POWER_SUPPLY = 4,
moel@1
    93
    BOARD = 8,
moel@1
    94
    ALL = 15,
moel@1
    95
    UNKNOWN = -1
moel@1
    96
  };
moel@1
    97
moel@61
    98
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
    99
  internal struct NvSensor {
moel@1
   100
    public NvThermalController Controller;
moel@140
   101
    public uint DefaultMinTemp;
moel@140
   102
    public uint DefaultMaxTemp;
moel@140
   103
    public uint CurrentTemp;
moel@309
   104
    public NvThermalTarget Target;
moel@1
   105
  }
moel@1
   106
moel@61
   107
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   108
  internal struct NvGPUThermalSettings {
moel@140
   109
    public uint Version;
moel@140
   110
    public uint Count;
moel@309
   111
    [MarshalAs(UnmanagedType.ByValArray,
moel@1
   112
      SizeConst = NVAPI.MAX_THERMAL_SENSORS_PER_GPU)]
moel@1
   113
    public NvSensor[] Sensor;
moel@1
   114
  }
moel@1
   115
moel@61
   116
  [StructLayout(LayoutKind.Sequential)]
moel@165
   117
  internal struct NvDisplayHandle {
moel@195
   118
    private readonly IntPtr ptr;
moel@1
   119
  }
moel@1
   120
moel@61
   121
  [StructLayout(LayoutKind.Sequential)]
moel@165
   122
  internal struct NvPhysicalGpuHandle {
moel@195
   123
    private readonly IntPtr ptr;
moel@1
   124
  }
moel@1
   125
moel@140
   126
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   127
  internal struct NvClocks {
moel@140
   128
    public uint Version;
moel@140
   129
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_CLOCKS_PER_GPU)]
moel@140
   130
    public uint[] Clock;
moel@140
   131
  }
moel@140
   132
moel@140
   133
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   134
  internal struct NvPState {
moel@140
   135
    public bool Present;
moel@140
   136
    public int Percentage;
moel@140
   137
  }
moel@140
   138
moel@140
   139
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   140
  internal struct NvPStates {
moel@140
   141
    public uint Version;
moel@140
   142
    public uint Flags;
moel@140
   143
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_PSTATES_PER_GPU)]
moel@140
   144
    public NvPState[] PStates;
moel@140
   145
  }
moel@140
   146
moel@140
   147
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   148
  internal struct NvUsages {
moel@140
   149
    public uint Version;
moel@140
   150
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_USAGES_PER_GPU)]
moel@140
   151
    public uint[] Usage;
moel@140
   152
  }
moel@140
   153
moel@140
   154
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   155
  internal struct NvCooler {
moel@140
   156
    public int Type;
moel@140
   157
    public int Controller;
moel@140
   158
    public int DefaultMin;
moel@140
   159
    public int DefaultMax;
moel@140
   160
    public int CurrentMin;
moel@140
   161
    public int CurrentMax;
moel@140
   162
    public int CurrentLevel;
moel@140
   163
    public int DefaultPolicy;
moel@140
   164
    public int CurrentPolicy;
moel@140
   165
    public int Target;
moel@140
   166
    public int ControlType;
moel@140
   167
    public int Active;
moel@140
   168
  }
moel@140
   169
moel@140
   170
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   171
  internal struct NvGPUCoolerSettings {
moel@140
   172
    public uint Version;
moel@140
   173
    public uint Count;
moel@140
   174
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_COOLER_PER_GPU)]
moel@140
   175
    public NvCooler[] Cooler;
moel@140
   176
  }
moel@140
   177
moel@140
   178
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@309
   179
  internal struct NvLevel {
moel@309
   180
    public int Level;
moel@309
   181
    public int Policy;
moel@309
   182
  }
moel@309
   183
moel@309
   184
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@309
   185
  internal struct NvGPUCoolerLevels {
moel@309
   186
    public uint Version;
moel@309
   187
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = NVAPI.MAX_COOLER_PER_GPU)]
moel@309
   188
    public NvLevel[] Levels;
moel@309
   189
  }
moel@309
   190
moel@309
   191
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   192
  internal struct NvMemoryInfo {
moel@140
   193
    public uint Version;
moel@309
   194
    [MarshalAs(UnmanagedType.ByValArray, SizeConst =
moel@140
   195
      NVAPI.MAX_MEMORY_VALUES_PER_GPU)]
moel@140
   196
    public uint[] Values;
moel@140
   197
  }
moel@140
   198
moel@140
   199
  [StructLayout(LayoutKind.Sequential, Pack = 8)]
moel@165
   200
  internal struct NvDisplayDriverVersion {
moel@140
   201
    public uint Version;
moel@140
   202
    public uint DriverVersion;
moel@140
   203
    public uint BldChangeListNum;
moel@140
   204
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NVAPI.SHORT_STRING_MAX)]
moel@140
   205
    public string BuildBranch;
moel@140
   206
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NVAPI.SHORT_STRING_MAX)]
moel@140
   207
    public string Adapter;
moel@165
   208
  }
moel@140
   209
moel@165
   210
  internal class NVAPI {
moel@1
   211
moel@1
   212
    public const int MAX_PHYSICAL_GPUS = 64;
moel@140
   213
    public const int SHORT_STRING_MAX = 64;
moel@140
   214
moel@309
   215
    public const int MAX_THERMAL_SENSORS_PER_GPU = 3;
moel@140
   216
    public const int MAX_CLOCKS_PER_GPU = 0x120;
moel@140
   217
    public const int MAX_PSTATES_PER_GPU = 8;
moel@140
   218
    public const int MAX_USAGES_PER_GPU = 33;
moel@140
   219
    public const int MAX_COOLER_PER_GPU = 20;
moel@140
   220
    public const int MAX_MEMORY_VALUES_PER_GPU = 5;
moel@140
   221
moel@140
   222
    public static readonly uint GPU_THERMAL_SETTINGS_VER = (uint)
moel@1
   223
      Marshal.SizeOf(typeof(NvGPUThermalSettings)) | 0x10000;
moel@140
   224
    public static readonly uint GPU_CLOCKS_VER = (uint)
moel@140
   225
      Marshal.SizeOf(typeof(NvClocks)) | 0x20000;
moel@140
   226
    public static readonly uint GPU_PSTATES_VER = (uint)
moel@140
   227
      Marshal.SizeOf(typeof(NvPStates)) | 0x10000;
moel@140
   228
    public static readonly uint GPU_USAGES_VER = (uint)
moel@140
   229
      Marshal.SizeOf(typeof(NvUsages)) | 0x10000;
moel@140
   230
    public static readonly uint GPU_COOLER_SETTINGS_VER = (uint)
moel@140
   231
      Marshal.SizeOf(typeof(NvGPUCoolerSettings)) | 0x20000;
moel@309
   232
    public static readonly uint GPU_MEMORY_INFO_VER = (uint)
moel@140
   233
      Marshal.SizeOf(typeof(NvMemoryInfo)) | 0x20000;
moel@140
   234
    public static readonly uint DISPLAY_DRIVER_VERSION_VER = (uint)
moel@140
   235
      Marshal.SizeOf(typeof(NvDisplayDriverVersion)) | 0x10000;
moel@309
   236
    public static readonly uint GPU_COOLER_LEVELS_VER = (uint)
moel@309
   237
      Marshal.SizeOf(typeof(NvGPUCoolerLevels)) | 0x10000;
moel@309
   238
moel@1
   239
    private delegate IntPtr nvapi_QueryInterfaceDelegate(uint id);
moel@1
   240
    private delegate NvStatus NvAPI_InitializeDelegate();
moel@1
   241
    private delegate NvStatus NvAPI_GPU_GetFullNameDelegate(
moel@1
   242
      NvPhysicalGpuHandle gpuHandle, StringBuilder name);
moel@1
   243
moel@1
   244
    public delegate NvStatus NvAPI_GPU_GetThermalSettingsDelegate(
moel@309
   245
      NvPhysicalGpuHandle gpuHandle, int sensorIndex,
moel@1
   246
      ref NvGPUThermalSettings nvGPUThermalSettings);
moel@1
   247
    public delegate NvStatus NvAPI_EnumNvidiaDisplayHandleDelegate(int thisEnum,
moel@1
   248
      ref NvDisplayHandle displayHandle);
moel@1
   249
    public delegate NvStatus NvAPI_GetPhysicalGPUsFromDisplayDelegate(
moel@309
   250
      NvDisplayHandle displayHandle, [Out] NvPhysicalGpuHandle[] gpuHandles,
moel@140
   251
      out uint gpuCount);
moel@1
   252
    public delegate NvStatus NvAPI_EnumPhysicalGPUsDelegate(
moel@1
   253
      [Out] NvPhysicalGpuHandle[] gpuHandles, out int gpuCount);
moel@38
   254
    public delegate NvStatus NvAPI_GPU_GetTachReadingDelegate(
moel@38
   255
      NvPhysicalGpuHandle gpuHandle, out int value);
moel@140
   256
    public delegate NvStatus NvAPI_GPU_GetAllClocksDelegate(
moel@140
   257
      NvPhysicalGpuHandle gpuHandle, ref NvClocks nvClocks);
moel@140
   258
    public delegate NvStatus NvAPI_GPU_GetPStatesDelegate(
moel@140
   259
      NvPhysicalGpuHandle gpuHandle, ref NvPStates nvPStates);
moel@140
   260
    public delegate NvStatus NvAPI_GPU_GetUsagesDelegate(
moel@140
   261
      NvPhysicalGpuHandle gpuHandle, ref NvUsages nvUsages);
moel@140
   262
    public delegate NvStatus NvAPI_GPU_GetCoolerSettingsDelegate(
moel@140
   263
      NvPhysicalGpuHandle gpuHandle, int coolerIndex,
moel@140
   264
      ref NvGPUCoolerSettings nvGPUCoolerSettings);
moel@309
   265
    public delegate NvStatus NvAPI_GPU_SetCoolerLevelsDelegate(
moel@309
   266
      NvPhysicalGpuHandle gpuHandle, int coolerIndex,
moel@309
   267
      ref NvGPUCoolerLevels NvGPUCoolerLevels);
moel@140
   268
    public delegate NvStatus NvAPI_GPU_GetMemoryInfoDelegate(
moel@140
   269
      NvDisplayHandle displayHandle, ref NvMemoryInfo nvMemoryInfo);
moel@140
   270
    public delegate NvStatus NvAPI_GetDisplayDriverVersionDelegate(
moel@140
   271
      NvDisplayHandle displayHandle, [In, Out] ref NvDisplayDriverVersion
moel@140
   272
      nvDisplayDriverVersion);
moel@140
   273
    public delegate NvStatus NvAPI_GetInterfaceVersionStringDelegate(
moel@140
   274
      StringBuilder version);
moel@334
   275
    public delegate NvStatus NvAPI_GPU_GetPCIIdentifiersDelegate(
moel@334
   276
      NvPhysicalGpuHandle gpuHandle, out uint deviceId, out uint subSystemId, 
moel@334
   277
      out uint revisionId, out uint extDeviceId);
moel@1
   278
moel@195
   279
    private static readonly bool available;
moel@195
   280
    private static readonly nvapi_QueryInterfaceDelegate nvapi_QueryInterface;
moel@195
   281
    private static readonly NvAPI_InitializeDelegate NvAPI_Initialize;
moel@309
   282
    private static readonly NvAPI_GPU_GetFullNameDelegate
moel@195
   283
      _NvAPI_GPU_GetFullName;
moel@195
   284
    private static readonly NvAPI_GetInterfaceVersionStringDelegate
moel@140
   285
      _NvAPI_GetInterfaceVersionString;
moel@1
   286
moel@309
   287
    public static readonly NvAPI_GPU_GetThermalSettingsDelegate
moel@1
   288
      NvAPI_GPU_GetThermalSettings;
moel@140
   289
    public static readonly NvAPI_EnumNvidiaDisplayHandleDelegate
moel@1
   290
      NvAPI_EnumNvidiaDisplayHandle;
moel@140
   291
    public static readonly NvAPI_GetPhysicalGPUsFromDisplayDelegate
moel@1
   292
      NvAPI_GetPhysicalGPUsFromDisplay;
moel@140
   293
    public static readonly NvAPI_EnumPhysicalGPUsDelegate
moel@1
   294
      NvAPI_EnumPhysicalGPUs;
moel@140
   295
    public static readonly NvAPI_GPU_GetTachReadingDelegate
moel@38
   296
      NvAPI_GPU_GetTachReading;
moel@140
   297
    public static readonly NvAPI_GPU_GetAllClocksDelegate
moel@140
   298
      NvAPI_GPU_GetAllClocks;
moel@140
   299
    public static readonly NvAPI_GPU_GetPStatesDelegate
moel@140
   300
      NvAPI_GPU_GetPStates;
moel@140
   301
    public static readonly NvAPI_GPU_GetUsagesDelegate
moel@140
   302
      NvAPI_GPU_GetUsages;
moel@140
   303
    public static readonly NvAPI_GPU_GetCoolerSettingsDelegate
moel@140
   304
      NvAPI_GPU_GetCoolerSettings;
moel@309
   305
    public static readonly NvAPI_GPU_SetCoolerLevelsDelegate
moel@309
   306
      NvAPI_GPU_SetCoolerLevels;
moel@140
   307
    public static readonly NvAPI_GPU_GetMemoryInfoDelegate
moel@140
   308
      NvAPI_GPU_GetMemoryInfo;
moel@140
   309
    public static readonly NvAPI_GetDisplayDriverVersionDelegate
moel@167
   310
      NvAPI_GetDisplayDriverVersion;
moel@334
   311
    public static readonly NvAPI_GPU_GetPCIIdentifiersDelegate
moel@334
   312
      NvAPI_GPU_GetPCIIdentifiers;
moel@167
   313
moel@167
   314
    private NVAPI() { }
moel@1
   315
moel@1
   316
    public static NvStatus NvAPI_GPU_GetFullName(NvPhysicalGpuHandle gpuHandle,
moel@1
   317
      out string name) {
moel@1
   318
      StringBuilder builder = new StringBuilder(SHORT_STRING_MAX);
moel@101
   319
      NvStatus status;
moel@101
   320
      if (_NvAPI_GPU_GetFullName != null)
moel@101
   321
        status = _NvAPI_GPU_GetFullName(gpuHandle, builder);
moel@101
   322
      else
moel@101
   323
        status = NvStatus.FUNCTION_NOT_FOUND;
moel@1
   324
      name = builder.ToString();
moel@1
   325
      return status;
moel@1
   326
    }
moel@1
   327
moel@140
   328
    public static NvStatus NvAPI_GetInterfaceVersionString(out string version) {
moel@140
   329
      StringBuilder builder = new StringBuilder(SHORT_STRING_MAX);
moel@140
   330
      NvStatus status;
moel@140
   331
      if (_NvAPI_GetInterfaceVersionString != null)
moel@140
   332
        status = _NvAPI_GetInterfaceVersionString(builder);
moel@140
   333
      else
moel@140
   334
        status = NvStatus.FUNCTION_NOT_FOUND;
moel@140
   335
      version = builder.ToString();
moel@140
   336
      return status;
moel@140
   337
    }
moel@140
   338
moel@1
   339
    private static string GetDllName() {
moel@1
   340
      if (IntPtr.Size == 4) {
moel@1
   341
        return "nvapi.dll";
moel@1
   342
      } else {
moel@1
   343
        return "nvapi64.dll";
moel@1
   344
      }
moel@1
   345
    }
moel@1
   346
moel@309
   347
    private static void GetDelegate<T>(uint id, out T newDelegate)
moel@309
   348
      where T : class {
moel@1
   349
      IntPtr ptr = nvapi_QueryInterface(id);
moel@38
   350
      if (ptr != IntPtr.Zero) {
moel@38
   351
        newDelegate =
moel@38
   352
          Marshal.GetDelegateForFunctionPointer(ptr, typeof(T)) as T;
moel@38
   353
      } else {
moel@38
   354
        newDelegate = null;
moel@38
   355
      }
moel@1
   356
    }
moel@1
   357
moel@309
   358
    static NVAPI() {
moel@1
   359
      DllImportAttribute attribute = new DllImportAttribute(GetDllName());
moel@1
   360
      attribute.CallingConvention = CallingConvention.Cdecl;
moel@1
   361
      attribute.PreserveSig = true;
moel@1
   362
      attribute.EntryPoint = "nvapi_QueryInterface";
moel@1
   363
      PInvokeDelegateFactory.CreateDelegate(attribute,
moel@1
   364
        out nvapi_QueryInterface);
moel@1
   365
moel@1
   366
      try {
moel@1
   367
        GetDelegate(0x0150E828, out NvAPI_Initialize);
moel@1
   368
      } catch (DllNotFoundException) { return; } 
moel@121
   369
        catch (EntryPointNotFoundException) { return; } 
moel@1
   370
        catch (ArgumentNullException) { return; }
moel@1
   371
moel@1
   372
      if (NvAPI_Initialize() == NvStatus.OK) {
moel@1
   373
        GetDelegate(0xE3640A56, out NvAPI_GPU_GetThermalSettings);
moel@1
   374
        GetDelegate(0xCEEE8E9F, out _NvAPI_GPU_GetFullName);
moel@1
   375
        GetDelegate(0x9ABDD40D, out NvAPI_EnumNvidiaDisplayHandle);
moel@1
   376
        GetDelegate(0x34EF9506, out NvAPI_GetPhysicalGPUsFromDisplay);
moel@1
   377
        GetDelegate(0xE5AC921F, out NvAPI_EnumPhysicalGPUs);
moel@140
   378
        GetDelegate(0x5F608315, out NvAPI_GPU_GetTachReading);
moel@140
   379
        GetDelegate(0x1BD69F49, out NvAPI_GPU_GetAllClocks);
moel@140
   380
        GetDelegate(0x60DED2ED, out NvAPI_GPU_GetPStates);
moel@140
   381
        GetDelegate(0x189A1FDF, out NvAPI_GPU_GetUsages);
moel@140
   382
        GetDelegate(0xDA141340, out NvAPI_GPU_GetCoolerSettings);
moel@309
   383
        GetDelegate(0x891FA0AE, out NvAPI_GPU_SetCoolerLevels);
moel@140
   384
        GetDelegate(0x774AA982, out NvAPI_GPU_GetMemoryInfo);
moel@140
   385
        GetDelegate(0xF951A4D1, out NvAPI_GetDisplayDriverVersion);
moel@140
   386
        GetDelegate(0x01053FA5, out _NvAPI_GetInterfaceVersionString);
moel@334
   387
        GetDelegate(0x2DDFB66E, out NvAPI_GPU_GetPCIIdentifiers);
moel@140
   388
moel@1
   389
        available = true;
moel@1
   390
      }
moel@1
   391
    }
moel@1
   392
moel@1
   393
    public static bool IsAvailable {
moel@1
   394
      get { return available; }
moel@1
   395
    }
moel@1
   396
moel@1
   397
  }
moel@1
   398
}