2009-06-12 16 views
9

Qué información de CPU está tratando de recuperar este código. Este código es parte de un paquete más grande. No soy un programador de Python, y quiero convertir este código a C#.¿Qué significa esta línea en 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 usted es un programador de Python y sabe lo que este código está haciendo, que será una gran ayuda para mí.

+0

parece que la función de llamada codificada, plataforma, detalles del paquete, etc. pueden ayudar a responder –

+0

también la 3ª línea debe ser cpuinfo = CFUNCTYPE (c_uint) (dirección de (CPUID)) –

+0

Deshace el cambio. – VVS

Respuesta

24

Ejecuta el siguiente código de la máquina:

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

Básicamente se llama CPUID de instrucciones de la CPU con el fin de obtener información sobre la CPU. Dado que EAX = 1, obtiene la información del procesador y los bits de características. El resultado entero de 32 bits se muestra en la pantalla, consulte el artículo de wikipedia o this page para decodificar el resultado.

EDITAR: Dado que eso es lo que está buscando, here's an excellent article about invocando CPUID en un entorno # .NET/C (más o menos, con P/Invoke)

+1

Maldición :) Llegué a la misma conclusión buscando en Google el valor hexadecimal. http://www.cs.helsinki.fi/u/vahakang/ineptkey.pyw y http://en.wikipedia.org/wiki/CPUID me dieron las pistas. – VVS

+2

En realidad, puede preferir utilizar WMI para obtener este tipo de información en lugar de intentar ejecutar el lenguaje de máquina sin formato. Windows funciona bien para usted y ofrece mucho más que solo el CPUID. – paxdiablo

+1

Pax: Muy cierto. –

6

Además de DrJokepu 's respuesta. El código Python está utilizando los módulos ctypes no aplicar el siguiente código C (/ truco):

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. 

También tenga en cuenta que esto sólo se devuelve la información en EAX y el código x86 debe, probablemente, también han empujado/aparecido los valores de ECX y EDX para estar seguro.

+0

Sí, no estoy realmente en casa en Python, así que acabo de adivinar la parte de Python. –

Cuestiones relacionadas