public SMBios() { if (Software.OperatingSystem.IsUnix) { _raw = null; string boardVendor = ReadSysFs("/sys/class/dmi/id/board_vendor"); string boardName = ReadSysFs("/sys/class/dmi/id/board_name"); string boardVersion = ReadSysFs("/sys/class/dmi/id/board_version"); Board = new BaseBoardInformation(boardVendor, boardName, boardVersion, null); string systemVendor = ReadSysFs("/sys/class/dmi/id/sys_vendor"); string productName = ReadSysFs("/sys/class/dmi/id/product_name"); string productVersion = ReadSysFs("/sys/class/dmi/id/product_version"); System = new SystemInformation(systemVendor, productName, productVersion, null, null); string biosVendor = ReadSysFs("/sys/class/dmi/id/bios_vendor"); string biosVersion = ReadSysFs("/sys/class/dmi/id/bios_version"); string biosDate = ReadSysFs("/sys/class/dmi/id/bios_date"); Bios = new BiosInformation(biosVendor, biosVersion, biosDate); MemoryDevices = new MemoryDevice[0]; } else { List <MemoryDevice> memoryDeviceList = new(); List <ProcessorCache> processorCacheList = new(); string[] tables = FirmwareTable.EnumerateTables(Kernel32.Provider.RSMB); if (tables is { Length : > 0 })
public SMBios() { if (Software.OperatingSystem.IsUnix) { _raw = null; string boardVendor = ReadSysFs("/sys/class/dmi/id/board_vendor"); string boardName = ReadSysFs("/sys/class/dmi/id/board_name"); string boardVersion = ReadSysFs("/sys/class/dmi/id/board_version"); Board = new BaseBoardInformation(boardVendor, boardName, boardVersion, null); string systemVendor = ReadSysFs("/sys/class/dmi/id/sys_vendor"); string productName = ReadSysFs("/sys/class/dmi/id/product_name"); string productVersion = ReadSysFs("/sys/class/dmi/id/product_version"); System = new SystemInformation(systemVendor, productName, productVersion, null, null); string biosVendor = ReadSysFs("/sys/class/dmi/id/bios_vendor"); string biosVersion = ReadSysFs("/sys/class/dmi/id/bios_version"); string biosDate = ReadSysFs("/sys/class/dmi/id/bios_date"); Bios = new BiosInformation(biosVendor, biosVersion, biosDate); MemoryDevices = new MemoryDevice[0]; } else { List <MemoryDevice> memoryDeviceList = new List <MemoryDevice>(); List <ProcessorCache> processorCacheList = new List <ProcessorCache>(); _raw = null; byte majorVersion = 0; byte minorVersion = 0; try { ManagementObjectCollection collection; using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSSMBios_RawSMBiosTables")) { collection = searcher.Get(); } foreach (ManagementBaseObject mo in collection) { _raw = (byte[])mo["SMBiosData"]; majorVersion = (byte)mo["SmbiosMajorVersion"]; minorVersion = (byte)mo["SmbiosMinorVersion"]; break; } } catch { } if (majorVersion > 0 || minorVersion > 0) { _version = new Version(majorVersion, minorVersion); } if (_raw != null && _raw.Length > 0) { int offset = 0; byte type = _raw[offset]; while (offset + 4 < _raw.Length && type != 127) { type = _raw[offset]; int length = _raw[offset + 1]; ushort handle = (ushort)((_raw[offset + 2] << 8) | _raw[offset + 3]); if (offset + length > _raw.Length) { break; } byte[] data = new byte[length]; Array.Copy(_raw, offset, data, 0, length); offset += length; List <string> stringsList = new List <string>(); if (offset < _raw.Length && _raw[offset] == 0) { offset++; } while (offset < _raw.Length && _raw[offset] != 0) { StringBuilder sb = new StringBuilder(); while (offset < _raw.Length && _raw[offset] != 0) { sb.Append((char)_raw[offset]); offset++; } offset++; stringsList.Add(sb.ToString()); } offset++; switch (type) { case 0x00: Bios = new BiosInformation(type, handle, data, stringsList.ToArray()); break; case 0x01: System = new SystemInformation(type, handle, data, stringsList.ToArray()); break; case 0x02: Board = new BaseBoardInformation(type, handle, data, stringsList.ToArray()); break; case 0x03: Chassis = new ChassisInformation(type, handle, data, stringsList.ToArray()); break; case 0x04: Processor = new ProcessorInformation(type, handle, data, stringsList.ToArray()); break; case 0x07: ProcessorCache c = new ProcessorCache(type, handle, data, stringsList.ToArray()); processorCacheList.Add(c); break; case 0x11: MemoryDevice m = new MemoryDevice(type, handle, data, stringsList.ToArray()); memoryDeviceList.Add(m); break; } } } MemoryDevices = memoryDeviceList.ToArray(); ProcessorCaches = processorCacheList.ToArray(); } }