ToasterサンプルのNotify.exeの使い方
皆さん、こんにちは。A寿です。
突然ですが、皆さんは、シーカヤックに乗っている時に転覆させられたことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。
さて、今回はToasterサンプルのNotify.exeの使い方をご紹介しようと思います。Notify.exeは、Toasterサンプルのデバイスの追加や削除を行うことができると同時に、デバイスが追加・削除されたことを、WM_DEVICECHANGEというメッセージとして受け取ることができるウィンドウアプリケーションのサンプルです。ToasterサンプルのNotify.exeは、
\WinDDK\{バージョン番号}\src\general\toaster\exe\notify
のフォルダにあります。notify.exe自体の説明は、\WinDDK\{バージョン番号}\src\general\toaster\readme.htmのExeの項目に、だいたい以下のようなことが書いてあります。
・Notify.exe:
このGUIアプリケーションはenum.exeとtoast.exeを組み合わせた機能を持つだけでなく、ユーザーモードでPnP通知を処理する方法を示しています。PnP通知について意味のある表示を得るためには、toastco.infを使って、toasterデバイスのためのcoinstallerをインストールしなければなりません。このexeの他の特徴としては、(デフォルトのtoasterのdevice idの代わりに)他の何らかのHW IDを指定して、ファンクションドライバとして他のドライバをロードさせることができます。
今回は、まずNotify.exeの使い方として下記の手順をご紹介します。デバイスの追加・削除のメッセージのやり取りについての実装については、別の機会にご紹介できればと思います。
■Notify.exeを使用するまでの手順:
(1) notify.exeのビルド
(2) busenum.sysのビルド
(3) toaster.sysのビルド
(4) tostrcls.dllのビルド
(5) tostrco1.dllのビルド
(6) busenum.sysをインストール
(7) toaster.sysをインストール
(8) notify.exeでtoasterデバイスを追加
(9) notify.exeでtoasterデバイスを削除
それでは、それぞれの手順についてご説明します。今回は、Windows 7 x86をテスト環境とし、WDKのバージョンは現時点で最新の7600.16385.1を使用します。
(1) notify.exeのビルド
まず、notify.exeをビルドする場合、notifyフォルダだけをどこか別のところにコピーしてビルドしようとしてもエラーします。
これは、sourcesの4行目に
INCLUDES=..\..\wdm\inc;$(DDK_INC_PATH); |
という記述がある通り、src\general\toaster\wdm\incフォルダが必要なためです。今回は、簡単のためにtoasterフォルダごとC:\の直下にコピーし、ここで必要なファイルをビルドしていきたいと思います。
Win7 x86 checkedのビルド環境を起動します。[スタート]-[すべてのプログラム]-[Windows Driver Kits]-[WDK 7600.16385.1]-[Build Environments]-[Windows 7]-[x86 Checked Build Environment]のコマンドプロンプトを管理者権限で起動します。
このビルド環境のコマンドプロンプトで、
> cd C:\toaster\exe\notify |
を実行し、notifyフォルダに移動します。
> build –cZ |
を実行してビルドします。
notifyフォルダの下の、objchk_win7_x86フォルダの下のi386フォルダの下に、notify.exeというアプリケーションができていれば成功です。
(2) busenum.sysのビルド
続いて、notify.exeがToasterデバイスの追加・削除のメッセージを受け取るために、Toasterドライバをビルドしていきます。
まずは、Toasterのバスドライバbusenum.sysをビルドします。今回は、KMDFではなくWDM版を使います。
ビルド環境のコマンドプロンプトで、
> cd C:\toaster\wdm\bus |
を実行し、WDM版Toasterサンプルのバスドライバのフォルダに移動します。
> build –cZ |
を実行してビルドします。
bus\objchk_win7_x86\i386フォルダの下に、busenum.sysというドライバができていれば成功です。
(3) toaster.sysのビルド
続いて、Toasterのファンクションドライバtoaster.sysをビルドします。
Toasterのファンクションドライバのソースは、toaster\wdm\funcに、以下の4種類存在します。
funcフォルダの下にreadme.htmがあるので、それぞれどのような内容になっているかを日本語訳してみます。
1. Incomplete1:
これはWDMドライバの最も単純な形です。これはシステムにインストールしてロードするのに必要な最小限の機能を示すものです。デバイスをオープンしたりRead/Writeしたりすることはできません。名前が示すとおり、これは、運用レベルのドライバとして使うのに十分なほど、完全でも安全でもありません。
2. Incomplete2:
このバージョンはincomplete1よりわずかに進歩しています。このバージョンはI/OのIRPの経路をたどったりドライバをアンロードするために安全に停止や削除のPnPリクエストを処理したりする方法を示しています。このサンプルは、リムーブロックを使う代わりに、より一般的な目的で使ったり、9xシステムとの互換性を持たせたりするために、独自のロックスキームを実装しています。登録されたインターフェースをユーザーモードからオープンしたり、Read/Write/IOCTLリクエストを送ったりできます。これはまだ不完全なサンプルです。なぜなら、電力IRPを処理しないし、バスドライバから要求される必須のS(システム)からD(デバイス)への電力IRPの変換もしないからです。
3. Featured1:
これは完全なバージョンで、十分に電源管理とWMIをサポートしています。
4. Featured2:
このバージョンはfeatured1がサポートする全ての機能に加え、Wait-wakeサポートとEvent Tracingサポートを含んでいます。
今回はFeatured1フォルダをビルドします。
ビルド環境のコマンドプロンプトで、
> cd C:\toaster\wdm\func\featured1 |
を実行し、WDM版Toasterサンプルのファンクションドライバのフォルダに移動します。
> build –cZ |
を実行してビルドします。
featured1\objchk_win7_x86\i386フォルダの下に、toaster.sysというドライバができていれば成功です。
(4) tostrcls.dllのビルド
続いて、tostrcls.dllというToasterドライバのクラスインストーラをビルドします。
クラスインストーラとは、特定のDevice Setup Classに属するデバイスのドライバをインストールする場合の共通の処理をまとめた、Win32 DLLです。この用語の説明については、下記ドキュメントをご参照ください。
Windows Driver Kit: Glossary
C
https://msdn.microsoft.com/en-us/library/ff556274(VS.85).aspx
class installer
A Win32 DLL that performs installation operations for devices in a particular Device Setup Classes. For more information see the topic, Writing a Class Installer.
tostrcls.dllの説明は、toaster\readme.htmに、
Classinstaller - Used to customize or provide additional properties to all the devices that plug to toaster bus.
とあります。
tostrcls.dllと次の(5)のtostrco1.dllが必要な理由は、冒頭のようにnotify.exeを使うためにtoastco.infが必要で、かつ、func\readme.htmに、以下のように書いてあるためです。
・If you use toaster.inf, you need any one version of toaster.sys & tostrcls.dll.
・If you use toastco.inf to install, you also need tostrco1.dll.
ビルド環境のコマンドプロンプトで、
> cd C:\toaster\classinstaller |
を実行し、Toasterサンプルのクラスインストーラのフォルダに移動します。
> build –cZ |
を実行してビルドします。
classinstaller\objchk_win7_x86\i386フォルダの下に、tostrcls.dllというDLLができていれば成功です。
(5) tostrco1.dllのビルド
続いて、tostrco1.dllというToasterドライバのCo-installer(共同インストーラ)をビルドします。
Co-installerとは、インストール時にサードパーティ様独自の処理を、Class Installerに追加したい場合に実装されるWin32 DLLです。
この用語の説明については、下記ドキュメントをご参照ください。
Windows Driver Kit: Glossary
C
https://msdn.microsoft.com/en-us/library/ff556274(VS.85).aspx
co-installer
A co-installer is a Microsoft Win32 DLL that augments the device installation operations performed by a class installer. Co-installers can be class-specific (class co-installers) or device-specific (device co-installers).
また、tostrco1.dllの説明は、toaster\readme.htmに、
Coinstaller - Used to customize the installation of a specific instance of a device. It can also used to configure device properties through device-manager property page.
とあります。
ビルド環境のコマンドプロンプトで、
> cd C:\toaster\coinstaller |
を実行し、Toasterサンプルのクラスインストーラのフォルダに移動します。
> build –cZ |
を実行してビルドします。
coinstaller\objchk_win7_x86\i386フォルダの下に、tostrco1.dllというDLLができていれば成功です。
(6) busenum.sysをインストール
必要なファイルがすべてビルドできましたので、Windows 7 x86のテストマシンにインストールします。
まず、インストールに必要な、以下の場所にあるファイルを、C:\testにコピーします。
C:\toaster\classinstaller\objchk_win7_x86\i386\tostrcls.dll
C:\toaster\coinstaller\objchk_win7_x86\i386\tostrco1.dll
C:\toaster\exe\notify\objchk_win7_x86\i386\notify.exe
C:\toaster\wdm\bus\objchk_win7_x86\i386\busenum.sys
C:\toaster\wdm\func\featured1\objchk_win7_x86\i386\toaster.sys
C:\toaster\wdm\inf\i386\bus.inf
C:\toaster\wdm\inf\i386\toastco.inf
C:\WinDDK\7600.16385.1\tools\devcon\i386\devcon.exe
管理者権限でコマンドプロンプトを起動し、そこで、
> cd C:\test > devcon install bus.inf "root\busenum" |
を実行します。
今回は簡単のためにドライバ用のデジタル署名を用意していないので、下図のような警告が出ますが、そのままインストールします。
コマンドプロンプト上に下記のメッセージが出ればOKです。
C:\test>devcon.exe install bus.inf "root\busenum" Device node created. Install is complete when drivers are installed... Updating drivers for root\busenum from C:\test\bus.inf. Drivers installed successfully. |
デバイスマネージャーで下図のようにシステムデバイスの下にToaster Bus Enumeratorのデバイスが表示されます。
(7) toaster.sysをインストール
続いてtoaster.sysをインストールします。
デバイスマネージャーで、[操作]→[レガシハードウェアの追加]をクリックすると、「ハードウェアの追加」の画面が出ます。
この画面で、「一覧から選択したハードウェアをインストールする(詳細)」→「すべてのデバイスを表示」→「ディスク使用」→「参照」→C:\test\toastco.infを選択→Microsoft Toaster With Coinstallerを選択、と進めます。
インストールの途中で、busenum.sysのインストール時と同様に、警告ダイアログが表示されますが、今回は気にせず、そのままインストールします。
最後の「ハードウェアの追加ウィザードの完了」画面で、「次のハードウェアがインストールされました」として、Microsoft Toaster With Coinstallerが表示されればOKです。
最後に、「完了」を押します。
これにより、デバイスマネージャーで下図のようにToasterの下にMicrosoft Toaster With Coinstallerのデバイスが表示されます。
余談ですが、Microsoft Toaster With Coinstallerを右クリックして[プロパティ]を選択すると、下図のように、Custom Property Pageのタブがあります。このようなプロパティページをカスタマイズできるのがCo-installerである、ということについて、少しでもイメージをつかんでいただければ幸いです。
(8) notify.exeでtoasterデバイスを追加
これでnotify.exeを使う準備ができました。
エクスプローラでC:\testに移動し、管理者権限でnotify.exeを起動します。
下図のようなウィンドウが表示されます。
下図のようにメニューから[Bus]-[PlugIn]を実行します。
すると、下図のようにPlug In Deviceというウィンドウが出ます。
Serial Number:に1を入れてOKを押します。
アプリ内に下図のようにメッセージが追加されます。
デバイスマネージャーでは、下図のように、Toasterの下にToasterDevice01というデバイスが追加されたことが確認できます。
(9) notify.exeでtoasterデバイスを削除
今度は、notify.exeで、デバイスを削除してみます。
メニューから[Bus]-[UnPlug(Surprise Removal)]を実行します。
すると、下図のようにEnter SerialNo of the deviceというウィンドウが出ます。
この Serial Number:に1を入れてOKを押します。
アプリ内に下図のようにメッセージが追加されます。
デバイスマネージャーでは、Toasterの下からToasterDevice01というデバイスが削除されたことが確認できます。
――――――――――――――――
【閑話休題】皆さんは、シーカヤックに乗っている時に転覆させられたことはありますか?
皆さんは、シーカヤックに乗っている時に転覆させられたことはありますか?・・・いいえ、事件ではありません。れっきとしたシーカヤック教室のカリキュラムです。
数年前、千葉の勝浦にあるシーカヤック教室に2回行きました。2回とも友人たちと行ったのですが、私も友人たちも一人乗りのシーカヤックに乗りました。1回目の初心者クラスでは、海岸のすぐそばにある、ものすごく小さな島の周りを漕いでいったり、沖の方で小さな波と波の間を渡って行ったり、非常に楽しかったです。なので、2回目は、1回目とは別の友人を誘っていき、私以外の友人は初心者コース、私は中級者コースを選択しました。その中級者コースでは、最初に、先生から「今回はカヤックをひっくり返しますので、海中からの脱出の練習をします」ということで、事前の説明を受けていました。その後、実際にレッスンが始まって、シーカヤックで海上に出てから、先生が遠いところから私に何やら話しかけたかと思うと、スイーッとシーカヤックで近寄ってきました。何を言っていたかよく聞こえなかったので、 「何が始まるんだろう?」と思っていた矢先、いきなり世界の上下が180度反転しました。一瞬何が起こったかわからず、しかも、海中で息もできない状態で体をひねっても船から逃げられず、一瞬パニックに陥りかけました。しかし、逃げられないのは、シーカヤックでは、通常、波などによって船内に水が入らないよう、船の乗り込み口を自分の服で密閉するようにしているためです。先生から事前に脱出方法については説明を受けていたので、それにしたがって無事脱出できました。皆さんも、海上で誰かから何か話しかけられて、それが聞き取れなかったにもかかわらず、相手が近づいてきた時は、ご注意ください。