moel@8: /* moel@1: moel@1: Version: MPL 1.1/GPL 2.0/LGPL 2.1 moel@1: moel@1: The contents of this file are subject to the Mozilla Public License Version moel@1: 1.1 (the "License"); you may not use this file except in compliance with moel@1: the License. You may obtain a copy of the License at moel@1: moel@1: http://www.mozilla.org/MPL/ moel@1: moel@1: Software distributed under the License is distributed on an "AS IS" basis, moel@1: WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License moel@1: for the specific language governing rights and limitations under the License. moel@1: moel@1: The Original Code is the Open Hardware Monitor code. moel@1: moel@1: The Initial Developer of the Original Code is moel@1: Michael Möller . moel@1: Portions created by the Initial Developer are Copyright (C) 2009-2010 moel@1: the Initial Developer. All Rights Reserved. moel@1: moel@1: Contributor(s): moel@1: moel@1: Alternatively, the contents of this file may be used under the terms of moel@1: either the GNU General Public License Version 2 or later (the "GPL"), or moel@1: the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), moel@1: in which case the provisions of the GPL or the LGPL are applicable instead moel@1: of those above. If you wish to allow use of your version of this file only moel@1: under the terms of either the GPL or the LGPL, and not to allow others to moel@1: use your version of this file under the terms of the MPL, indicate your moel@1: decision by deleting the provisions above and replace them with the notice moel@1: and other provisions required by the GPL or the LGPL. If you do not delete moel@1: the provisions above, a recipient may use your version of this file under moel@1: the terms of any one of the MPL, the GPL or the LGPL. moel@1: moel@1: */ moel@1: moel@1: using System; moel@1: using System.Collections.Generic; moel@1: using System.Management; moel@1: using System.Text; moel@1: moel@1: namespace OpenHardwareMonitor.Hardware.SMBIOS { moel@1: moel@1: public class SMBIOSGroup : IGroup { moel@1: moel@1: private Structure[] table; moel@1: moel@1: private BIOSInformation biosInformation = null; moel@1: moel@1: private BaseBoardInformation baseBoardInformation = null; moel@1: moel@1: public SMBIOSGroup() { moel@1: int p = (int)System.Environment.OSVersion.Platform; moel@1: if ((p == 4) || (p == 128)) moel@1: return; moel@8: moel@1: List structureList = new List(); moel@8: moel@8: try { moel@8: ManagementObjectCollection collection = new ManagementObjectSearcher( moel@8: "root\\WMI", "SELECT SMBiosData FROM MSSMBios_RawSMBiosTables").Get(); moel@8: moel@8: byte[] raw = null; moel@8: foreach (ManagementObject mo in collection) { moel@8: raw = (byte[])mo["SMBiosData"]; moel@8: break; moel@8: } moel@8: moel@8: if (raw != null && raw.Length > 0) { moel@8: int offset = 0; moel@8: byte type = raw[offset]; moel@8: while (offset < raw.Length && type != 127) { moel@8: moel@8: type = raw[offset]; offset++; moel@8: int length = raw[offset]; offset++; moel@8: ushort handle = (ushort)((raw[offset] << 8) | raw[offset + 1]); moel@8: offset += 2; moel@8: moel@8: byte[] data = new byte[length]; moel@8: Array.Copy(raw, offset - 4, data, 0, length); offset += length - 4; moel@8: moel@8: List stringsList = new List(); moel@8: if (raw[offset] == 0) moel@8: offset++; moel@8: while (raw[offset] != 0) { moel@8: StringBuilder sb = new StringBuilder(); moel@8: while (raw[offset] != 0) { moel@8: sb.Append((char)raw[offset]); offset++; moel@8: } moel@8: offset++; moel@8: stringsList.Add(sb.ToString()); moel@1: } moel@1: offset++; moel@8: switch (type) { moel@8: case 0x00: moel@8: this.biosInformation = new BIOSInformation( moel@8: type, handle, data, stringsList.ToArray()); moel@8: structureList.Add(this.biosInformation); break; moel@8: case 0x02: this.baseBoardInformation = new BaseBoardInformation( moel@8: type, handle, data, stringsList.ToArray()); moel@8: structureList.Add(this.baseBoardInformation); break; moel@8: default: structureList.Add(new Structure( moel@8: type, handle, data, stringsList.ToArray())); break; moel@8: } moel@1: } moel@1: } moel@8: } catch (NotImplementedException) { } moel@8: moel@1: table = structureList.ToArray(); moel@1: } moel@1: moel@1: public IHardware[] Hardware { get { return new IHardware[0]; } } moel@1: moel@1: public string GetReport() { moel@1: StringBuilder r = new StringBuilder(); moel@1: moel@1: r.AppendLine("SMBIOS"); moel@1: r.AppendLine(); moel@1: moel@1: if (biosInformation != null) { moel@1: r.Append("BIOS Vendor: "); r.AppendLine(biosInformation.Vendor); moel@1: r.Append("BIOS Version: "); r.AppendLine(biosInformation.Version); moel@1: r.AppendLine(); moel@1: } moel@1: moel@1: if (baseBoardInformation != null) { moel@1: r.Append("Mainboard Manufacturer: "); moel@1: r.AppendLine(baseBoardInformation.Manufacturer); moel@1: r.Append("Mainboard Name: "); moel@1: r.AppendLine(baseBoardInformation.ProductName); moel@1: r.AppendLine(); moel@1: } moel@1: moel@1: return r.ToString(); moel@1: } moel@1: moel@1: public void Close() { } moel@1: moel@1: public class Structure { moel@1: private byte type; moel@1: private ushort handle; moel@1: moel@1: private byte[] data; moel@1: private string[] strings; moel@1: moel@9: protected string GetString(int offset) { moel@9: if (offset < data.Length && data[offset] > 0 && moel@9: data[offset] <= strings.Length) moel@9: return strings[data[offset] - 1]; moel@9: else moel@9: return ""; moel@9: } moel@9: moel@1: public Structure(byte type, ushort handle, byte[] data, string[] strings) moel@1: { moel@1: this.type = type; moel@1: this.handle = handle; moel@1: this.data = data; moel@1: this.strings = strings; moel@1: } moel@1: moel@1: public byte Type { get { return type; } } moel@1: moel@1: public ushort Handle { get { return handle; } } moel@1: } moel@1: moel@1: public class BIOSInformation : Structure { moel@1: moel@9: private string vendor; moel@9: private string version; moel@1: moel@1: public BIOSInformation(byte type, ushort handle, byte[] data, moel@1: string[] strings) moel@1: : base(type, handle, data, strings) { moel@1: moel@9: this.vendor = GetString(0x04); moel@9: this.version = GetString(0x05); moel@1: } moel@1: moel@1: public string Vendor { get { return vendor; } } moel@1: moel@1: public string Version { get { return version; } } moel@1: } moel@1: moel@1: public class BaseBoardInformation : Structure { moel@1: moel@9: private string manufacturer; moel@9: private string productName; moel@1: moel@1: public BaseBoardInformation(byte type, ushort handle, byte[] data, moel@1: string[] strings) moel@1: : base(type, handle, data, strings) { moel@1: moel@9: this.manufacturer = GetString(0x04); moel@9: this.productName = GetString(0x05); moel@1: } moel@1: moel@1: public string Manufacturer { get { return manufacturer; } } moel@1: moel@1: public string ProductName { get { return productName; } } moel@1: } moel@1: } moel@1: }