How to determine the hardware (CPU and RAM) on a machine? How to determine the hardware (CPU and RAM) on a machine? c c

How to determine the hardware (CPU and RAM) on a machine?


Here is one method for getting the information you want on a Windows machine. I copied and pasted it from an actual project with some minor modifications, so feel free to clean it up to make more sense.

        int CPUInfo[4] = {-1};        unsigned   nExIds, i =  0;        char CPUBrandString[0x40];        // Get the information associated with each extended ID.        __cpuid(CPUInfo, 0x80000000);        nExIds = CPUInfo[0];        for (i=0x80000000; i<=nExIds; ++i)        {            __cpuid(CPUInfo, i);            // Interpret CPU brand string            if  (i == 0x80000002)                memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));            else if  (i == 0x80000003)                memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));            else if  (i == 0x80000004)                memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));        }        //string includes manufacturer, model and clockspeed        cout << "CPU Type: " << CPUBrandString << endl;        SYSTEM_INFO sysInfo;        GetSystemInfo(&sysInfo);        cout << "Number of Cores: " << sysInfo.dwNumberOfProcessors << endl;        MEMORYSTATUSEX statex;        statex.dwLength = sizeof (statex);        GlobalMemoryStatusEx(&statex);        cout << "Total System Memory: " << (statex.ullTotalPhys/1024)/1024 << "MB" << endl;

For more information, see GetSystemInfo, GlobalMemoryStatusEx and __cpuid. Although I didn't include it, you can also determine if the OS is 32 or 64 bit via the GetSystemInfo function.


On Windows you can use GlobalMemoryStatusEx to get the amount of actual RAM.

Processor information can be obtained via GetSystemInfo.


For Linux with GCC you can use a very similar solution like windows. You need to include the <cpuid.h> and you need to modify the input for the __cpuid() method based on this.

#include <cpuid.h>char CPUBrandString[0x40];unsigned int CPUInfo[4] = {0,0,0,0};__cpuid(0x80000000, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);unsigned int nExIds = CPUInfo[0];memset(CPUBrandString, 0, sizeof(CPUBrandString));for (unsigned int i = 0x80000000; i <= nExIds; ++i){    __cpuid(i, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);    if (i == 0x80000002)        memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo));    else if (i == 0x80000003)        memcpy(CPUBrandString + 16, CPUInfo, sizeof(CPUInfo));    else if (i == 0x80000004)        memcpy(CPUBrandString + 32, CPUInfo, sizeof(CPUInfo));}cout << "CPU Type: " << CPUBrandString << endl;