README.md

June 5, 2026 ยท View on GitHub

tsmbios

Features

  • 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 Tables supported

SMBIOS Table
BIOS Information (Type 0)DelphiFPCC++ Builder
System Information (Type 1)DelphiFPCC++ Builder
Baseboard (or Module) Information (Type 2)DelphiFPCC++ Builder
System Enclosure or Chassis (Type 3)DelphiFPCC++ Builder
Processor Information (Type 4)DelphiFPCC++ Builder
Memory Controller Information (Type 5)DelphiFPCC++ Builder
Memory Module Information (Type 6)DelphiFPCC++ Builder
Cache Information (Type 7)DelphiFPCC++ Builder
Port Connector Information (Type 8)DelphiFPCC++ Builder
System Slots (Type 9)DelphiFPCC++ Builder
On Board Devices Information (Type 10)DelphiFPCC++ Builder
OEM Strings (Type 11)DelphiFPCC++ Builder
System Configuration Options (Type 12)DelphiFPCC++ Builder
BIOS Language Information (Type 13)DelphiFPCC++ Builder
Group Associations (Type 14)DelphiFPCC++ Builder
System Event Log (Type 15)DelphiFPCC++ Builder
Physical Memory Array (Type 16)DelphiFPCC++ Builder
Memory Device (Type 17)DelphiFPCC++ Builder
32-Bit Memory Error Information (Type 18)DelphiFPCC++ Builder
Memory Array Mapped Address (Type 19)DelphiFPCC++ Builder
Memory Device Mapped Address (Type 20)DelphiFPCC++ Builder
Built-in Pointing Device (Type 21)DelphiFPCC++ Builder
Portable Battery (Type 22)DelphiFPCC++ Builder
System Reset (Type 23)DelphiFPCC++ Builder
Hardware Security (Type 24)DelphiFPCC++ Builder
System Power Controls (Type 25)DelphiFPCC++ Builder
Voltage Probe (Type 26)DelphiFPCC++ Builder
Cooling Device (Type 27)DelphiFPCC++ Builder
Temperature Probe (Type 28)DelphiFPCC++ Builder
Electrical Current Probe (Type 29)DelphiFPCC++ Builder
Out-of-Band Remote Access (Type 30)DelphiFPCC++ Builder
Boot Integrity Services Entry Point (Type 31)DelphiFPCC++ Builder
System Boot Information (Type 32)DelphiFPCC++ Builder
64-Bit Memory Error Information (Type 33)DelphiFPCC++ Builder
Management Device (Type 34)DelphiFPCC++ Builder
Management Device Component (Type 35)DelphiFPCC++ Builder
Management Device Threshold Data (Type 36)DelphiFPCC++ Builder
Memory Channel (Type 37)DelphiFPCC++ Builder
IPMI Device Information (Type 38)DelphiFPCC++ Builder
System Power Supply (Type 39)DelphiFPCC++ Builder
Additional Information (Type 40)DelphiFPCC++ Builder
Onboard Devices Extended Information (Type 41)DelphiFPCC++ Builder
Management Controller Host Interface (Type 42)DelphiFPCC++ Builder
TPM Device (Type 43)DelphiFPCC++ Builder
Processor Additional Information (Type 44)DelphiFPCC++ Builder
Firmware Inventory Information (Type 45)DelphiFPCC++ Builder
String Property (Type 46)DelphiFPCC++ Builder

Sample source code

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.