WDK7 の Microsoft Toaster のサンプル コードを調べていると、微妙な問題が見つかりました。
現在、Windows 7 でコンパイル済みドライバー (WDM busenum および WDM featuring1) を試しています。
READMEenum -p 1
に従ってトースター デバイスを追加し、デバイス マネージャー (devmgmt) を開き、デバイスを見つけてアンインストールします。
これにより、トースターのdevnodeが破壊されます(私は信じています)。ToasterDevice01ノードがデバイス マネージャーから消えていることがわかります。!devnode 0 1
State=DeviceNodeUninitialized (0x301)、Previous State=DeviceNodeRemoved (0x312) のトースター devnode がまだ存在することを示しています。
次に、enum -p 1
再度デバイスを追加しようとして実行します。しかし、エラー 0x57(ERROR_INVALID_PARAMETER) が発生しました。
ソース コードをデバッグし、その理由を特定しましたbuspdo.c
。devmgmt の無効化操作とアンインストール操作を区別していません。彼のコード ロジックは次のとおりです。
- toaster がサプライズリムーブ( ) を取得した場合、どちらが正しい動作であるかを
enum -u 1
呼び出します。Bus_DestroyPdo()
- toaster が devmgmt から Disabled になった場合、それはを呼び出しません
Bus_DestroyPdo()
。これも正しいです。
問題は、エンド ユーザーが devmgmt からアンインストールを実行すると、Disable パスをたどるということです。ここで悪いことが起こります: Windows はトースター devnode を削除しますが、トースター バス ドライバーは対応する PDO を破棄しませenum -p 1
んBus_PlugInDevice()
。ユーザーリクエスト。
ところで:トースターのKMDFバージョンは同様の問題を示しています(今日は静的列挙バージョンのみが試行されました)
これで私の質問は明確になりました。無効化とアンインストールをどのように区別できますか?バス ドライバーまたは子デバイス ドライバーでそれを行う必要がありますか? KMDF版の回答も大歓迎です。