私はWDMドライバーを書いています。物理デバイスを操作するのではなく、一種のフィルター ドライバーです。関係のない詳細はすべてスキップしたいと思います。要するに、問題は次のとおりです。
現在、ユーザー モード コンポーネントと通信するために、ルーチン内に 1 つのデバイス オブジェクトとシンボリック リンク ( IoCreateDevice
+ IoCreateSymbolicLink
)を作成しています。DriverEntry
私の目標は、必要に応じてデバイス オブジェクトを作成および削除できるようにすることです。これにより、複数のユーザー モード コンポーネントがドライバーと通信できるようになりますが、それらのコンポーネントごとに (このデバイス オブジェクトに関連付けられた) 個別のコンテキストが用意されます。必要に応じて ( 経由で) デバイス オブジェクトを作成および削除することだけを考えましIoDeleteDevice
た。しかし、ここで競合状態のにおいがします。
これが私のディスパッチ ルーチンとどのように同期されているのでしょうか。つまり、デバイスを削除するときに、実際にはそのデバイスの IRP を処理できます (ユーザーモードによって開始されます)。
この正確な状況を (少なくとも私が理解していることは) 説明しているこの記事を見つけました。
これはこれを解決するための意図した方法ですか?
編集:これまでのところ、言及された記事は私の問題を解決しません。私のドライバーはIoAcquireRemoveLock
、I/O を開始するたびに呼び出す必要があると書かれています。しかし、私の問題は異なります。I/O は、ユーザー モード -> I/O マネージャーに代わって開始されます。ディスパッチルーチンに到達するまで、これについては触れないようにします。
質問を別の言い方にします。IoDeleteDevice
デバイスと拡張機能をすぐに削除しますか? または、デバイスがまだ使用されているかどうかを確認しますか? もしそうなら - を呼び出す前IoDeleteDevice
、または後に拡張機能のクリーンアップを実行する必要がありますか、それともIRP_MJ_whatever
デバイス参照カウントが最終的にゼロになるのを待つ必要がありますか?
前もって感謝します。