1

WDK7 の Microsoft Toaster のサンプル コードを調べていると、微妙な問題が見つかりました。

現在、Windows 7 でコンパイル済みドライバー (WDM busenum および WDM featuring1) を試しています。

READMEenum -p 1に従ってトースター デバイスを追加し、デバイス マネージャー (devmgmt) を開き、デバイスを見つけてアンインストールします。

devmgmt.msc からトースター デバイスをアンインストールします。

これにより、トースターのdevnodeが破壊されます(私は信じています)。ToasterDevice01ノードがデバイス マネージャーから消えていることがわかります。!devnode 0 1State=DeviceNodeUninitialized (0x301)、Previous State=DeviceNodeRemoved (0x312) のトースター devnode がまだ存在することを示しています。

次に、enum -p 1再度デバイスを追加しようとして実行します。しかし、エラー 0x57(ERROR_INVALID_PARAMETER) が発生しました。

enum -p 1 、0x57 エラーが発生しました

ソース コードをデバッグし、その理由を特定しましたbuspdo.c。devmgmt の無効化操作とアンインストール操作を区別していません。彼のコード ロジックは次のとおりです。

  • toaster がサプライズリムーブ( ) を取得した場合、どちらが正しい動作であるかをenum -u 1呼び出します。Bus_DestroyPdo()
  • toaster が devmgmt から Disabled になった場合、それはを呼び出しませBus_DestroyPdo()。これも正しいです。

問題は、エンド ユーザーが devmgmt からアンインストールを実行すると、Disable パスをたどるということです。ここで悪いことが起こります: Windows はトースター devnode を削除しますが、トースター バス ドライバーは対応する PDO を破棄しませenum -p 1Bus_PlugInDevice()。ユーザーリクエスト。

ここに画像の説明を入力

ところで:トースターのKMDFバージョンは同様の問題を示しています(今日は静的列挙バージョンのみが試行されました)

これで私の質問は明確になりました。無効化とアンインストールをどのように区別できますか?バス ドライバーまたは子デバイス ドライバーでそれを行う必要がありますか? KMDF版の回答も大歓迎です。

4

1 に答える 1