デバイスの追加・削除の通知をアプリケーションで受け取る方法

皆さん、こんにちは。A寿です。   突然ですが、皆さんは、かつお節を使った和食の「本物の味」を味わったことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。   さて、今回は、デバイスの追加・削除の通知をアプリケーションで受け取る方法をご紹介しようと思います。前回の私の記事で、ToasterサンプルのNotify.exeの使い方をご紹介しました。その記事で、Notify.exeでToasterデバイスを追加・削除した場合に、Notify.exeのウィンドウに、対応するメッセージが表示されていました。今回は、Toasterデバイスが追加・削除されて、Notify.exeのウィンドウに、対応するメッセージが表示されるまでに、Notify.exe(アプリ側)とToaster.sys(ドライバ側)それぞれに必要となる実装について見ていきたいと思います。   まず、Notify.exeがToaster.sysから受け取る通知には以下の2種類があります。 (A) デバイスインターフェイスに関する通知 (B) デバイスハンドルに関する通知   それぞれについて、以下の3つの処理があります。 (1) 通知の受け取りの開始(登録) (2) 通知の受け取り (3) 通知の受け取りの終了(登録解除)   Notify.exeの操作と、(A),(B)それぞれの(1)~(3)の処理は、以下の表のような関係になります。   Notify.exe の操作 起動 (ウィンドウの作成) デバイス 追加 デバイス 削除 終了 (ウィンドウのクローズ) (A) (1) (2) (2) (3) (B) ((1)(※)) (1) (2),(3)   (※:Notify.exe起動前に、すでにToasterデバイスが追加されていた場合。)   それでは、(A)から順番に、(1)~(3)の通知についてNotify.exeとToaster.sysの処理を見ていきましょう。(以下の説明は、可能であれば、ソースコードを見たり、実機やデバッガを動かしたりしながら、お読みいただければ幸いです。)   (A) デバイスインターフェイスの場合   (1) 通知の受け取りの開始(登録)   アプリケーション側で、通知の受け取りを開始するためには、RegisterDeviceNotification()のAPIを使います。後程説明しますが、デバイスインターフェイスだけでなく、デバイスハンドルもこの関数を使います。   Notify.exeでは、ウィンドウが作成されるタイミングで、toaster.sysのデバイスインターフェイスに対して、RegisterDeviceNotification()を呼びます。…


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…


Device Object と Device Stack

こんにちは、K里です。今回は、以前の記事で紹介しました WDM (Windows Driver Model) ドライバのデバイス オブジェクトとデバイス スタックについて説明します。 デバイス オブジェクトWindows OS は、システムに接続される全てのデバイスをデバイスオブジェクトという情報を用いて制御します。各デバイスには、1 つ以上のデバイス オブジェクトが関連付けられていて、デバイスの操作は、このオブジェクトを対象に機能します。カーネルモードドライバは、デバイスに対して少なくとも 1 つ以上のデバイス オブジェクトを作成することになります。実際のソースコードレベルでは、デバイスオブジェクトは、DEVICE_OBJECT 構造体として wdm.h に定義されています。DEVICE_OBJECT 構造体で定義されている各メンバについては、下記サイトをご覧ください。 DEVICE_OBJECT Structurehttp://msdn.microsoft.com/en-us/library/ff543147(VS.85).aspx また、デバイスオブジェクトは、ドライバに応じて以下のように 3 種類のオブジェクトに分類されます (データ自体は、全て上記 DEVICE_OBJECT 構造体になります)。 Physical Device Object (PDO): バスドライバに対するデバイス オブジェクトFunctional Device Object (FDO): ファンクションドライバに対するデバイス オブジェクトFilter Device Object (filter DO): フィルタドライバに対するデバイス オブジェクト なお、例外として、クラスドライバやポートドライバに関連付けられるミニ(クラス/ポート)ドライバでは、デバイスオブジェクトを作成しない場合があります。また、逆に特定デバイスクラスのミニドライバ (NDIS ミニポートドライバや USB ミニポートドライバなど) では、自身がデバイス オブジェクトを作成し、クラスドライバやポートドライバが作成しない場合もあります。 デバイス スタックとドライバ…


Printer Driver Isolation

