- Supports SMBIOS Version 2.1 to 3.9.
- Compatible with Delphi 5 through Delphi 13 Florence.
- Fully documented (XMLDoc), compatible with the Help Insight feature, available since Delphi 2005.
- Works with FPC 2.4.0 or later.
- Supports Windows and Linux.
- Can read SMBIOS data from remote machines using WMI.
- Exposes the SMBIOS 3.x fixed-layout fields added to the supported table types, including BIOS ROM size, processor core/thread counts, cache sizes, system slot bus data, and memory device technology, firmware, persistent memory, speed, PMIC, and RCD data.
| SMBIOS Table | |||
|---|---|---|---|
| BIOS Information (Type 0) | Delphi | FPC | C++ Builder |
| System Information (Type 1) | Delphi | FPC | C++ Builder |
| Baseboard (or Module) Information (Type 2) | Delphi | FPC | C++ Builder |
| System Enclosure or Chassis (Type 3) | Delphi | FPC | C++ Builder |
| Processor Information (Type 4) | Delphi | FPC | C++ Builder |
| Memory Controller Information (Type 5) | Delphi | FPC | C++ Builder |
| Memory Module Information (Type 6) | Delphi | FPC | C++ Builder |
| Cache Information (Type 7) | Delphi | FPC | C++ Builder |
| Port Connector Information (Type 8) | Delphi | FPC | C++ Builder |
| System Slots (Type 9) | Delphi | FPC | C++ Builder |
| On Board Devices Information (Type 10) | Delphi | FPC | C++ Builder |
| OEM Strings (Type 11) | Delphi | FPC | C++ Builder |
| System Configuration Options (Type 12) | Delphi | FPC | C++ Builder |
| BIOS Language Information (Type 13) | Delphi | FPC | C++ Builder |
| Group Associations (Type 14) | Delphi | FPC | C++ Builder |
| System Event Log (Type 15) | Delphi | FPC | C++ Builder |
| Physical Memory Array (Type 16) | Delphi | FPC | C++ Builder |
| Memory Device (Type 17) | Delphi | FPC | C++ Builder |
| 32-Bit Memory Error Information (Type 18) | Delphi | FPC | C++ Builder |
| Memory Array Mapped Address (Type 19) | Delphi | FPC | C++ Builder |
| Memory Device Mapped Address (Type 20) | Delphi | FPC | C++ Builder |
| Built-in Pointing Device (Type 21) | Delphi | FPC | C++ Builder |
| Portable Battery (Type 22) | Delphi | FPC | C++ Builder |
| System Reset (Type 23) | Delphi | FPC | C++ Builder |
| Hardware Security (Type 24) | Delphi | FPC | C++ Builder |
| System Power Controls (Type 25) | Delphi | FPC | C++ Builder |
| Voltage Probe (Type 26) | Delphi | FPC | C++ Builder |
| Cooling Device (Type 27) | Delphi | FPC | C++ Builder |
| Temperature Probe (Type 28) | Delphi | FPC | C++ Builder |
| Electrical Current Probe (Type 29) | Delphi | FPC | C++ Builder |
| Out-of-Band Remote Access (Type 30) | Delphi | FPC | C++ Builder |
| Boot Integrity Services Entry Point (Type 31) | Delphi | FPC | C++ Builder |
| System Boot Information (Type 32) | Delphi | FPC | C++ Builder |
| 64-Bit Memory Error Information (Type 33) | Delphi | FPC | C++ Builder |
| Management Device (Type 34) | Delphi | FPC | C++ Builder |
| Management Device Component (Type 35) | Delphi | FPC | C++ Builder |
| Management Device Threshold Data (Type 36) | Delphi | FPC | C++ Builder |
| Memory Channel (Type 37) | Delphi | FPC | C++ Builder |
| IPMI Device Information (Type 38) | Delphi | FPC | C++ Builder |
| System Power Supply (Type 39) | Delphi | FPC | C++ Builder |
| Additional Information (Type 40) | Delphi | FPC | C++ Builder |
| Onboard Devices Extended Information (Type 41) | Delphi | FPC | C++ Builder |
| Management Controller Host Interface (Type 42) | Delphi | FPC | C++ Builder |
| TPM Device (Type 43) | Delphi | FPC | C++ Builder |
| Processor Additional Information (Type 44) | Delphi | FPC | C++ Builder |
| Firmware Inventory Information (Type 45) | Delphi | FPC | C++ Builder |
| String Property (Type 46) | Delphi | FPC | C++ Builder |
This code demonstrates how to retrieve information related to the memory devices installed on the system.
{$APPTYPE CONSOLE}
{$R *.res}
uses
Classes,
SysUtils,
uSMBIOS in '..\..\source\uSMBIOS.pas';
procedure GetMemoryDeviceInfo;
Var
SMBios: TSMBios;
LMemoryDevice: TMemoryDeviceInformation;
begin
SMBios := TSMBios.Create;
try
WriteLn('Memory Device Information');
WriteLn('-------------------------');
if SMBios.HasMemoryDeviceInfo then
for LMemoryDevice in SMBios.MemoryDeviceInfo do
begin
WriteLn(Format('Total Width %d bits',[LMemoryDevice.RAWMemoryDeviceInfo.TotalWidth]));
WriteLn(Format('Data Width %d bits',[LMemoryDevice.RAWMemoryDeviceInfo.DataWidth]));
WriteLn(Format('Size %d Mbytes',[LMemoryDevice.GetSize]));
WriteLn(Format('Form Factor %s',[LMemoryDevice.GetFormFactor]));
WriteLn(Format('Device Locator %s',[LMemoryDevice.GetDeviceLocatorStr]));
WriteLn(Format('Bank Locator %s',[LMemoryDevice.GetBankLocatorStr]));
WriteLn(Format('Memory Type %s',[LMemoryDevice.GetMemoryTypeStr]));
WriteLn(Format('Speed %d MT/s',[LMemoryDevice.GetSpeed]));
if SMBiosAtLeast(SMBios, 2, 7) and LMemoryDevice.HasConfiguredMemorySpeed then
WriteLn(Format('Configured Speed %d MT/s',[LMemoryDevice.GetConfiguredMemorySpeed]));
if SMBiosAtLeast(SMBios, 3, 2) then
begin
if LMemoryDevice.HasMemoryTechnology then
WriteLn(Format('Technology %s',[LMemoryDevice.GetMemoryTechnologyStr]));
if LMemoryDevice.HasFirmwareVersion then
WriteLn(Format('Firmware %s',[LMemoryDevice.FirmwareVersionStr]));
if LMemoryDevice.HasNonVolatileSize then
WriteLn(Format('Non-Volatile %d bytes',[LMemoryDevice.GetNonVolatileSize]));
if LMemoryDevice.HasVolatileSize then
WriteLn(Format('Volatile %d bytes',[LMemoryDevice.GetVolatileSize]));
if LMemoryDevice.HasCacheSize then
WriteLn(Format('Cache %d bytes',[LMemoryDevice.GetCacheSize]));
if LMemoryDevice.HasLogicalSize then
WriteLn(Format('Logical %d bytes',[LMemoryDevice.GetLogicalSize]));
end;
if SMBiosAtLeast(SMBios, 3, 7) and LMemoryDevice.HasPMIC0 then
begin
WriteLn(Format('PMIC0 Manufacturer ID %.4x',[LMemoryDevice.GetPMIC0ManufacturerID]));
WriteLn(Format('PMIC0 Revision Number %.4x',[LMemoryDevice.GetPMIC0RevisionNumber]));
end;
if SMBiosAtLeast(SMBios, 3, 7) and LMemoryDevice.HasRCD then
begin
WriteLn(Format('RCD Manufacturer ID %.4x',[LMemoryDevice.GetRCDManufacturerID]));
WriteLn(Format('RCD Revision Number %.4x',[LMemoryDevice.GetRCDRevisionNumber]));
end;
WriteLn(Format('Manufacturer %s',[LMemoryDevice.ManufacturerStr]));
WriteLn(Format('Serial Number %s',[LMemoryDevice.SerialNumberStr]));
WriteLn(Format('Asset Tag %s',[LMemoryDevice.AssetTagStr]));
WriteLn(Format('Part Number %s',[LMemoryDevice.PartNumberStr]));
WriteLn;
if Assigned(LMemoryDevice.PhysicalMemoryArray) then
begin
WriteLn(' Physical Memory Array');
WriteLn(' ---------------------');
WriteLn(' Location '+LMemoryDevice.PhysicalMemoryArray.GetLocationStr);
WriteLn(' Use '+LMemoryDevice.PhysicalMemoryArray.GetUseStr);
WriteLn(' Error Correction '+LMemoryDevice.PhysicalMemoryArray.GetErrorCorrectionStr);
if LMemoryDevice.PhysicalMemoryArray.RAWPhysicalMemoryArrayInformation.MaximumCapacity<>$80000000 then
WriteLn(Format(' Maximum Capacity %d Kb',[LMemoryDevice.PhysicalMemoryArray.RAWPhysicalMemoryArrayInformation.MaximumCapacity]))
else if LMemoryDevice.PhysicalMemoryArray.HasExtendedMaximumCapacity then
WriteLn(Format(' Maximum Capacity %d bytes',[LMemoryDevice.PhysicalMemoryArray.GetExtendedMaximumCapacity]))
else
WriteLn(' Maximum Capacity Unknown');
WriteLn(Format(' Memory devices %d',[LMemoryDevice.PhysicalMemoryArray.RAWPhysicalMemoryArrayInformation.NumberofMemoryDevices]));
end;
WriteLn;
end
else
Writeln('No Memory Device Info was found');
finally
SMBios.Free;
end;
end;
begin
try
GetMemoryDeviceInfo;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.