トップ回答者
BulkUSBサンプルについて

質問
-
使用しているDDKは、Microsoft® Windows® XP Service Pack 1 DDKです。
ターゲットはXPです。
この中のBulkUsbサンプルを使用してドライバを制作しています。GUIDは別に生成しましたが、WMIのGUIDはそのままです。
問題は、デバイスマネージャのツリーには登録されますが、タスクトレイには取り外しアイコンが表示されません。取り外しウィンドウにも表示されません。
しかし、ユーザーモードアプリからは、呼び出して、Bulk R/W等の動作をさせることができています。ただ、R/Wを繰り返す(回数はまだわかりません。)とリソース不足が
発生します。(一応タスクマネージャで監視しながら実行していますが、メモリリークは無さそうです。たぶん)あと、ハードウェアは、一応実績があります。- 移動 Mike Wang (MSCS) 2012年10月2日 12:24 (移動元:Windows デバイスドライバー開発)
回答
-
>問題は、デバイスマネージャのツリーには登録されますが、タスクトレイには取り外しアイコンが表示されません。
IRP_MN_QUERY_CAPABILITIES リクエストでの、DEVICE_CAPABILITIES 構造体 SurpriseRemovalOK メンバの値を確認されては?
下記ドキュメントに、「ハードウェアの安全な取り外し」 (Safely Remove Hardware) での表示と DEVICE_CAPABILITIES 構造体に関する記述があるので参考になるかも。以下、抜粋です。。。
------------------------------
デバイスが SurpriseRemovalOK 機能が FALSE に設定されている 1 つ以上の Devnode を持つ場合、
Windows は「ハードウェアの安全な取り外し」一覧にそのデバイスを含めます。
言い換えると、デバイスのすべての Devnode に対して SurpriseRemovalOK 機能が TRUE に設定されている場合、
そのデバイスは「ハードウェアの安全な取り外し」一覧に表示されません。SurpriseRemovalOK 機能は、
ハードウェアの安全な取り外しが適用されるデバイスの境界を定義します。
------------------------------(Windows 7 でのマルチ ファンクション デバイスに関連するドキュメントですけど、基本的なロジックは同じでは...と勝手に思い込んでいますが。)
- 回答としてマーク ねう 2009年12月15日 0:21
すべての返信
-
> 使用しているDDKは、Microsoft® Windows® XP Service Pack 1 DDKです。
随分と古いDDKですね。Connectで現在配布(Archiveも含めて)している以下ののいずれかを利用することをお勧めします。
-7600 WDK 7.0.0
-6001.18002 - WDK for Windows Server 2008
-6000 - WDK for Vista
-1830 - DDK for Windows Server 2003 SP1
>ターゲットはXPです。
ならばWDK 7.0.0を使うべきです。ただしBulkUSBのサンプルが無くなりました。UsbSampがその後継的な役割ですが、他にもいくつかサンプルがあります。
>タスクトレイには取り外しアイコンが表示されません。
それはよくある話です。ドライバだけでなく、実行しているそのPC固有の問題が原因の場合もあります。
>R/Wを繰り返す(回数はまだわかりません。)とリソース不足が発生します。
おそらくですが、これはまた別の問題ではないでしょうか。ドライバをきちんとデバッグすれば良いと思います。 -
返信ありがとうございます。
やっぱり、UsbSampをひもとく必要がありそうですね。
上記デバッグをするまで、win2k DDKのサンプル、柏野氏のUUSBDで上記ドライバを制作して動作させていまして、これらのドライバでは、取り外しアイコンが表示され、リソース不足もありません。
現在私の環境では、アイコンが表示される場合は、AddDevice後、デバイスStartし、マイナーリクエスト3個処理後のExQueueWorkItem中に、取り外しアイコンが出現するようになっていますが、取り外しアイコンが表示されない場合も同じシーケンスをたどることはわかっています。ということは、AddDevice、デバイスStart中のどこかで、取り外しアイコンを出さないような設定がなされていると思われますが、それがどこかわかりませんでしたので、上記のような質問となった次第です。
ドライバを新しくしようとUsbSampも参考にしようとしましたが、WDFに対して躊躇してしまい、過去の形に近いBulkUsbを改造してみましたが、上記のような結果になってしまったしだいです。
これから、UsbSampをひもといてみます。
ありがとうございました。 -
>問題は、デバイスマネージャのツリーには登録されますが、タスクトレイには取り外しアイコンが表示されません。
IRP_MN_QUERY_CAPABILITIES リクエストでの、DEVICE_CAPABILITIES 構造体 SurpriseRemovalOK メンバの値を確認されては?
下記ドキュメントに、「ハードウェアの安全な取り外し」 (Safely Remove Hardware) での表示と DEVICE_CAPABILITIES 構造体に関する記述があるので参考になるかも。以下、抜粋です。。。
------------------------------
デバイスが SurpriseRemovalOK 機能が FALSE に設定されている 1 つ以上の Devnode を持つ場合、
Windows は「ハードウェアの安全な取り外し」一覧にそのデバイスを含めます。
言い換えると、デバイスのすべての Devnode に対して SurpriseRemovalOK 機能が TRUE に設定されている場合、
そのデバイスは「ハードウェアの安全な取り外し」一覧に表示されません。SurpriseRemovalOK 機能は、
ハードウェアの安全な取り外しが適用されるデバイスの境界を定義します。
------------------------------(Windows 7 でのマルチ ファンクション デバイスに関連するドキュメントですけど、基本的なロジックは同じでは...と勝手に思い込んでいますが。)
- 回答としてマーク ねう 2009年12月15日 0:21
-
ねうさん、こんにちは。
解決したそうで、何よりです。
たぶん英語力に関しては私の方がメタメタだと思いますが、たまたま Safely Remove Hardware Dialog と IRP_MN_QUERY_CAPABILITIES の関係を知っていたので。「デバイスの境界」は、おそらく個々の DevNode のことを指しているんじゃないかなと思います。
例えば、USB メモリを挿して「ハードウェアの安全な取り外し」ダイアログ ([デバイス コンポーネントを表示する]をチェック) を表示させると、
デバイスは1つでも下記の様なツリー状で複数のデバイス名が出てきますよね?---------------------------------
+ USB 大容量記憶装置
+ USB 2.0 Flash Drive USB Device
+ 汎用ボリューム - (F:)
---------------------------------上記の場合、各 DevNode が以下の様なデバイス クラスで構成されていることを意味してるんだと思います。
---------------------------------
+ USB デバイス クラス
+ DiskDrive デバイス クラス
+ Volume デバイス クラス
---------------------------------WDM の階層構造で考えた場合、各 DevNode はそれぞれ独立したデバイス スタックを構成しているから、
上記例の場合以下の様な PDO を基底としたデバイス スタック構成になると思います。
(デバイス スタックによっては当然フィルタ ドライバも介在してくるので、その意味ではあまり正確な表現では無いかもしれませんが。)---------------------------------
+ usbstor デバイス スタック
+ disk デバイス スタック
+ volmgr (ftdisk?) デバイス スタック
---------------------------------つまりデバイスが1つだけでも、その機能を実現するためには、階層構造状の異なる複数の DevNode から構成されるわけで、
「デバイスの境界」は「どの DevNode まで」を適用するのか。。。と言うこではないかと。