Win32 IPLHLPAPI GetInterfaceInfoを使う

ここでは、Windows環境でネットワークインターフェース情報を取得する方法を説明したいと思います。 Win32APIを利用するとWindowsのNative APIを使えますが、ここではネットワーク情報を取得するためのIPHLPAPI(IP Helper API)を利用します。 (IP Helper APIに関しては「VC++ IP Helper APIプログラミング解説」をご覧下さい。)

サンプル

以下、サンプルです。 解説はソースコード中に記述しています。


#!/usr/bin/ruby

require 'Win32API'
#require 'dl/win32'

# iphlpapi GetInterfaceInfoオブジェクトを生成
GetInterfaceInfo = Win32API.new('iphlpapi',
                         'GetInterfaceInfo', %w(p p), 'i')

# 32ビットint
intPtr = "\0" * 4;

# NULLを渡してintPtrに必要サイズを入れてもらう
GetInterfaceInfo.call(nil, intPtr)

# 返ってきた必要サイズを整数へunpack
sz = intPtr.unpack('i')

# mallocのつもり
# IP_INTERFACE_INFO
ptr = "\0" * sz[0]

# 本番呼び出し
GetInterfaceInfo.call(ptr, intPtr)

# アダプタ数をゲット
numAdapters, = ptr.unpack('i')
p numAdapters

# 各アダプタの情報を取得していく
i = 0
while i < numAdapters

  # IP_ADAPTER_INDEX_MAP
  adapterIndex, = ptr[4+i*(256+4),4].unpack('i')
  adapterName, = ptr[4+i*(256+4)+4, 128];
  p adapterIndex
  p adapterName

  i = i + 1
end


「require 'Win32API'」は将来「require 'dl/win32'」に変わるそうです。

プロフェッショナルIPv6解説動画シリーズ再生リスト

動画で学ぶ「プロフェッショナルIPv6」を作っています。 もしよろしければご覧ください。お楽しみいただければ幸いです!