System Hardware Information Finder

WEBINAR: On-demand webcast

How to Boost Database Development Productivity on Linux, Docker, and Kubernetes with Microsoft SQL Server 2017 REGISTER >

This article is an update to my previous articles on the same topic. I started this utility to get some basic information about the hardware. After that I have received some emails from some of our fellow programmers, who are frequent visitors of this site, asking to extend this utility to spit out some more information. In this update I have added the information about CPU vendor (Intel, Cyrix, AMD, etc.) ,CPU speed, and Physical memory status of sustem .

CPU Information:

To get CPU information I could not find any direct and simple API call. Then I thought of our friendly Registry, which contains all the system information. And there it was all the information I wanted. If you look under HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor/0 key in registry, you will find the answers to your questions. ~MHz subkey gives the CPU speed and VendorIdentifier gives the vendor information. We will make use of RegQueryValueEx API call to get the information.

LONG RegQueryValueEx(
HKEY hKey, 			// handle to key to query
LPTSTR lpValueName, 	// address of name of value to query
LPDWORD lpReserved, 	// reserved
LPDWORD lpType, 		// address of buffer for value type
LPBYTE lpData, 		// address of data buffer
LPDWORD lpcbData 		// address of data buffer size
); 

Before making this call, it is necessary to create the handle to registry key which needs to be queried. For this make use of RegCreateKeyEx API call.

This is how the code looks like in the included code for this utility.


// Get the processor speed info.

result = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,
	"Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey);

// Check if the function has succeeded.

if (result == ERROR_SUCCESS) {
	result = ::RegQueryValueEx (hKey, _T("~MHz"), NULL, NULL,
		(LPBYTE)&data, &dataSize);
		
	m_stCPUSpeed.Format ("%d", data);
	m_stCPUSpeed += _T (" MHz");

	dataSize = sizeof (vendorData);

	result = ::RegQueryValueEx (hKey, _T("VendorIdentifier"), NULL, NULL,
		(LPBYTE)vendorData, &dataSize);

	m_stVendorInfo.Format ("%s", vendorData);
}

// Make sure to close the reg key

RegCloseKey (hKey);

Since I don't have access to any other CPU than Intel. So I couldn't test this code on CPU's from Cyrix, AMD, etc.

Physical Memory Status:

To get the information about the memory status of the system we can take routes. First one, which is not easy for a person who does not know assembly language, involves getting the required information from CMOS data. Second one which simply involves making GlobalMemoryStatus API call. And I chose the second one (Ofcourse I am not assembly language pro).

VOID GlobalMemoryStatus (
LPMEMORYSTATUS lpBuffer // pointer to the memory status structure
);

The information is returned in MEMORYSTATUS data structure.

typedef struct _MEMORYSTATUS { // mst
 DWORD dwLength; // sizeof(MEMORYSTATUS)
 DWORD dwMemoryLoad; // percent of memory in use
 DWORD dwTotalPhys; // bytes of physical memory
 DWORD dwAvailPhys; // free physical memory bytes
 DWORD dwTotalPageFile; // bytes of paging file
 DWORD dwAvailPageFile; // free bytes of paging file
 DWORD dwTotalVirtual; // user bytes of address space
 DWORD dwAvailVirtual; // free user bytes
} MEMORYSTATUS, *LPMEMORYSTATUS; 

The information returned by the GlobalMemoryStatus function is volatile. There is no guarantee that two sequential calls to this function will return the same information. This API call has been made in GetMemoryInfo function of the application attached. I gets the information for memory usage, total physical memory instaled, physical memory available, and total virtual memory.

Download source - 27 KB



Comments

  • sugestion

    Posted by Dropfish on 08/29/2004 11:49pm

    it will be much better if u implement the getSysInformation inside the CSysInformation but the CXXXdlg

    Reply
  • System Information

    Posted by chandra.mohan on 08/11/2004 01:08am

    How can I get the serial number of Video Controller from c# programming

    Reply
  • Which API return the CPU serial Number?

    Posted by Legacy on 02/21/2004 12:00am

    Originally posted by: Shaghayegh

    Hi
    
    I want to write a program in Delphi that return CPU serial Number or BIOS serial number but I Don't khonw what to do?
    Please help me

    My E-mial is: sharif@baharnet.net

    Reply
  • BIOS

    Posted by Legacy on 02/17/2004 12:00am

    Originally posted by: Meena

    I want to write a code in vb that would read the DMI information in BIOS. Could anyone help me? Thank You.
    - Meena.

    Reply
  • hardware configuration & installed softwares information using MFC

    Posted by Legacy on 02/09/2004 12:00am

    Originally posted by: Ajit

    How do get machines hardware configuration & installed softwares  info using MFC
    
    Are there any APIs or classes for it.

    Reply
  • how to retrive info from registry in jsp

    Posted by Legacy on 01/21/2004 12:00am

    Originally posted by: Indu

    iam indu iam doing a project
    in which i have to retrive info of hardware & software of systems in a Lan igot some functions like
    RegQueryValueEx()
    RegOpenKeyEx()...etc but not able to use then appropriately
    can u plz help!.

    Reply
  • Get me unique hardware identifier

    Posted by Legacy on 01/08/2004 12:00am

    Originally posted by: Philip Jacob

    Development on VB 6.0
    We are aware of GetVolumeInformation Win32 API and found it is not physical serial number embedded in the hardware units.
    we will appreciate any suggestions to obtain a unique hardware identifer through API.

    Reply
  • multitasking in c programming

    Posted by Legacy on 01/01/2004 12:00am

    Originally posted by: rajendra


    I want source code for multitasking in c programming
    Plese if u know something send me mail on id .

    Reply
  • Disable/Enable Hardware Acceleration..

    Posted by Legacy on 12/10/2003 12:00am

    Originally posted by: Dillip

    Hi.!,
    How do I Enable/Disable Hardware Acceleration of Display card programmatically available under Display Properties->Settings->Advanced->Troubleshooting..?

    Any code snipte would be highly appreciated.!

    Thanks & Regards.,
    DILLIP.

    Reply
  • CPU SPEED (Assembly)

    Posted by Legacy on 12/02/2003 12:00am

    Originally posted by: Hugo

    I would like to know in which part of memory, offset and segment, we can get the CPU speed.
    

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • As all sorts of data becomes available for storage, analysis and retrieval - so called 'Big Data' - there are potentially huge benefits, but equally huge challenges...
  • The agile organization needs knowledge to act on, quickly and effectively. Though many organizations are clamouring for "Big Data", not nearly as many know what to do with it...
  • Cloud-based integration solutions can be confusing. Adding to the confusion are the multiple ways IT departments can deliver such integration...

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date