- perl から任意の C ライブラリを呼び出す方法 - id:kazuhookuのメモ置き場
- Perl で Win32::API プログラミング入門 - TAKESAKOのはてな出張所
- TAKESAKO @ Yet another Cybozu Labs: Pure Perl で Acme::x86::CPUID を作りました
Ruby でもやってみました。1.9 系でしか動かないはず(1.8 系は DL クラスが別物なので)。動作確認は Cygwin 上の 1.9.1 のみ。
CPUID を取得して、Windows のメッセージボックスで表示してます。
機械語は竹迫さんのをまるぱくり。
#!/usr/bin/env ruby require 'dl' cpu = "\0" * 48 bin = "S\xbf#{ [cpu].pack('p') }\xb8\x02\x00\x00\x80" << "P\x0f\xa2\x89\x07\x89_\x04\x89O\x08\x89W\x0c\x8d\x7f\x10X\x8d\@\x01" * 3 << "[\xc3" DL::CFunc.new([bin].pack('p').unpack('L!')[0], DL::TYPE_VOID).call [] DL::CFunc.new(DL::dlopen('user32')['MessageBoxA'], DL::TYPE_LONG, 'MessageBox', :stdcall). call [0, cpu.gsub(/\0/, '').gsub(/\s+/, ' '), "CPUID", 0].pack('L!ppL!').unpack('L!*')
ぶくまコメントにもちらっと書いたけど、ベーマガの投稿プログラム(POKE 文でメモリに機械語セットして呼び出す奴)を思い出して笑ったのは、わたしだけではないはずだ(多分)。