处理器序列号

Processor serial number

本文关键字:处理器序列号      更新时间:2023-10-16

我需要CPU的PSN。我写的代码像

int info[4] = { -1 };
__cpuid(info, 1);
int family = info[0] & 0xf00;
int features = info[3] & 0xf000;
std::stringstream psn_id;

如何获取处理器序列号?谁能帮帮我。谢谢。

什么操作系统?如果是Windows,那么而不是CPU串行,你可以使用与文件系统关联的卷序列号唯一地标识PC,使用系统调用GetVolumeInformation()

DWORD serial;
::GetVolumeInformation(_T("C:\"), NULL, 0, &serial, NULL, NULL, NULL, 0);

然后改用serial作为唯一标识符。

#include <stdio.h>
void getPSN(char *PSN)
{int varEAX, varEBX, varECX, varEDX;
   char str[9];
   //%eax=1 gives most significant 32 bits in eax 
   __asm__ __volatile__ ("cpuid": "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (1));
   sprintf(str, "%08X", varEAX); //i.e. XXXX-XXXX-xxxx-xxxx-xxxx-xxxx
   sprintf(PSN, "%C%C%C%C-%C%C%C%C", str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
   //%eax=3 gives least significant 64 bits in edx and ecx [if PN is enabled]
   __asm__ __volatile__ ("cpuid": "=a" (varEAX), "=b" (varEBX), "=c" (varECX), "=d" (varEDX) : "a" (3));
   sprintf(str, "%08X", varEDX); //i.e. xxxx-xxxx-XXXX-XXXX-xxxx-xxxx
   sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN, str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
   sprintf(str, "%08X", varECX); //i.e. xxxx-xxxx-xxxx-xxxx-XXXX-XXXX
   sprintf(PSN, "%s-%C%C%C%C-%C%C%C%C", PSN, str[0], str[1], str[2], str[3], str[4], str[5], str[6], str[7]);
}
int main()
{
    char PSN[30]; //24 Hex digits, 5 '-' separators, and a ''
    getPSN(PSN);
    printf("%sn", PSN); //compare with: lshw | grep serial:
    return 0;
}