2012-08-09 57 views
-1

我需要CPU的PSN。 我寫代碼如處理器序列號

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

std::stringstream psn_id; 

我如何得到處理器序列號? 任何人都可以幫助我。 謝謝。

+3

作爲一般規則,你不能。通常,x86機器的BIOS默認情況下會禁用它。你外在的問題是什麼?你爲什麼認爲你需要這個? (它不會工作,因爲大多數人傾向於需要它的原因,因爲它不能被驗證。) – 2012-08-09 13:20:18

+0

我需要從其他PC識別它獨特。 – user1586515 2012-08-09 13:26:04

+4

只需安全生成一個隨機的128位數字,然後將其存儲在一個文件中。這將唯一標識PC。 PSN在具有多個CPU的系統(PSN可以根據代碼運行在哪個CPU上而改變)或禁用PSN的系統上運行不正常。此外,如果更換CPU,它會認爲你有不同的PC。所以PSN是唯一識別PC的不錯選擇。 – 2012-08-09 13:36:35

回答

0

什麼是操作系統?如果Windows然後代替CPU串口,你可以使用獨特的使用系統調用GetVolumeInformation()

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

與文件系統相關的卷序列號來識別PC然後使用serial作爲唯一的標識符來代替。

+0

的確,CPU家族是什麼? – marko 2012-08-09 16:31:15

+1

當機器得到格式化,然後序列號保持不變 – user1586515 2012-08-10 04:10:16

+0

@ user1586515我在回答中提供的MSDN鏈接告訴你它不會是相同的,然後它會給你一個替代方法來獲取製造商的序列號這不會改變。 – acraig5075 2012-08-10 06:05:12

-1
#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; 
}