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 -