diff --git a/Hardware/RAM/GenericRAM.cs b/Hardware/RAM/GenericRAM.cs
index a52ed56..ac5da41 100644
--- a/Hardware/RAM/GenericRAM.cs
+++ b/Hardware/RAM/GenericRAM.cs
@@ -8,7 +8,7 @@
*/
-using Microsoft.VisualBasic.Devices;
+using System.Runtime.InteropServices;
namespace OpenHardwareMonitor.Hardware.RAM {
internal class GenericRAM : Hardware {
@@ -16,16 +16,14 @@ namespace OpenHardwareMonitor.Hardware.RAM {
private Sensor loadSensor;
private Sensor availableMemory;
- private ComputerInfo computerInfo;
-
public GenericRAM(string name, ISettings settings)
: base(name, new Identifier("ram"), settings)
{
- computerInfo = new ComputerInfo();
loadSensor = new Sensor("Memory", 0, SensorType.Load, this, settings);
ActivateSensor(loadSensor);
- availableMemory = new Sensor("Available Memory", 0, SensorType.Data, this, settings);
+ availableMemory = new Sensor("Available Memory", 0, SensorType.Data, this,
+ settings);
ActivateSensor(availableMemory);
}
@@ -36,12 +34,39 @@ namespace OpenHardwareMonitor.Hardware.RAM {
}
public override void Update() {
- loadSensor.Value = 100.0f -
- (100.0f * computerInfo.AvailablePhysicalMemory) /
- computerInfo.TotalPhysicalMemory;
+ NativeMethods.MemoryStatusEx status = new NativeMethods.MemoryStatusEx();
+ status.Length = checked((uint)Marshal.SizeOf(
+ typeof(NativeMethods.MemoryStatusEx)));
- availableMemory.Value = (float)computerInfo.AvailablePhysicalMemory /
+ if (!NativeMethods.GlobalMemoryStatusEx(ref status))
+ return;
+
+ loadSensor.Value = 100.0f -
+ (100.0f * status.AvailablePhysicalMemory) /
+ status.TotalPhysicalMemory;
+
+ availableMemory.Value = (float)status.AvailablePhysicalMemory /
(1024 * 1024 * 1024);
}
+
+ private class NativeMethods {
+ [StructLayout(LayoutKind.Sequential)]
+ public struct MemoryStatusEx {
+ public uint Length;
+ public uint MemoryLoad;
+ public ulong TotalPhysicalMemory;
+ public ulong AvailablePhysicalMemory;
+ public ulong TotalPageFile;
+ public ulong AvailPageFile;
+ public ulong TotalVirtual;
+ public ulong AvailVirtual;
+ public ulong AvailExtendedVirtual;
+ }
+
+ [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static extern bool GlobalMemoryStatusEx(
+ ref NativeMethods.MemoryStatusEx buffer);
+ }
}
}
diff --git a/Hardware/RAM/RAMGroup.cs b/Hardware/RAM/RAMGroup.cs
index b49aecc..e4559d0 100644
--- a/Hardware/RAM/RAMGroup.cs
+++ b/Hardware/RAM/RAMGroup.cs
@@ -8,12 +8,22 @@
*/
+using System;
+
namespace OpenHardwareMonitor.Hardware.RAM {
internal class RAMGroup : IGroup {
private IHardware[] hardware;
public RAMGroup(SMBIOS smbios, ISettings settings) {
+
+ // No implementation for RAM on Unix systems
+ int p = (int)Environment.OSVersion.Platform;
+ if ((p == 4) || (p == 128)) {
+ hardware = new IHardware[0];
+ return;
+ }
+
string name;
if (smbios.MemoryDevices.Length > 0) {
name = smbios.MemoryDevices[0].ManufacturerName + " " +
diff --git a/OpenHardwareMonitorLib.csproj b/OpenHardwareMonitorLib.csproj
index 9b1f607..8673f7a 100644
--- a/OpenHardwareMonitorLib.csproj
+++ b/OpenHardwareMonitorLib.csproj
@@ -52,7 +52,6 @@
AllRules.ruleset
-