Skip to content

RRUZ/tsmbios

Repository files navigation

The SMBIOS (System Management BIOS) is a standard developed by the DMTF. The information stored in the SMBIOS includes devices manufacturer, model name, serial number, BIOS version, asset tag, processors, ports and device memory installed.

logoThe TSMBIOS libary allows access the System Management BIOS (SMBIOS) using the Object Pascal language (Delphi or Free Pascal).

Features

  • Fully documented (XMLDoc), compatible with the Help Insight feature, available since Delphi 2005.
  • Supports SMBIOS Version 2.1 to 3.9.
  • Compatible with Delphi 5 through Delphi 13 Florence.
  • 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.
  • Provides SMBiosAtLeast to guard version-specific fields before reading newer SMBIOS data.

SMBIOS Tables supported

The existing supported tables have been updated with SMBIOS 3.x fields where the library already implements the table. This update does not add support for new SMBIOS table types.

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 '..\..\Common\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) then
          WriteLn(Format('Configured Speed %d MT/s',[LMemoryDevice.GetConfiguredMemorySpeed]));
        if SMBiosAtLeast(SMBios, 3, 2) then
        begin
          WriteLn(Format('Technology     %s',[LMemoryDevice.GetMemoryTechnologyStr]));
          WriteLn(Format('Firmware       %s',[LMemoryDevice.FirmwareVersionStr]));
          WriteLn(Format('Non-Volatile   %d bytes',[LMemoryDevice.RAWMemoryDeviceInfo.NonVolatileSize]));
          WriteLn(Format('Volatile       %d bytes',[LMemoryDevice.RAWMemoryDeviceInfo.VolatileSize]));
          WriteLn(Format('Cache          %d bytes',[LMemoryDevice.RAWMemoryDeviceInfo.CacheSize]));
          WriteLn(Format('Logical        %d bytes',[LMemoryDevice.RAWMemoryDeviceInfo.LogicalSize]));
        end;
        if SMBiosAtLeast(SMBios, 3, 7) then
        begin
          WriteLn(Format('PMIC0 Manufacturer ID %.4x',[LMemoryDevice.RAWMemoryDeviceInfo.PMIC0ManufacturerID]));
          WriteLn(Format('PMIC0 Revision Number %.4x',[LMemoryDevice.RAWMemoryDeviceInfo.PMIC0RevisionNumber]));
          WriteLn(Format('RCD Manufacturer ID   %.4x',[LMemoryDevice.RAWMemoryDeviceInfo.RCDManufacturerID]));
          WriteLn(Format('RCD Revision Number   %.4x',[LMemoryDevice.RAWMemoryDeviceInfo.RCDRevisionNumber]));
        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
            WriteLn(Format('  Maximum Capacity %d bytes',[LMemoryDevice.PhysicalMemoryArray.RAWPhysicalMemoryArrayInformation.ExtendedMaximumCapacity]));

          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.

Help Insight

Help Insight

Other

You can install Delphinus package manager and install TSMBIOS as a package there. (Delphinus-Support)

About

Library to access the SMBIOS using Object Pascal (Delphi, FPC).

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors