2009-06-12 26 views
9

Quelles informations de processeur ce code essaye-t-il de récupérer. Ce code fait partie d'un paquet plus grand. Je ne suis pas un programmeur Python, et je veux convertir ce code en C#.Que signifie cette ligne dans Python?

from ctypes import c_uint, create_string_buffer, CFUNCTYPE, addressof 
CPUID = create_string_buffer("\x53\x31\xc0\x40\x0f\xa2\x5b\xc3") 
cpuinfo = CFUNCTYPE(c_uint)(addressof(CPUID)) 
print cpuinfo() 

Si vous êtes un programmeur Python et sait ce que ce code fait, ce sera une grande aide pour moi.

+0

ressemble à l'appel de fonction codé en dur, la plate-forme, les détails du paquet etc peuvent aider à répondre –

+0

aussi la 3 e ligne devrait être cpuinfo = CFUNCTYPE (c_uint) (addressof (CPUID)) –

+0

Annuler la modification. – VVS

Répondre

24

Il exécute le code de la machine suivante:

push bx 
xor ax, ax 
inc ax 
cpuid 
pop bx 
retn 

Fondamentalement, il appelle l'instruction CPUID de la CPU afin d'obtenir des informations sur la CPU. Depuis EAX = 1, il obtient les informations sur le processeur et les bits de fonctionnalité. Le résultat 32 bits entier est ensuite affiché sur l'écran, voir l'article wikipedia ou this page pour décoder le résultat.

EDIT: Puisque c'est ce que vous cherchez, here's an excellent article about invoquant CPUID dans un environnement # .NET/C (en quelque sorte, avec P/Invoke)

+1

Merde :) Je suis arrivé à la même conclusion en recherchant la valeur hexadécimale. http://www.cs.helsinki.fi/u/vahakang/ineptkey.pyw et http://en.wikipedia.org/wiki/CPUID m'a donné les indices. – VVS

+2

Vous préférerez peut-être utiliser WMI pour obtenir ce type d'informations plutôt que d'essayer d'exécuter le langage brut de la machine. Windows fait le travail de grognement pour vous et offre beaucoup plus que le CPUID. – paxdiablo

+1

Pax: Très vrai. –

6

En plus de la réponse de DrJokepu. Le code python utilise les ctypes modules ne mettre en œuvre le code C suivant (/ pirater):

char *CPUID = "\x53\x31\xc0\x40\x0f\xa2\x5b\xc3"; // x86 code 
unsigned int (*cpuid)() = (unsigned int (*)()) CPUID; // CPUID points to first instruction in above code; cast it to a function pointer 

printf("%u",cpuid()); // calling cpuid() effectively executes the x86 code. 

Notez également que ce ne retourne que les informations contenues dans EAX et le code x86 devrait probablement aussi poussé/sauté les valeurs de ECX et EDX pour être sûr.

+0

Ouais, je ne suis pas vraiment chez moi à Python, donc je viens de deviner la partie Python. –