Win10PcapをVisual C++ 2008 Expressでビルドする

# Win10PcapをVisual C++ 2008 Expressでビルドする

つい先日、Win10Pcapというパケットキャプチャライブラリが公開されました。

 * Win10Pcap
   * http://www.win10pcap.org/ja/
 * 登大遊氏が開発した新しいパケットキャプチャーライブラリ「Win10Pcap」が公開
   * http://www.forest.impress.co.jp/docs/news/20150611_706459.html

ソースコードはGitHubで公開されています。

 * SoftEtherVPN/Win10Pcap
   * https://github.com/SoftEtherVPN/Win10Pcap

オリジナルのWinPcapとの違いと特徴については以下のように説明されています。

 * WinPcapをNDIS 6.xドライバモデルにintegratedしてWindows 10で動作するようにした
   * オリジナルのWinPcapライブラリはNDIS 5.xドライバモデルがベース
 * 加えて、イーサフレームのIEEE802.1Q VLANタグをキャプチャする機能を追加した
   * これはオリジナルのWinPcapではサポートしてない機能
 * 10,000オクテットよりも大きいジャンボフレームをサポート
 * オリジナルのWinPcapとバイナリ互換

Windowsでのドライバ開発環境の構築・ビルド手順を把握したかったこともあり、今回はWin10Pcapを手元でビルドしてみました。

## 開発環境の構築

### Win10Pcapのビルドに必要なツール

