デバイス停止要求の処理
デバイスのドライバーにデバイスの停止を要求する前に、PnP マネージャーがドライバーにデバイスの停止が良いアイデアかどうかを尋ねる状況が 2 つあります:
ユーザーが新しいデバイスを接続すると、PnP マネージャーは、新しいデバイスに対応するためにシステムのハードウェア リソースを再配分する必要があります。
ユーザーがデバイスを取り外したいと意思表示した。
ドライバーでこれらの状況に対処するには、いくつかの方法があります:
デバイスが特殊なファイルをサポートしているために、ドライバーがWdfDeviceSetSpecialFileSupport を呼び出した場合、そしてデバイスで特殊なファイルが開かれている場合、フレームワークはデバイスの停止を許可しません。
比較的短時間のすべての停止を一時的に防ぐために、ドライバーは WdfDeviceSetStaticStopRemoveを呼び出すことができます。
各停止試行を個別に評価して処理するために、ドライバーはEvtDeviceQueryStop と EvtDeviceQueryRemove コールバック関数を提供できます。
デバイスが特殊なファイルをサポートしていない場合、そしてデバイスの停止または取り外しがドライバーまたはデバイスにとって決して問題にならない場合、ドライバーはEvtDeviceQueryStopとEvtDeviceQueryRemove コールバック関数を提供せず、WdfDeviceSetStaticStopRemoveを呼び出しません。 この場合、PnP マネージャーは常に、ドライバーが許可するかどうかを確認する最初のチェックなしでデバイスを停止します。
リソースの再配分
PnP マネージャーがシステムのハードウェア リソースを再配分する必要がある場合があります。 通常、この再配分は、バス ドライバーから新しいデバイスが接続されたことが報告され、新しいデバイスには既に割り当てられたリソースが必要であるために発生します。 リソースを再び割り当てる前に、デバイスを停止する必要があります。
ドライバーがPnP マネージャーによるビジー状態のデバイスの停止を時々防止する必要がある場合、ドライバーはEvtDeviceQueryStopコールバック関数を提供できます。 ドライバーのEvtDeviceQueryStopコールバック関数がエラー状態値を返す場合、PnP マネージャーはデバイスを停止しません。
ドライバーがデバイスを停止しても安全であると判断した場合、コールバック関数はSTATUS_SUCCESSを返します。 デバイスの他のドライバーのいずれも停止を妨げない場合、PnP マネージャーはデバイスを一時的に停止します。
PnP マネージャーがデバイスを停止してリソースを再配分するときに、フレームワークがドライバーのイベント コールバック関数を呼び出す順序については、The PnP Manager Redistributes System Resourcesをご参照ください。
ユーザーがデバイスを取り外し、または無効にします
ユーザーは、一部のデバイスを取り外し、または無効にすることができます。 次に例を示します。
ドライバーがデバイスのWDF_DEVICE_PNP_CAPABILITIES構造のRemovableメンバー ( SurpriseRemovalOKメンバーではない) を設定している場合、ユーザーは、アンプラグまたはイジェクトハードウェアプログラムを実行し、デバイスのアンプラグまたはイジェクトを行うことができます。
ドライバーがデバイスWDF_DEVICE_STATE構造のNotDisableableメンバーを設定していない場合、ユーザーはデバイス マネージャーを使用してデバイスを無効にすることができます。
このような場合、PnP マネージャーは、ユーザーがデバイスを取り外す前にデバイスの停止を試みます。
ドライバーがビジー状態のデバイスの取り外しを時々防止する必要がある場合、ドライバーは EvtDeviceQueryRemoveコールバック関数を提供できます。 ドライバーのEvtDeviceQueryRemove コールバック関数がエラー状態値を返す場合、PnP マネージャーはデバイスを停止しません。
ドライバーがユーザーがデバイスを取り外しても安全であると判断した場合、コールバック関数はSTATUS_SUCCESSを返します。 デバイスの他のドライバーのいずれも取り外しを妨げない場合、PnP マネージャーはデバイスを停止します。
取り外すためにデバイスを停止するときにフレームワークがドライバーのイベント コールバック関数を呼び出す順序については、A User Unplugs a Deviceをご参照ください。