#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;
}
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é.) –
J'ai besoin de l'identifier unique d'un autre PC. – user1586515
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. –