Win10Pcapのビルド環境として、Windows XP,Vista,7,8が指定されています。
今回はビルドテスト用の環境として、[Modern.IE](https://www.modern.ie/ja-jp "Modern.IE")のVMを利用します。

開発ツールとしてVisual Stidio 2008が指定されており、これは以下のURLからダウンロード+インストールしておきます。Windows SDKも併せてインストールしておく点に注意してください。

 * Microsoft Visual Studio 2008 Service Pack 1 (iso)
   * https://www.microsoft.com/ja-jp/download/details.aspx?id=13276
 * Windows 8.1 用 Windows ソフトウェア開発キット (Windows SDK)
   * https://msdn.microsoft.com/ja-jp/windows/desktop/bg162891.aspx

そして、デバイスドライバ開発のため、Windows Device Driver Kit(WinDDK)も忘れずにインストールします。これは"C:\winddk"以下にインストールされます。

 * Windows Driver Kit Version 7.10
   * http://www.microsoft.com/en-us/download/confirmation.aspx?id=11800

### その他のツール(アプリケーション)

Win10PcapのソースコードはGitHubで公開されています。Windowsでgitを利用できるようにするため、[SourceTree](https://www.atlassian.com/ja/software/sourcetree/overview "SourceTree")をインストールしておきます。

 * Atlassian SourceTree
   * https://www.atlassian.com/ja/software/sourcetree/overview

パケットキャプチャの確認用に[Wireshark](https://www.wireshark.org "Wireshark")もダウンロードしておきます。ドライバのインストール確認の兼ね合いで、この段階ではWiresharkはインストールしません。

こうやって見ると、環境構築は単にツールをインストールするだけですね...。

## Win10Pcapのビルド

### Win10Pcapソースコードを取得する

Win10PcapのソースコードをGitHubから取得します。

 * SoftEtherVPN/Win10Pcap
   * https://github.com/SoftEtherVPN/Win10Pcap

今回は[SourceTree](https://www.atlassian.com/ja/software/sourcetree/overview "SourceTree")を利用してgit cloneしてみます。SourceTreeのメニューから「File」→「Clone/New...」を選択して以下のように入力します。
![img014.png](https://qiita-image-store.s3.amazonaws.com/0/61137/4ad298fe-5075-2cb3-e8cc-e9193f631cf9.png)

### Win10Pcapのビルド手順

環境構築でインストールした[Windows Driver Kit](http://www.microsoft.com/en-us/download/confirmation.aspx?id=11800 "Windows Driver Kit")(以降"WinDDK"と表記)は、以下のフォルダにインストールされます。

 * C:\WinDDK\7600.16385.1

git cloneしたWin10Pcapのプロジェクト設定では、WinDDKがC:\WinDDK\\**7600.16385.0**となっているので、まずは参照するDDKのパスを合わせます。

Visual C++のソリューション エクスプローラから、NdisDriverのプロパティを開きます。
![img001.png](https://qiita-image-store.s3.amazonaws.com/0/61137/e7f2c9d8-b872-8f77-df06-eac3704db4b1.png)

プロパティページから、「構成プロパティ」→「リンカ」→「コマンドライン」を選択します。右側にある「追加のオプション(D):」にWinDDKのインストールフォルダを参照している箇所があるので、これを適切なパスに書き換えます。
![img002.png](https://qiita-image-store.s3.amazonaws.com/0/61137/c85ec50e-616b-4837-a6e2-4d7c50900177.png)

また、Visual C++ 2008のExpress Editionでは、参照するヘッダファイルが異なっている(別名になっている？)ものがあるので、以下のように参照するヘッダファイルを書き換えます。

```diff
diff --git a/Installer/Installer.rc b/Installer/Installer.rc
index 3d7ad54..80d3490 100644
--- a/Installer/Installer.rc
+++ b/Installer/Installer.rc
@@ -7,7 +7,7 @@
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+#include "windows.h"
 
 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END
 
 2 TEXTINCLUDE 
 BEGIN
-    "#include ""afxres.h""\r\n"
+    "#include ""windows.h""\r\n"
     "\0"
 END
 
diff --git a/NdisDriver/NdisDriver.rc b/NdisDriver/NdisDriver.rc
index bdc2459..9550875 100644
--- a/NdisDriver/NdisDriver.rc
+++ b/NdisDriver/NdisDriver.rc
@@ -7,7 +7,7 @@
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+#include "windows.h"
 
 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END
 
 2 TEXTINCLUDE 
 BEGIN
-    "#include ""afxres.h""\r\n"
+    "#include ""windows.h""\r\n"
     "\0"
 END
 
diff --git a/Packet_dll/Packet_dll.rc b/Packet_dll/Packet_dll.rc
index e815e09..1babaf0 100644
--- a/Packet_dll/Packet_dll.rc
+++ b/Packet_dll/Packet_dll.rc
@@ -7,7 +7,7 @@
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+#include "windows.h"
 
 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS
@@ -34,7 +34,7 @@ END
 
 2 TEXTINCLUDE 
 BEGIN
-    "#include ""afxres.h""\r\n"
+    "#include ""windows.h""\r\n"
     "\0"
 END
```

上記の手順を実施したのち、メニューから「ビルド(B)」→「ソリューションのビルド(B)」を選択してWin10Pcapをビルドします。ビルドが成功すると以下のような出力が得られます。
![img003.png](https://qiita-image-store.s3.amazonaws.com/0/61137/cf523246-bc97-134a-03d3-ca8d1e9c6449.png)

## 確認用にWinPcap無しでWiresharkをインストールする

Win10Pcap(のドライバ)がビルドできたので、さっそく動作させてみます。WinPcapを利用するアプリケーションが必要なので、[Wireshark](https://www.wireshark.org "Wireshark")をインストールします。

ただし、Win10Pcapが利用されているかどうかも確認したいため、以下のようにWiresharkのインストール時には、付属するWinPcapを**「インストールしない」**手順で進めます。
![img004.png](https://qiita-image-store.s3.amazonaws.com/0/61137/2c508088-8c6e-d853-1132-ff5a6965b296.png)

上記手順でWiresharkをインストールすると、WinPcapが入っていない状態なので、パケットキャプチャ実行時に以下のようなエラーが発生します。WinPcapが入っていない状態にしたかったので、これは想定通りの動作です。
![img005.png](https://qiita-image-store.s3.amazonaws.com/0/61137/fc26cc14-07ad-2969-262b-4849b71f3168.png)

## ビルドしたWin10Pcapをインストールする

次にビルドしたWin10Pcapをインストールします。プロジェクトフォルダのbin\Win32ディレクトリにバイナリが生成されるので、その中にあるinstaller.exeを実行します。
![img006.png](https://qiita-image-store.s3.amazonaws.com/0/61137/22b09e88-4c32-f68f-310b-8111f86403a0.png)

以下のダイアログが表示されるので、「Install」をクリックしてWin10Pcapドライバをインストールします。
![img007.png](https://qiita-image-store.s3.amazonaws.com/0/61137/beeeae72-1107-7334-a8e0-9a3523d723b4.png)

ちゃんとWin10Pcapドライバがインストールされたか確認してみます。Windowsの「システム情報」でインストールされているドライバが確認できます。

Visual C++のメニューから「ヘルプ(H)」→「Visual C++ 2008 Express Edition のバージョン情報(A)」をクリックし、バージョン情報ダイアログを表示します。「システム情報(S)」ボタンがあるので、それをクリックするとシステム情報が表示できます。
![img008.png](https://qiita-image-store.s3.amazonaws.com/0/61137/af3184e1-e427-c80d-adfd-ea2d0d1093e0.png)

「System Summary」→「Software Environment」→「System Drivers」を辿るとインストールされているドライバが一覧表示できます。その中を見ると、「win10pcap」という名前でドライバがインストールされていることを確認できます。
![img009.png](https://qiita-image-store.s3.amazonaws.com/0/61137/aef2bffc-ab02-9f99-0bfe-2f37b21d8b82.png)

## Wiresharkから参照されるWinPcapを確認してみる

Win10Pcapのドライバがインストールされていることが確認できたので、次はWiresharkからWin10Pcapが利用されるか確認してみましょう。

Wiresharkを起動してメニューから「Capture」→「Interfaces...」を選択します。インタフェースの一覧が表示されるので、右側にある「Details」をクリックします。
![img010.png](https://qiita-image-store.s3.amazonaws.com/0/61137/f0f98801-2994-d851-e06d-4c6a3607e55f.png)

すると"Unknown WinPcap version."というダイアログが表示されます。「WinPcapのpacket.dllが『10, 1, 0, 5001』で(このバージョンは)知らないよ」(意訳)というメッセージが出ています。
![img011.png](https://qiita-image-store.s3.amazonaws.com/0/61137/7ad72cd3-d6db-8065-5e70-3e887c69b81a.png)

Win10Pcapのソースコードを参照すると、Packet_dllのHeader\Packet32.hにPACKET_CURRENT_VERSIONというマクロ定数があり、この値が「10, 1, 0, 5001」であることから、ちゃんとビルドしたWin10Pcapドライバが利用されていることが分かります。
![img012.png](https://qiita-image-store.s3.amazonaws.com/0/61137/8746580e-7992-ecb6-bc78-495c51c9d966.png)

ちなみに、"Unknown WinPcap version."は念のための確認的なダイアログなので、「OK」をクリックすると、普通に(Win10Pcapドライバで)パケットキャプチャが行えます。
![img013.png](https://qiita-image-store.s3.amazonaws.com/0/61137/3b979ef7-3b71-7c57-8b90-b936f410e6ef.png)

## まとめ

Win10Pcapをソースコードからビルドしてみました。Windows環境にはあまり馴染みがない＋Windowsドライバのビルドは試したことがなかったので、環境構築まわりで色々試行錯誤する形になってしまいました(手順が分かってしまえば単に必要なツールをインストールするだけなのですが...)。また、本当にWin10Pcapドライバがインストールできているか、Wiresharkから利用されているかの確認もどうしたら良いのかあれこれ考えてみる感じでしたが、確認できる方法が分かってほっとしています。

あと、今回の一連の内容を6/29(月)の[第29回「ネットワークパケットを読む会（仮）」](https://atnd.org/events/67334 "第29回「ネットワークパケットを読む会（仮）」")でデモを含めた発表をしてみようかなと考えています。この会は他にも面白い発表があるので、予定の合う方は参加されてみてはどうでしょうか。