NDIS Connection-less Protocol Driver Sample をインストールする
今回は、NDIS プロトコル ドライバのサンプルNDIS Connection-less Protocol Driver Sample をご紹介します。
このサンプルは、コネクションレス型の、NDIS 6.0 プロトコル ドライバの実装を確認できるサンプルです。プロトコル ドライバについては、さなえすさんの以前の記事「Windows の Network
Driver」をご参照ください。Connection-less プロトコルの例としては、UDP があります。これは、トランシーバーの様に明示的な接続をしなくても、通信ができます。そして、Connection-oriented の例としては、TCP があります。こちらは、電話のように相手が着信して初めて接続が確立し、通信ができます。このサンプルは、ユーザーモードからのReadFile/WriteFile で Raw イーサネット フレームを送受信できます。また、イーサネット アダプタへのバインドを確立したり破棄したりできます。
NDIS Connection-less Protocol Driver Sample では、ドライバーに加え、そのドライバーとのやり取りを行うテストアプリケーションがあるので、すぐに検証を行うことができます。
今回は、このサンプル プロトコル ドライバをビルドして、ターゲット側 PC の Windows 10 (1703) x86 にインストールします。そして、本サンプルの test フォルダでビルドする prottest.exe サンプルアプリケーションで、このプロトコル ドライバがバインドされたイーサネット アダプタを列挙し、パケットを送受信するところまでを確認します。サンプルをビルドする、開発側のPC は Windows 10 (1703) x64 に Visual Studio 2015 とWDK 10 がインストールされています。
1. サンプルの入手
NDIS Connection-less Protocol Driver Sampleは、以下のサイトの右側の緑色の [Clone or Download] ボタンを押すと表示される [Download ZIP] ボタンでWindows-driver-samples-master.zipをダウンロードすると、Windows-driver-samples-master\network\ndis\ndisprot\6x のフォルダにあります。
https://github.com/Microsoft/Windows-driver-samples
2. サンプルのビルド
この ndisprot\6x フォルダの ndisprot60.sln を、Visual Studio 2015 で開きます。
[ ソリューション ‘ndisprot60’] を右クリックして [構成マネージャー] をクリックします。
今回は、[アクティブソリューション構成] を [Debug] 、[アクティブ ソリューション プラットフォーム] を [Win32] とします。また、今回はndisprot630 (NDIS 6.30) のプロジェクトを使いたいと思いますので、ndisprot60の[ビルド] のチェックボックスは外します。
また、テストアプリ側で Visual C++ Runtime (VCRUNTIME14D.dll) のインストールを省略するために、プロジェクトprottest を右クリックして[プロパティ] を開き、[構成プロパティ]-[C/C++]-[コード生成]-[ランタイム ライブラリ] を [マルチスレッド デバッグ(/MTd)] に変更します。
[ソリューション ‘ndisprot60’] を右クリックして [ソリューションのリビルド] をクリックします。
ndisprot\6x\sys\630\Debug\ndisprot630 フォルダに以下の3 つのファイルができます。
ndisprot630.cat
ndisprot630.inf
ndisprot630.sys
また、ndisprot\6x\test\Debug フォルダに prottest.exe ファイルができます。
3. サンプルのインストール
今回動作確認するOS は、Windows 10 (1703) x86 です。これが入っているターゲットPC にC:\ndisprot というフォルダを作り、前述のビルドしてできた 4 つのファイルをコピーします。
[スタート] を右クリックし、 [設定] をクリックします。
[Windows の設定] ウィンドウで、 [ネットワークとインターネット] をクリックします。
[設定] ウィンドウ の[状態] の[ネットワーク設定の変更] の下にある [アダプターのオプションを変更する] をクリックします。
[ネットワーク接続] でアダプター(ここでは、以下の画像の通り、[イーサネット] とします) を右クリックし、 [プロパティ] をクリックします。
[イーサネットのプロパティ] ウィンドウで、 [インストール] をクリックします。
[ネットワーク機能の種類の選択] ウィンドウで、 [プロトコル] を選択し、 [追加] をクリックします。
[ネットワーク プロトコルの選択] ウィンドウで、 [ディスク使用] をクリックします。
C:\ndisprot フォルダの ndisprot630.inf を選択し、 [開く] をクリックします。
以下の画面で [OK] をクリックします。
以下の画面で [OK] をクリックします。
署名に関する警告が出ますが、今回はテストなので、インストールを進めます。
完了すると、[イーサネットのプロパティ] ウィンドウでが表示されるので、[Sample NDIS Protocol Driver] が表示されていることを確認します。
ここで、以下のように検索ボックスに msinfo32 と入力して [システム情報] を起動してみます。
[ソフトウェア環境]-[システム ドライバー] でndisprot を確認すると、[開始] が[いいえ]、[状態] が[停止] になっているため、ndisprot630.sys はまだロードされていないことがわかります。
そこで、管理者権限のコマンドプロンプトを起動し、以下のコマンドを入力します。
net start ndisprot |
「Sample NDIS Protocol Driver サービスは正常に開始されました。」と表示されれば成功です。[システム情報] も以下のように [開始] が [はい]、[状態] が[実行中] になります。
4. サンプルの動作確認
それでは、prottest.exe でこのプロトコルドライバの動作確認をしてみます。
先程の管理者権限のコマンドプロンプトで、以下のコマンドを実行します。
// c:\ndisprot に移動します C:\Windows\system32>cd \ndisprot\
// オプションなしで実行すると、使用法が表示されます C:\ndisprot>prottest.exe Missing <devicename> argument usage: PROTTEST [options] <devicename> options: -e: Enumerate devices -r: Read -w: Write (default) -l <length>: length of each packet (default: 100) -n <count>: number of packets (defaults to infinity) -m <MAC address> (defaults to local MAC) -f Use a fake address to send out the packets.
// -e オプションをつけると、このプロトコルドライバがバインドされているデバイスをすべて列挙できます C:\ndisprot>prottest.exe -e 0. \DEVICE\{B823930E-601D-46F7-88D9-436BFBCC6C8E} - Microsoft Hyper-V Network Adapter
// 上記で特定したデバイスに対してパケットを 2 つ送受信します C:\ndisprot>prottest -n 2 \DEVICE\{B823930E-601D-46F7-88D9-436BFBCC6C8E} Option: NumberOfPackets = 2 Trying to access NDIS Device: \DEVICE\{B823930E-601D-46F7-88D9-436BFBCC6C8E} Opened device \DEVICE\{B823930E-601D-46F7-88D9-436BFBCC6C8E} successfully! Trying to get src mac address GetSrcMac: IoControl success, BytesReturned = 14 Got local MAC: 00:15:5d:86:28:10 DoWriteProc DoWriteProc: sent 100 bytes DoWriteProc: sent 100 bytes DoWriteProc: finished sending 2 packets of 100 bytes each DoReadProc DoReadProc: read pkt # 1, 100 bytes DoReadProc: read pkt # 2, 100 bytes DoReadProc finished: read 2 packets |
今回ご紹介する手順は以上です。
以上の内容がお役に立ちましたら幸いです。
WDK サポートチーム 津田