# HG changeset patch # User moel.mich # Date 1267301293 0 # Node ID 15181001ee61a25d9ad1092ad11ecdd2f3e5b078 # Parent 1a7c13ac7348534a51bad912fc9a4e6cbcc88590 Added sub-hardware support and basic enumeration for mainboards. diff -r 1a7c13ac7348 -r 15181001ee61 GUI/MainForm.cs --- a/GUI/MainForm.cs Sat Feb 27 15:55:17 2010 +0000 +++ b/GUI/MainForm.cs Sat Feb 27 20:08:13 2010 +0000 @@ -159,8 +159,18 @@ } } + private void SubHardwareAdded(IHardware hardware, Node node) { + Node hardwareNode = new HardwareNode(hardware); + node.Nodes.Add(hardwareNode); + foreach (IHardware subHardware in hardware.SubHardware) + SubHardwareAdded(subHardware, hardwareNode); + } + private void HardwareAdded(IHardware hardware) { - root.Nodes.Add(new HardwareNode(hardware)); + Node hardwareNode = new HardwareNode(hardware); + root.Nodes.Add(hardwareNode); + foreach (IHardware subHardware in hardware.SubHardware) + SubHardwareAdded(subHardware, hardwareNode); } private void HardwareRemoved(IHardware hardware) { @@ -357,15 +367,25 @@ UpdatePlotSelection(null, null); } - private void UpdateSensorTypeChecked(object sender, EventArgs e) { - foreach (HardwareNode node in root.Nodes) { - node.SetVisible(SensorType.Voltage, voltMenuItem.Checked); - node.SetVisible(SensorType.Clock, clocksMenuItem.Checked); - node.SetVisible(SensorType.Load, loadMenuItem.Checked); - node.SetVisible(SensorType.Temperature, tempMenuItem.Checked); - node.SetVisible(SensorType.Fan, fansMenuItem.Checked); - node.SetVisible(SensorType.Flow, flowsMenuItem.Checked); - } + private void UpdateSensorTypeVisible(Node node) { + HardwareNode hardwareNode = node as HardwareNode; + if (hardwareNode == null) + return; + + hardwareNode.SetVisible(SensorType.Voltage, voltMenuItem.Checked); + hardwareNode.SetVisible(SensorType.Clock, clocksMenuItem.Checked); + hardwareNode.SetVisible(SensorType.Load, loadMenuItem.Checked); + hardwareNode.SetVisible(SensorType.Temperature, tempMenuItem.Checked); + hardwareNode.SetVisible(SensorType.Fan, fansMenuItem.Checked); + hardwareNode.SetVisible(SensorType.Flow, flowsMenuItem.Checked); + + foreach (Node n in node.Nodes) + UpdateSensorTypeVisible(n); + } + + private void UpdateSensorTypeChecked(object sender, EventArgs e) { + foreach (HardwareNode node in root.Nodes) + UpdateSensorTypeVisible(node); } private void ToggleSysTray() { diff -r 1a7c13ac7348 -r 15181001ee61 GUI/SensorSystemTray.cs --- a/GUI/SensorSystemTray.cs Sat Feb 27 15:55:17 2010 +0000 +++ b/GUI/SensorSystemTray.cs Sat Feb 27 20:08:13 2010 +0000 @@ -59,13 +59,17 @@ hardware.SensorRemoved -= new SensorEventHandler(SensorRemoved); foreach (ISensor sensor in hardware.Sensors) SensorRemoved(sensor); + foreach (IHardware subHardware in hardware.SubHardware) + HardwareRemoved(subHardware); } - + private void HardwareAdded(IHardware hardware) { foreach (ISensor sensor in hardware.Sensors) SensorAdded(sensor); hardware.SensorAdded += new SensorEventHandler(SensorAdded); hardware.SensorRemoved += new SensorEventHandler(SensorRemoved); + foreach (IHardware subHardware in hardware.SubHardware) + HardwareAdded(subHardware); } private void SensorAdded(ISensor sensor) { diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/Computer.cs --- a/Hardware/Computer.cs Sat Feb 27 15:55:17 2010 +0000 +++ b/Hardware/Computer.cs Sat Feb 27 20:08:13 2010 +0000 @@ -61,7 +61,7 @@ groups.Add(group); if (HardwareAdded != null) - foreach (IHardware hardware in group.Hardware) + foreach (IHardware hardware in group.Hardware) HardwareAdded(hardware); } @@ -72,7 +72,7 @@ groups.Remove(group); if (HardwareRemoved != null) - foreach (IHardware hardware in group.Hardware) + foreach (IHardware hardware in group.Hardware) HardwareRemoved(hardware); } @@ -80,8 +80,7 @@ if (open) return; - Add(new SMBIOS.SMBIOSGroup()); - Add(new LPC.LPCGroup()); + Add(new Mainboard.MainboardGroup()); Add(new CPU.CPUGroup()); Add(new ATI.ATIGroup()); Add(new Nvidia.NvidiaGroup()); @@ -93,10 +92,19 @@ open = true; } + private void SubHardwareUpdate(IHardware hardware) { + foreach (IHardware subHardware in hardware.SubHardware) { + subHardware.Update(); + SubHardwareUpdate(subHardware); + } + } + public void Update() { foreach (IGroup group in groups) - foreach (IHardware hardware in group.Hardware) + foreach (IHardware hardware in group.Hardware) { hardware.Update(); + SubHardwareUpdate(hardware); + } } public bool HDDEnabled { @@ -131,6 +139,38 @@ writer.WriteLine(); } + private void ReportHardwareTree(IHardware hardware, TextWriter w, + string space) + { + w.WriteLine("{0}|", space); + w.WriteLine("{0}+-+ {1} ({2})", + space, hardware.Name, hardware.Identifier); + foreach (ISensor sensor in hardware.Sensors) { + w.WriteLine("{0}| +- {1} : {2} : {3} : {4}", + space, sensor.SensorType, sensor.Index, sensor.Name, + string.Format(CultureInfo.InvariantCulture, "{0} : {1} : {2}", + sensor.Value, sensor.Min, sensor.Max)); + foreach (IParameter parameter in sensor.Parameters) { + w.WriteLine("{0}| +- {1} : {2} : {3}", + space, parameter.Name, parameter.IsDefault, + string.Format(CultureInfo.InvariantCulture, "{0} : {1}", + parameter.DefaultValue, parameter.Value)); + } + } + foreach (IHardware subHardware in hardware.SubHardware) + ReportHardwareTree(subHardware, w, "| "); + } + + private void ReportHardware(IHardware hardware, TextWriter w) { + string hardwareReport = hardware.GetReport(); + if (hardwareReport != null && hardwareReport != "") { + NewSection(w); + w.Write(hardwareReport); + } + foreach (IHardware subHardware in hardware.SubHardware) + ReportHardware(subHardware, w); + } + public void SaveReport(Version version) { using (TextWriter w = @@ -146,23 +186,8 @@ NewSection(w); foreach (IGroup group in groups) { - foreach (IHardware hardware in group.Hardware) { - w.WriteLine("|"); - w.WriteLine("+-+ {0} ({1})", - new object[] { hardware.Name, hardware.Identifier }); - foreach (ISensor sensor in hardware.Sensors) { - w.WriteLine("| +- {0} : {1} : {2} : {3}", - sensor.SensorType, sensor.Index, sensor.Name, - string.Format(CultureInfo.InvariantCulture, "{0} : {1} : {2}", - sensor.Value, sensor.Min, sensor.Max) ); - foreach (IParameter parameter in sensor.Parameters) { - w.WriteLine("| +- {0} : {1} : {2}", - parameter.Name, parameter.IsDefault, - string.Format(CultureInfo.InvariantCulture, "{0} : {1}", - parameter.DefaultValue, parameter.Value) ); - } - } - } + foreach (IHardware hardware in group.Hardware) + ReportHardwareTree(hardware, w, ""); } w.WriteLine(); @@ -174,13 +199,9 @@ } IHardware[] hardwareArray = group.Hardware; - foreach (IHardware hardware in hardwareArray) { - string hardwareReport = hardware.GetReport(); - if (hardwareReport != null && hardwareReport != "") { - NewSection(w); - w.Write(hardwareReport); - } - } + foreach (IHardware hardware in hardwareArray) + ReportHardware(hardware, w); + } } } @@ -199,7 +220,5 @@ public event HardwareEventHandler HardwareAdded; public event HardwareEventHandler HardwareRemoved; - - } } diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/HDD/HDD.cs --- a/Hardware/HDD/HDD.cs Sat Feb 27 15:55:17 2010 +0000 +++ b/Hardware/HDD/HDD.cs Sat Feb 27 20:08:13 2010 +0000 @@ -77,6 +77,10 @@ get { return icon; } } + public IHardware[] SubHardware { + get { return new IHardware[0]; } + } + public ISensor[] Sensors { get { return new ISensor[] { temperature }; diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/Hardware.cs --- a/Hardware/Hardware.cs Sat Feb 27 15:55:17 2010 +0000 +++ b/Hardware/Hardware.cs Sat Feb 27 20:08:13 2010 +0000 @@ -43,6 +43,10 @@ private List active = new List(); + public IHardware[] SubHardware { + get { return new IHardware[0]; } + } + public ISensor[] Sensors { get { return active.ToArray(); } } @@ -63,7 +67,9 @@ } } + #pragma warning disable 67 public event SensorEventHandler SensorAdded; public event SensorEventHandler SensorRemoved; + #pragma warning restore 67 } } diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/IHardware.cs --- a/Hardware/IHardware.cs Sat Feb 27 15:55:17 2010 +0000 +++ b/Hardware/IHardware.cs Sat Feb 27 20:08:13 2010 +0000 @@ -54,6 +54,8 @@ void Update(); + IHardware[] SubHardware { get; } + ISensor[] Sensors { get; } event SensorEventHandler SensorAdded; diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/Mainboard/Mainboard.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Hardware/Mainboard/Mainboard.cs Sat Feb 27 20:08:13 2010 +0000 @@ -0,0 +1,109 @@ +/* + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is the Open Hardware Monitor code. + + The Initial Developer of the Original Code is + Michael Möller . + Portions created by the Initial Developer are Copyright (C) 2009-2010 + the Initial Developer. All Rights Reserved. + + Contributor(s): + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the GPL or the LGPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. + +*/ + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using OpenHardwareMonitor.Hardware.LPC; + +namespace OpenHardwareMonitor.Hardware.Mainboard { + public class Mainboard : IHardware { + private SMBIOS smbios; + private string name; + private Image icon; + + private LPCGroup lpcGroup; + + public Mainboard() { + this.smbios = new SMBIOS(); + if (smbios.Board != null && smbios.Board.ProductName != null + && smbios.Board.ProductName != "") { + if (smbios.Board.Manufacturer == Manufacturer.Unkown) + this.name = smbios.Board.ProductName; + else + this.name = smbios.Board.Manufacturer + " " + + smbios.Board.ProductName; + } else { + this.name = smbios.Board.Manufacturer.ToString(); + } + this.icon = Utilities.EmbeddedResources.GetImage("mainboard.png"); + this.lpcGroup = new LPCGroup(); + } + + public string Name { + get { return name; } + } + + public string Identifier { + get { return "/mainboard"; } + } + + public Image Icon { + get { return icon; } + } + + public string GetReport() { + StringBuilder r = new StringBuilder(); + + r.AppendLine("Mainboard"); + r.AppendLine(); + r.Append(smbios.GetReport()); + + return r.ToString(); + } + + public void Update() { } + + public void Close() { + lpcGroup.Close(); + } + + public IHardware[] SubHardware { + get { return lpcGroup.Hardware; } + } + + public ISensor[] Sensors { + get { return new ISensor[0]; } + } + + #pragma warning disable 67 + public event SensorEventHandler SensorAdded; + public event SensorEventHandler SensorRemoved; + #pragma warning restore 67 + } +} diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/Mainboard/MainboardGroup.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Hardware/Mainboard/MainboardGroup.cs Sat Feb 27 20:08:13 2010 +0000 @@ -0,0 +1,65 @@ +/* + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is the Open Hardware Monitor code. + + The Initial Developer of the Original Code is + Michael Möller . + Portions created by the Initial Developer are Copyright (C) 2009-2010 + the Initial Developer. All Rights Reserved. + + Contributor(s): + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the GPL or the LGPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. + +*/ + +using System; +using System.Collections.Generic; + +namespace OpenHardwareMonitor.Hardware.Mainboard { + public class MainboardGroup : IGroup { + + private Mainboard[] mainboards; + + public MainboardGroup() { + mainboards = new Mainboard[1]; + mainboards[0] = new Mainboard(); + } + + public void Close() { + foreach (Mainboard mainboard in mainboards) + mainboard.Close(); + } + + public string GetReport() { + return null; + } + + public IHardware[] Hardware { + get { return mainboards; } + + } + } +} diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/Mainboard/Manufacturer.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Hardware/Mainboard/Manufacturer.cs Sat Feb 27 20:08:13 2010 +0000 @@ -0,0 +1,52 @@ +/* + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is the Open Hardware Monitor code. + + The Initial Developer of the Original Code is + Michael Möller . + Portions created by the Initial Developer are Copyright (C) 2009-2010 + the Initial Developer. All Rights Reserved. + + Contributor(s): + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the GPL or the LGPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. + +*/ + +using System; +using System.Collections.Generic; + +namespace OpenHardwareMonitor.Hardware.Mainboard { + + public enum Manufacturer { + ASUS, + DFI, + EPoX, + Gigabyte, + MSI, + Unkown + } + +} diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/Mainboard/SMBIOS.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Hardware/Mainboard/SMBIOS.cs Sat Feb 27 20:08:13 2010 +0000 @@ -0,0 +1,223 @@ +/* + + Version: MPL 1.1/GPL 2.0/LGPL 2.1 + + The contents of this file are subject to the Mozilla Public License Version + 1.1 (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the License. + + The Original Code is the Open Hardware Monitor code. + + The Initial Developer of the Original Code is + Michael Möller . + Portions created by the Initial Developer are Copyright (C) 2009-2010 + the Initial Developer. All Rights Reserved. + + Contributor(s): + + Alternatively, the contents of this file may be used under the terms of + either the GNU General Public License Version 2 or later (the "GPL"), or + the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + in which case the provisions of the GPL or the LGPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of either the GPL or the LGPL, and not to allow others to + use your version of this file under the terms of the MPL, indicate your + decision by deleting the provisions above and replace them with the notice + and other provisions required by the GPL or the LGPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the MPL, the GPL or the LGPL. + +*/ + +using System; +using System.Collections.Generic; +using System.Management; +using System.Text; + +namespace OpenHardwareMonitor.Hardware.Mainboard { + + public class SMBIOS { + + private Structure[] table; + + private BIOSInformation biosInformation = null; + private BaseBoardInformation baseBoardInformation = null; + + public SMBIOS() { + int p = (int)System.Environment.OSVersion.Platform; + if ((p == 4) || (p == 128)) + return; + + List structureList = new List(); + + try { + ManagementObjectCollection collection = new ManagementObjectSearcher( + "root\\WMI", "SELECT SMBiosData FROM MSSMBios_RawSMBiosTables").Get(); + + byte[] raw = null; + foreach (ManagementObject mo in collection) { + raw = (byte[])mo["SMBiosData"]; + break; + } + + if (raw != null && raw.Length > 0) { + int offset = 0; + byte type = raw[offset]; + while (offset < raw.Length && type != 127) { + + type = raw[offset]; offset++; + int length = raw[offset]; offset++; + ushort handle = (ushort)((raw[offset] << 8) | raw[offset + 1]); + offset += 2; + + byte[] data = new byte[length]; + Array.Copy(raw, offset - 4, data, 0, length); offset += length - 4; + + List stringsList = new List(); + if (raw[offset] == 0) + offset++; + while (raw[offset] != 0) { + StringBuilder sb = new StringBuilder(); + while (raw[offset] != 0) { + sb.Append((char)raw[offset]); offset++; + } + offset++; + stringsList.Add(sb.ToString()); + } + offset++; + switch (type) { + case 0x00: + this.biosInformation = new BIOSInformation( + type, handle, data, stringsList.ToArray()); + structureList.Add(this.biosInformation); break; + case 0x02: this.baseBoardInformation = new BaseBoardInformation( + type, handle, data, stringsList.ToArray()); + structureList.Add(this.baseBoardInformation); break; + default: structureList.Add(new Structure( + type, handle, data, stringsList.ToArray())); break; + } + } + } + } catch (NotImplementedException) { } catch (ManagementException) { } + + table = structureList.ToArray(); + } + + public string GetReport() { + StringBuilder r = new StringBuilder(); + + if (biosInformation != null) { + r.Append("BIOS Vendor: "); r.AppendLine(biosInformation.Vendor); + r.Append("BIOS Version: "); r.AppendLine(biosInformation.Version); + r.AppendLine(); + } + + if (baseBoardInformation != null) { + r.Append("Mainboard Manufacturer: "); + r.AppendLine(baseBoardInformation.ManufacturerName); + r.Append("Mainboard Name: "); + r.AppendLine(baseBoardInformation.ProductName); + r.AppendLine(); + } + + return r.ToString(); + } + + public BIOSInformation BIOS { + get { return biosInformation; } + } + + public BaseBoardInformation Board { + get { return baseBoardInformation; } + } + + public class Structure { + private byte type; + private ushort handle; + + private byte[] data; + private string[] strings; + + protected string GetString(int offset) { + if (offset < data.Length && data[offset] > 0 && + data[offset] <= strings.Length) + return strings[data[offset] - 1]; + else + return ""; + } + + public Structure(byte type, ushort handle, byte[] data, string[] strings) + { + this.type = type; + this.handle = handle; + this.data = data; + this.strings = strings; + } + + public byte Type { get { return type; } } + + public ushort Handle { get { return handle; } } + } + + public class BIOSInformation : Structure { + + private string vendor; + private string version; + + public BIOSInformation(byte type, ushort handle, byte[] data, + string[] strings) + : base(type, handle, data, strings) { + + this.vendor = GetString(0x04); + this.version = GetString(0x05); + } + + public string Vendor { get { return vendor; } } + + public string Version { get { return version; } } + } + + public class BaseBoardInformation : Structure { + + private string manufacturerName; + private string productName; + private Manufacturer manufacturer; + + public BaseBoardInformation(byte type, ushort handle, byte[] data, + string[] strings) + : base(type, handle, data, strings) { + + this.manufacturerName = GetString(0x04).Trim(); + this.productName = GetString(0x05).Trim(); + + switch (manufacturerName) { + case "ASUSTeK Computer INC.": + manufacturer = Manufacturer.ASUS; break; + case "DFI": + case "DFI Inc.:": + manufacturer = Manufacturer.DFI; break; + case "EPoX COMPUTER CO., LTD": + manufacturer = Manufacturer.EPoX; break; + case "Gigabyte Technology Co., Ltd.": + manufacturer = Manufacturer.Gigabyte; break; + case "MICRO-STAR INTERNATIONAL CO., LTD": + manufacturer = Manufacturer.MSI; break; + default: + manufacturer = Manufacturer.Unkown; break; + } + } + + public string ManufacturerName { get { return manufacturerName; } } + + public string ProductName { get { return productName; } } + + public Manufacturer Manufacturer { get { return manufacturer; } } + } + } +} diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/SMBIOS/SMBIOSGroup.cs --- a/Hardware/SMBIOS/SMBIOSGroup.cs Sat Feb 27 15:55:17 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,204 +0,0 @@ -/* - - Version: MPL 1.1/GPL 2.0/LGPL 2.1 - - The contents of this file are subject to the Mozilla Public License Version - 1.1 (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - for the specific language governing rights and limitations under the License. - - The Original Code is the Open Hardware Monitor code. - - The Initial Developer of the Original Code is - Michael Möller . - Portions created by the Initial Developer are Copyright (C) 2009-2010 - the Initial Developer. All Rights Reserved. - - Contributor(s): - - Alternatively, the contents of this file may be used under the terms of - either the GNU General Public License Version 2 or later (the "GPL"), or - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - in which case the provisions of the GPL or the LGPL are applicable instead - of those above. If you wish to allow use of your version of this file only - under the terms of either the GPL or the LGPL, and not to allow others to - use your version of this file under the terms of the MPL, indicate your - decision by deleting the provisions above and replace them with the notice - and other provisions required by the GPL or the LGPL. If you do not delete - the provisions above, a recipient may use your version of this file under - the terms of any one of the MPL, the GPL or the LGPL. - -*/ - -using System; -using System.Collections.Generic; -using System.Management; -using System.Text; - -namespace OpenHardwareMonitor.Hardware.SMBIOS { - - public class SMBIOSGroup : IGroup { - - private Structure[] table; - - private BIOSInformation biosInformation = null; - - private BaseBoardInformation baseBoardInformation = null; - - public SMBIOSGroup() { - int p = (int)System.Environment.OSVersion.Platform; - if ((p == 4) || (p == 128)) - return; - - List structureList = new List(); - - try { - ManagementObjectCollection collection = new ManagementObjectSearcher( - "root\\WMI", "SELECT SMBiosData FROM MSSMBios_RawSMBiosTables").Get(); - - byte[] raw = null; - foreach (ManagementObject mo in collection) { - raw = (byte[])mo["SMBiosData"]; - break; - } - - if (raw != null && raw.Length > 0) { - int offset = 0; - byte type = raw[offset]; - while (offset < raw.Length && type != 127) { - - type = raw[offset]; offset++; - int length = raw[offset]; offset++; - ushort handle = (ushort)((raw[offset] << 8) | raw[offset + 1]); - offset += 2; - - byte[] data = new byte[length]; - Array.Copy(raw, offset - 4, data, 0, length); offset += length - 4; - - List stringsList = new List(); - if (raw[offset] == 0) - offset++; - while (raw[offset] != 0) { - StringBuilder sb = new StringBuilder(); - while (raw[offset] != 0) { - sb.Append((char)raw[offset]); offset++; - } - offset++; - stringsList.Add(sb.ToString()); - } - offset++; - switch (type) { - case 0x00: - this.biosInformation = new BIOSInformation( - type, handle, data, stringsList.ToArray()); - structureList.Add(this.biosInformation); break; - case 0x02: this.baseBoardInformation = new BaseBoardInformation( - type, handle, data, stringsList.ToArray()); - structureList.Add(this.baseBoardInformation); break; - default: structureList.Add(new Structure( - type, handle, data, stringsList.ToArray())); break; - } - } - } - } catch (NotImplementedException) { } catch (ManagementException) { } - - table = structureList.ToArray(); - } - - public IHardware[] Hardware { get { return new IHardware[0]; } } - - public string GetReport() { - StringBuilder r = new StringBuilder(); - - r.AppendLine("SMBIOS"); - r.AppendLine(); - - if (biosInformation != null) { - r.Append("BIOS Vendor: "); r.AppendLine(biosInformation.Vendor); - r.Append("BIOS Version: "); r.AppendLine(biosInformation.Version); - r.AppendLine(); - } - - if (baseBoardInformation != null) { - r.Append("Mainboard Manufacturer: "); - r.AppendLine(baseBoardInformation.Manufacturer); - r.Append("Mainboard Name: "); - r.AppendLine(baseBoardInformation.ProductName); - r.AppendLine(); - } - - return r.ToString(); - } - - public void Close() { } - - public class Structure { - private byte type; - private ushort handle; - - private byte[] data; - private string[] strings; - - protected string GetString(int offset) { - if (offset < data.Length && data[offset] > 0 && - data[offset] <= strings.Length) - return strings[data[offset] - 1]; - else - return ""; - } - - public Structure(byte type, ushort handle, byte[] data, string[] strings) - { - this.type = type; - this.handle = handle; - this.data = data; - this.strings = strings; - } - - public byte Type { get { return type; } } - - public ushort Handle { get { return handle; } } - } - - public class BIOSInformation : Structure { - - private string vendor; - private string version; - - public BIOSInformation(byte type, ushort handle, byte[] data, - string[] strings) - : base(type, handle, data, strings) { - - this.vendor = GetString(0x04); - this.version = GetString(0x05); - } - - public string Vendor { get { return vendor; } } - - public string Version { get { return version; } } - } - - public class BaseBoardInformation : Structure { - - private string manufacturer; - private string productName; - - public BaseBoardInformation(byte type, ushort handle, byte[] data, - string[] strings) - : base(type, handle, data, strings) { - - this.manufacturer = GetString(0x04); - this.productName = GetString(0x05); - } - - public string Manufacturer { get { return manufacturer; } } - - public string ProductName { get { return productName; } } - } - } -} diff -r 1a7c13ac7348 -r 15181001ee61 Hardware/TBalancer/TBalancer.cs --- a/Hardware/TBalancer/TBalancer.cs Sat Feb 27 15:55:17 2010 +0000 +++ b/Hardware/TBalancer/TBalancer.cs Sat Feb 27 20:08:13 2010 +0000 @@ -262,6 +262,10 @@ this.portName.TrimStart(new char[]{'/'}).ToLower(); } } + public IHardware[] SubHardware { + get { return new IHardware[0]; } + } + public ISensor[] Sensors { get { return active.ToArray(); } } diff -r 1a7c13ac7348 -r 15181001ee61 OpenHardwareMonitor.csproj --- a/OpenHardwareMonitor.csproj Sat Feb 27 15:55:17 2010 +0000 +++ b/OpenHardwareMonitor.csproj Sat Feb 27 20:08:13 2010 +0000 @@ -78,8 +78,11 @@ + + + - + @@ -172,6 +175,9 @@ + + +