# HG changeset patch
# User moel.mich
# Date 1343148348 0
# Node ID 2de3a3e5f0b5326513b7bd3076ad679360920296
# Parent  c1a0d321e6460974d90dfe8c5593f6e71597c03f
Changed the RAM implementation (removed Microsoft.VisualBasic dependency which is not implemented in Mono) and added code to prevent RAM hardware from loading on Linux.
diff -r c1a0d321e646 -r 2de3a3e5f0b5 Hardware/RAM/GenericRAM.cs
--- a/Hardware/RAM/GenericRAM.cs	Tue Jul 24 16:04:30 2012 +0000
+++ b/Hardware/RAM/GenericRAM.cs	Tue Jul 24 16:45:48 2012 +0000
@@ -8,7 +8,7 @@
 	
 */
 
-using Microsoft.VisualBasic.Devices;
+using System.Runtime.InteropServices;
 
 namespace OpenHardwareMonitor.Hardware.RAM {
   internal class GenericRAM : Hardware {
@@ -16,16 +16,14 @@
     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 @@
     }
 
     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 -r c1a0d321e646 -r 2de3a3e5f0b5 Hardware/RAM/RAMGroup.cs
--- a/Hardware/RAM/RAMGroup.cs	Tue Jul 24 16:04:30 2012 +0000
+++ b/Hardware/RAM/RAMGroup.cs	Tue Jul 24 16:45:48 2012 +0000
@@ -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 -r c1a0d321e646 -r 2de3a3e5f0b5 OpenHardwareMonitorLib.csproj
--- a/OpenHardwareMonitorLib.csproj	Tue Jul 24 16:04:30 2012 +0000
+++ b/OpenHardwareMonitorLib.csproj	Tue Jul 24 16:45:48 2012 +0000
@@ -52,7 +52,6 @@
     AllRules.ruleset
   
   
-