システムの情報を取得する for Windows(CPU の枚数を取得する)

Ruby で CPU の枚数を取得したくで、WinAPI を使った方法で書いてみた。
API および構造体の情報はコメントおよびリンク先の MSDN を参照。

#
#  GetSystemInfo
#
#  現在のシステムに関する情報(ページのサイズやプロセッサの種類など)を取得します。
#
#  VOID GetSystemInfo(
#    LPSYSTEM_INFO lpSystemInfo  // システム情報
#  );
#
#  ref. http://msdn.microsoft.com/ja-jp/library/cc429808.aspx
#
#
#  SYSTEM_INFO Structure
#
#  typedef struct _SYSTEM_INFO {
#    union {
#      DWORD dwOemId;
#      struct {
#        WORD wProcessorArchitecture;
#        WORD wReserved;
#      };
#    };
#    DWORD dwPageSize;
#    LPVOID lpMinimumApplicationAddress;
#    LPVOID lpMaximumApplicationAddress;
#    DWORD_PTR dwActiveProcessorMask;
#    DWORD dwNumberOfProcessors;
#    DWORD dwProcessorType;
#    DWORD dwAllocationGranularity;
#    WORD wProcessorLevel;
#    WORD wProcessorRevision;
#  } SYSTEM_INFO;
#
#  ref. http://msdn.microsoft.com/en-us/library/ms724958(VS.85).aspx
#

require 'Win32API'

getsysteminfo = Win32API.new('Kernel32', 'GetSystemInfo', ['P'], 'V')

lpsysteminfo = ' ' * 8 * 10

getsysteminfo.Call(lpsysteminfo)

params = lpsysteminfo.unpack('L10')

puts "Hardware information:"
puts "  OEM ID: #{params[0]}"
puts "  Number of processors: #{params[5]}"
puts "  Page size: #{params[1]}"
puts "  Processor type: #{params[6]}"
puts "  Minimum application address: #{params[2]}"
puts "  Maximum application address: #{params[3]}"
puts "  Active processor mask: #{params[4]}"

出力結果

Hardware information:
OEM ID: 0
Number of processors: 1
Page size: 4096
Processor type: 586
Minimum application address: 65536
Maximum application address: 2147418111
Active processor mask: 1