If you need to know what type of RAM is installed in your system or how is the manufacturer of your memory device, you can try reading the SPD (Serial presence detect) info directly (but not all the memory devices exposes the SPD info and reading the SPD require Kernel Mode access) , use the Win32_PhysicalMemory WMI class (but depending of the manufacturer the WMI fails to get info about some memory properties like the memory type) or using the SMBIOS.
Using the SMBIOS you can get most of the info related to the memory devices installed like manufacturer, type, speed, serial number and so on. The next snippet show how using the TSMBIOS and Delphi (or FPC) you can retrieve such data.
{$IFDEF FPC}{$mode objfpc}{$H+} {$ELSE} {$APPTYPE CONSOLE} {$ENDIF} uses Classes, SysUtils, uSMBIOS; 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.MemoryDeviceInformation 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 MHz',[LMemoryDevice.RAWMemoryDeviceInfo^.Speed])); 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 LMemoryDevice.RAWMemoryDeviceInfo^.PhysicalMemoryArrayHandle>0 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.
Note: Remember if you uses FPC, you can use this library in linux as well :)
March 19, 2013 at 5:00 am
Be careful when using SMBIOS or WMI. Both methods seem to fail in case of multiple memory devices.
At least I get a clear fault with 4 memory devices. SMBIOS and WMI display three identical serial numbers whereas the utility CPUID CPU-Z clearly shows 4 different serial numbers. CPUID CPU-Z is using SPD.
March 19, 2013 at 9:25 am
Hi, Thanks for your feedback, can you dump your SMBIOS Data (using the method TSMBIOS.SaveToFile) and also send me a screenshot of the CUPID CPU-Z App, to make some tests?
March 19, 2013 at 5:49 am
nice…
March 19, 2013 at 11:00 am
Hi, nice work .
I can’t compile on Ubuntu I get :
/home/opc0de/Music/smbios/tsmbios-read-only/Common/uSMBIOS.pas(4084,24) Error: Can’t take the address of constant expressions
March 19, 2013 at 3:21 pm
I just try, in Ubuntu 12.10 using Lazarus 0.9.30.4 with FPC 2.6.0 and works fine, can you include your environment details and upload the details to the issue page of the project http://code.google.com/p/tsmbios/issues/list
March 19, 2013 at 11:38 am
Cool, again.