こんにちは、A尾です。 前回の予告通り、今回は Windows 7 よりサポートされた Printer Driver Isolation についてお話しさせていただきます。   Windows 7 以前の Windows OS では、プリント プロセッサやプリンタ ドライバはスプーラ サービスのプロセス上にて動作していましたが、Windows 7 以降では、Printer Driver Isolation により、これまでスプーラサービス上で動作していたプリント プロセッサやプリンタ ドライバをスプーラ サービス以外の別プロセス上にて動作させることが出来るようになりました。これまでは印刷時のプリントプロセッサやプリンタ ドライバの動作に起因してスプーラ サービスが落ちてしまっていたような状況においても、この機能にてプロセスを分離させることで、スプーラ サービスが落ちてしまうのを回避できるようになりました。(RAW スプーリングの場合はこれまで通り、プリンタ ドライバはアプリケーション プロセスから呼ばれます。) 開発環境やスタンド アロン環境ではあまり恩恵を受けることはあまりないかもしれませんが、プリント サーバーなどのスプーラ サービスが意図せず終了してしまう状況が許されない環境では重宝される機能かと思います。     ■ プロセス分離モードについて Printer Driver Isolation には、「なし」「共有」「分離」の3つのモードがあり、プリンタドライバごとに設定が可能です。   「なし」 プロセスの分離を行いません。 これまで通りスプーラ サービス上にてプリント プロセッサやプリンタ ドライバが呼び出されます。   「共有」 プロセスの分離を行います。…


Windows の Network Driver

お久しぶりです。さなえすです。8月ももう終わりですね。 私事ですが、この間の週末は高円寺の阿波踊りに「マイクロソフト連」として参加させていただきました。“Windows 7”  を掛け声に踊ったんですけど、腕も足も痛いし、汗は目に入るしで大変でした。最後まで頑張れたのは、沿道のみなさんから「マイクロソフトぉ~頑張れ~!」「せぶんせぶんせぶん~」と温かい声援をかけていただいたおかげです。お祭りを通じて、地域のみなさんとの距離がぐっと近くなる感じが、とっても良かったです♪ さて、皆さまのこの夏の思い出は何でしたか?   今日は、ずーっと書きたいなと思っていたトピック、ネットワークについて書こうと思います。Windows のネットワークに含まれるトピックは沢山あります。なので、その中でドライバーだけを取ってみても……やっぱり沢山あります。私が、初めて Windows の ネットワークドライバーの世界に触れた時、ドライバーの名称だけでも様々なものがあると感じました。例えば、ミニポートドライバー・NICドライバー・LANドライバー、ネットワーク フィルタードライバー、中間層ドライバー、TDI ドライバー、プロトコル ドライバー、…………などなど、たくさんありますが、少しずつお伝えできればいいなと思っています。     今日はまず、「NDIS ドライバー」のお話。   この Blog を書くにあたって、Windows Internals 5th Edition を参照したところ、NDISライブラリー含め、NDIS スタック上で動作するドライバーのことをまとめて「NDIS ドライバー」と称していました。このBlogでもそう呼ばせてもらおうと思います。ちなみにですが、NDISと書いて、通常「エヌディス」と読みますよ。     ●NDIS ライブラリー (Ndis.sys) まず、Windows 上のネットワークドライバーを理解する上で、大きなポイントとなるのが NDISです。NDIS とは、Network Driver Interface Specification の略で、1989年に3Comとマイクロソフトによって共同で開発された、読んで字の如く、ネットワーク ドライバーにおけるインターフェースの仕様です。Windows 上では、NDIS ライブラリー(※ 仕様自体と分けるため NDIS ライブラリーと明記しましたが、以降 NDIS と称します)として実装されていて、実際のファイルは Drivers フォルダーの下にあります (\%SystemRoot%\System32\Drivers\Ndis.sys)。   NDISでは OSI参照モデル…


デバイス ドライバーの選ばれ方

 久方ぶりです。まさかたです。  今回は、Windows がどのようにインストールするドライバーを選んでいるのかについて、特に Windows 7 で変わった点にフォーカスして、お話したいと思います。 まず、PC に新しいデバイスが接続されると、PnP が発生してドライバーのインストールが行われるわけですが、その背後で Windows はさまざまな場所からドライバーを検索して、できるだけ最適なドライバーをインストールしようとします。 この時のドライバーを探してくる場所とその優先順位や、その中からどのドライバーが最適であるかを判断する基準となる ”ランキング” の決め方などは、Windows のバージョンアップとともに少しずつ改善が加えられてきました。 例えば、ドライバーを検索してくる場所と優先順位という点では、Windows 7 と Windows Vista を比較すると、以下のような違いがあります。   ²  Windows Vista の場合 1.    Driver Store 2.    Device Path 3.    Windows Update 4.    Prompt for Media   ²  Windows 7 の場合 1.    Windows Update 2.    Device Path 3.    Driver Store   -     …


印刷時のスプーリングについて(その2)

