这行Python代码是什么意思?

9

这段代码试图检索哪个CPU信息。该代码是一个较大程序的一部分。我不是Python程序员,我需要将此代码转换为C#。

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()

如果您是一名Python程序员并且知道这段代码在做什么,那对我来说将是一个巨大的帮助。

似乎是硬编码的函数调用,平台,包细节等可能有助于回答。 - Anurag Uniyal
另外,第三行应该是cpuinfo = CFUNCTYPE(c_uint)(addressof(CPUID))。 - Anurag Uniyal
2个回答

24

它执行以下机器码:

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

基本上,它调用CPU的CPUID指令以获取有关CPU的信息。由于EAX = 1,因此它获取处理器信息和特征位。然后在屏幕上显示结果32位整数,请参见维基百科文章或此页面以解码结果。 编辑:既然这是您要寻找的内容,这里有一篇关于在.NET / C#环境中调用CPUID的优秀文章(使用P / Invoke)。

1
通过搜索十六进制值,我得出了相同的结论。http://www.cs.helsinki.fi/u/vahakang/ineptkey.pyw和http://en.wikipedia.org/wiki/CPUID给了我线索。 - VVS
2
你可能更喜欢使用WMI来获取这种信息,而不是尝试运行原始机器语言。Windows为您完成了大部分工作,并提供了比CPUID更多的信息。 - paxdiablo
@DrJokepu:很可能PO是使用32位机器。另外,如果你考虑16位版本,EAX的上半部分是未确定的,因此EAX = 1很可能是错误的。 - Bastien Léonard
巴斯蒂安·莱昂纳德:是的,我想你说得对。目前我手头上没有32位反汇编器,但这应该相当简单。 - Tamas Czinege

6
除了 DrJokepu 的回答之外,这段 Python 代码使用 ctypes 模块来实现以下 C 代码(/hack):
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.

请注意,此处仅返回EAX中的信息,x86代码应该也将ECX和EDX的值推入/弹出以确保安全。


是的,我对Python不是很熟悉,所以我只是猜测了Python部分。 - Tamas Czinege

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接