【问题标题】:Processor serial number处理器序列号
【发布时间】:2012-08-09 13:17:45
【问题描述】:

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

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

std::stringstream psn_id;

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

【问题讨论】:

  • 作为一般规则,您不能。 x86 机器的 BIOS 通常默认禁用它。你的外在问题是什么?为什么你认为你需要这个? (由于无法验证,大多数人倾向于想要它,因此它不起作用。)
  • 我需要从其他 PC 中识别它的唯一性。
  • 只需安全地生成一个随机的 128 位数字并将其存储在文件中即可。这将唯一标识 PC。 PSN 在具有多个 CPU(PSN 可以根据代码恰好在哪个 CPU 上运行)或禁用 PSN 的系统上无法正常工作。此外,如果您更换 CPU,它会认为您拥有不同的 PC。所以 PSN 是唯一识别 PC 的错误选择。

标签: c++


【解决方案1】:

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

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

然后使用serial 作为您的唯一标识符。

【讨论】:

  • 机器格式化后序列号保持不变
  • @user1586515 我在答案中提供的 MSDN 链接告诉您它不会相同,然后它为您提供了获取制造商序列号的替代方法,该序列号不会改变.
  • 如果您创建一个磁盘映像,然后将其应用于多台机器,那么它们将具有相同的序列号。序列号是一个逻辑而不是一个物理
【解决方案2】:
#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 '\0'
    getPSN(PSN);
    printf("%s\n", PSN); //compare with: lshw | grep serial:
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多