こんにちは、A尾です。 色々とバタバタとしておりまして、しばらくぶりとなってしまいました。申し訳ありません。 前回はローカルにインストールしたプリンタで印刷した際のスプーリングについてお話ししました。今回は Point and Print によりインストールしたプリンタで印刷した際のスプーリング動作についてお話ししたいと思います。   Point and Print によるインストールについてですが、Point and Print によるインストールとはプリント サーバー等のネットワーク上の PC から共有されているプリンタを、他のクライアント PC から接続してインストールすることを言います。具体的には、主に以下の3つの方法があります。   1.エクスプローラのネットワークコンピュータ上に表示される共有プリンタ (アイコン) をダブルクリックするか、もしくは右クリック→[接続] を選択してインストール。 2.プリンタの追加ウィザードから、リストアップされたネットワーク上の共有プリンタを選択するか、プリンタ名 \\<サーバー PC 名>\<プリンタ共有名> を直接指定してインストール。 3.AddPrinterConnection API からインストール。   Point and Print によりインストールしたプリンタの場合も、ローカルにインストールしたプリンタと同様に、RAW スプーリングと NT EMF スプーリングがあります。 ただ、印刷を行う PC とプリンタにデータを転送する PC が異なりますので、NT EMF スプーリングの場合には、NT EMF スプール ファイルの再生をクライアント PC 上で行うか、サーバー PC…


ClasFiltサンプルINFにアンインストール処理を追加する

皆さん、こんにちは。A寿です。   突然ですが、皆さんは乗った船の船頭さんに船から引きずり落とされそうになったことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。   さて、前回の私の記事では、ClasFiltサンプルINFファイルをご紹介しました。このINFファイルには、お気づきの方もいらっしゃるかと思いますが、INFそのものにはアンインストールの方法は記述されておりません。そこで、今回は、ClasFiltサンプルINFファイルにアンインストール処理を追加する方法をご紹介しようと思います。   追加の手順の概要は以下の通りです。 (1) INFファイルに[DefaultUninstall]セクションを追加     (1-1) DelFilesディレクティブを追加     (1-2) DelRegディレクティブを追加 (2) INFファイルに[DefaultUninstall.Services]セクションを追加   それでは、それぞれの手順についてご説明します。   (1) INFファイルに[DefaultUninstall]セクションを追加 [DefaultUninstall]セクションは、アンインストール時の起点となるセクションです。ここには、[DefaultInstall]セクションの内容を削除する処理を記述します。前回の私の記事のClasFilt.inf(cdrupper.inf)の[DefaultInstall.NT]セクションは、以下のようになっています。   31 [DefaultInstall.NT] 32 ; 33 ; DefaultInstall section is used to install the class filter driver. Use .NT platform extension so this 34 ; section won’t be executed on Windows 9x/ME….


USB Event Tracing for Windows 7

— UPDATE 2010/07/09 — 2010/06/24 に Network Monitor v3.4 がリリースされました。これに伴い、USBHUB / USBPORT の Parser ファイルはデフォルトで組み込まれることになり、Codeplex より Parser をダウンロードし、手動で追加する必要がなくなりました。ご確認いただければ幸いです。 ——————————– こんにちは、K里です。 今回は、Windows 7 で対応された USB イベントトレースログについてご紹介します。こちらの機能は、各 USB クラスにおけるデバイスドライバを開発されていたり、システム全体の評価を行う時に USB 周りで何か問題が発生した場合のトラブルシューティングする必要のある方が対象となります。USB イベントトレースログは、ETW (Event Tracing for Windows) 機能を使用し、対象モジュールを Checked Build 版に置き換えることなくトレースログを採取します。また、採取したログファイル (etl ファイル) は、Network Monitor を使用して解析することが可能です。なお、USB トレースログの各情報を解析するためには、USB に関する仕様について包括的に理解しておくことが前提となります。   トレース対象モジュール: Windows 7 で登録されているトレースプロバイダーは、以下の 2 つになります。   Ø  Microsoft-Windows-USB-USBHUB …


Windows Driver Kit (WDK) Version 7.1.0 がリリースされました

こんにちは。なおきお~です。    みなさま、すでにご存知かもしれませんが、先月の 2010 年 2 月 26 日に WDK 7.1.0 がリリースされました。            Windows Driver Kit (WDK) Version 7.1.0 のリリース ノート – WDK Version 7.1.0 の変更点および問題点 http://www.microsoft.com/japan/whdc/devtools/wdk/RelNotesW7.mspx#E1   WDK 7.0.0 からの主な変更点として、WDK を Windows XP x64 にもインストールできるようになったことが、変更の 第 1 点として挙げられると思います。 また、同梱されている Windows 用デバッグ ツール (Debugging Tools for Windows) のバージョンも、最新の 6.12.2.633 になりました。          Debugging…