2017-01-11 50 views
1

Windowsでフィルタドライバを開発しています。ドライバはデバイス通知を受信するためにPnP対応であり、IOCTLを介して付随するusermodeサービスと通信する制御デバイスも作成します。要求に応じてプラグアンドプレイフィルタドライバを停止する方法はありますか?

私の知る限り、運転手の生涯はPnPマネージャによって制御されています。ドライバは、その時点までにドライバによって所有されているデバイスオブジェクトはないので、次のデバイス通知を処理した後にアンロードされます。

私がする必要があるのは、次のデバイスが到着/出発するときではなく、要求に応じてドライバを停止することです。これまでのところ、私はそれが動作するはずではないと思っています。一方、要求に応じてフィルタドライバをアンロードすることを禁じているロジックはありません。私はSTOPコントロールの送信を調査しましたが、PnPドライバでどのように処理できるかはわかりません(レガシードライバの場合のみ)。

今、私はすべてのデバイスオブジェクトを閉じる特別なIOCTLハンドラを追加するつもりです。しかし、それだけでは不十分です。ドライバーの生涯はPnPマネージャーによって管理されていますので、何とかマネージャーの「注意を」ドライバーに伝える必要があります。どんな助けもありがとう!

不思議なことに、私はドライバを停止可能にして、アンインストールで再起動する必要がないようにする必要があります。

答えて

0

WDMフィルタドライバは、常に自分のデバイスをデバイススタックに接続します。この後いくつかの別のデバイスはこのスタックに自分自身を添付することができます - それはあなたのデバイスに接続されます。このドライバは既にアンロードできません。

ドライバは、このため、それDRIVER_OBJECT への複数の参照を使用すると、デバイススタックから切り離す必要はありませんし、あなたのDEVICE_OBJECTsすべてを破壊した場合にのみアンロードすることができます。 IRP_MN_REMOVE_DEVICE - Removing a Device in a Filter Driverを読み取るか、またはをドライバにFastIoDetachDeviceと登録すると、FastIoDetachDeviceが呼び出されると、IoDeleteDeviceが呼び出されます(これは接続されたDeviceObject用です)。これはWDMフィルタドライバの正しい方法です。また、IRP_MN_REMOVE_DEVICEプロセスの間)。この時点で、IoDetachDeviceIoDeleteDeviceというコールが必要です。この後は、ドライバをアンロードすることができます.PnPマネージャは、ドライバへのDeviceObjectsやその他の参照がなくなると自動的にこれを行います。

アンロードWDMドライバのための1つのオプション - 完全な破棄device stack - 実行時にすべてのスタックを停止することはできません。 CM_Request_Device_Eject - は、デバイスが取り外し可能な場合、安全な取り外しのためにローカルデバイスインスタンスを準備します。デバイスを物理的に取り出すことができる場合は、そのデバイスになります。

関連する問題