2012-08-09 5 views
-1

J'ai besoin de PSN de CPU. Je écrire du code commeNuméro de série du processeur

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

std::stringstream psn_id; 

Comment j'obtenir le numéro de série du processeur? Quelqu'un peut-il m'aider s'il vous plaît. Merci.

+3

En règle générale, vous ne pouvez pas. Il est généralement désactivé par défaut par le BIOS des machines x86. Quel est votre problème externe? Pourquoi pensez-vous que vous en avez besoin? (Il ne fonctionnera pas pour les raisons que la plupart des gens ont tendance à vouloir parce qu'il ne peut pas être vérifié.) –

+0

J'ai besoin de l'identifier unique d'un autre PC. – user1586515

+4

Il suffit de générer en toute sécurité un nombre aléatoire de 128 bits et de le stocker dans un fichier. Cela permettra d'identifier le PC de manière unique. PSN ne fonctionnera pas correctement sur les systèmes qui ont plus d'un processeur (le PSN peut changer en fonction du processeur sur lequel le code est exécuté) ou désactiver le PSN. De même, il pensera que vous avez un PC différent si vous changez le CPU. PSN est donc un mauvais choix pour identifier un PC de manière unique. –

Répondre

0

Quel système d'exploitation? Si Windows puis au lieu de la série du processeur vous pouvez identifier de manière unique le PC en utilisant le volume numéro de série associé au système de fichiers en utilisant l'appel système GetVolumeInformation()

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

Ensuite, utilisez serial comme identifiant unique à la place.

+0

en effet, quelle famille de CPU? – marko

+1

lorsque la machine est formatée, le numéro de série reste le même ou pas – user1586515

+0

@ user1586515 Le lien MSDN que j'ai fourni dans la réponse vous indique que ce n'est pas la même chose et vous donne alors une alternative pour obtenir le numéro de série du fabricant qui ne changera pas. – acraig5075

-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; 
} 
Questions connexes