2009-06-12 22 views
9

このコードが取得しようとしているCPU情報。このコードは、より大きなパッケージの一部です。私はPythonプログラマーではないので、このコードをC#に変換したい。この行は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() 

あなたがPythonプログラマーであり、このコードが何をしているのか分かっているなら、私にとって大きな助けになるでしょう。

+0

ハードコーディングされた関数呼び出し、プラットフォーム、パッケージの詳細などは、 –

+0

のようになります。3行目はcpuinfo = CFUNCTYPE(c_uint)(addressof(CPUID)) –

+0

に変更する必要があります。 – VVS

答えて

24

これは、次のマシンコードを実行します。

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

基本的にはCPUについての情報を取得するために、CPUのCPUID命令を呼び出します。 EAX = 1であるので、プロセッサ情報と特徴ビットを得る。その結果の32ビット整数が画面に表示されます。結果をデコードするには、wikipediaの記事またはthis pageを参照してください。

EDIT:それはあなたが探しているものなので、here's an excellent article aboutは(P /呼び出して、ソートの).NET/C#の環境でCPUIDを呼び出す

+1

くそー:)私は16進値のためにグーグルで同じ結論に達しました。 http://www.cs.helsinki.fi/u/vahakang/ineptkey.pywとhttp://en.wikipedia.org/wiki/CPUIDは私に手がかりを与えました。 – VVS

+2

実際には、生の機械語を実行するのではなく、このような情報を得るためにWMIを使用することをお勧めします。 Windowsはあなたのために不平を言って、CPUID以上のものを提供します。 – paxdiablo

+1

Pax:非常に真実。 –

6

DrJokepuの答えに加えて。 Pythonのコードは次のCコード(/ハック)を実装しない​​モジュールを使用している:

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は安全です。

+0

ええ、私は本当にPythonで家ではないので、私はちょうどPythonの部分を推測しました。 –

関連する問題