自己管理型 I/O の使用
ほとんどのフレームワーク ベースのドライバーは、サポートされているデバイスのフレームワークの PnP と電源管理機能を利用します。 つまり、ほとんどのフレームワーク ベースのドライバーでは、次のすべてを実行して、デバイスの PnP と電源の状態をフレームワークで管理できます。
EvtDeviceD0Entry および EvtDeviceD0Exit コールバック関数の提供。
EvtDevicePrepareHardware および EvtDeviceReleaseHardware コールバック関数の提供。
デバイスが動作状態にあることを必要とする I/O 要求には電源管理キューを使用し、それ以外の要求には電源管理されていないキューを使用します。
ただし、いくつかのフレームワーク ベースのドライバーでは、次の状況でのドライバーを含め、デバイスの状態に関するより多くの知識が必要になります。
ドライバーが実行する操作は、ドライバーがフレームワーク I/O キューから受信する一連の I/O 要求によって決まります。
ドライバーは、過去の非フレームワーク ドライバーと通信し、WDM インターフェイスを直接処理します。
ドライバーが受信する I/O 要求を 2 つのグループに分割することはできません。
ほとんどのドライバーは前述のような状況にはありませんが、もしドライバーがそのような状況にある場合、デバイスの PnP や電源管理操作をより直接的に制御する必要があるかもしれません。 これらのドライバーは、セルフ管理 I/O を使用できます。 セルフ管理 I/O を使用すると、デバイスが接続または取り外された場合、およびデバイスが一時的に停止されるたびに、ドライバーに (コールバック関数のセットによって) 通知が送信されます。
ドライバーはセルフ管理 I/O を使用でき、電源管理キューとして使用するかどうかに関わらず、フレームワークの I/O キューを引き続き使用できます。 たとえば、ドライバーは、セルフ管理 I/O コールバック関数のセットを使用して、電源管理ではなく、フレームワークの I/O キューを使用できます。
セルフ管理 I/O を使用するために、ドライバーは WdfDeviceInitSetPnpPowerEventCallbacks を呼び出すときに、イベント コールバック関数の追加セットを登録します。 イベント コールバック関数は次のとおりです。
EvtDeviceSelfManagedIoInit、デバイスの I/O 操作を初期化して開始します。
EvtDeviceSelfManagedIoSuspend、I/O 操作を中断します。
EvtDeviceSelfManagedIoRestart、中断された後、デバイスの I/O 操作を再起動します。
EvtDeviceSelfManagedIoFlush、サービスされていない I/O 要求を削除します。
EvtDeviceSelfManagedIoCleanup、EvtDeviceSelfManagedIoInit によって割り当てられたリソースの割り当てを解除します。
デバイスが初めて動作 (D0) 状態になると、フレームワークはドライバーの EvtDeviceSelfManagedIoInit コールバック関数を呼び出します。 これは、ユーザーがデバイスをシステムに接続するたびに、およびシステムが再起動されるたびに発生します。
ドライバーがデバイスの I/O 操作を停止する必要がある 3 つの状況があります。デバイスが低電力状態になりようとしているか、削除されようとしているか、予期せず既に削除されています。 次の一覧では、これらの各状況について詳しく説明します。
デバイスは低電力状態に入ろうとしており、最終的には動作状態に戻ります。
デバイスが低電力状態に入りようとしているとき (デバイスがアイドル状態になっているか、システム全体が低電力状態に入っているか、PnP マネージャーがシステム ハードウェア リソースを再配布しているため)、フレームワークはドライバーの EvtDeviceSelfManagedIoSuspend コールバック関数を呼び出します。 デバイスが動作状態を再入力すると、フレームワークはドライバーの EvtDeviceSelfManagedIoRestart コールバック関数を呼び出します。
デバイスが取り外されようとしています。
ユーザーが要求したデバイスの取り外しを処理するために、フレームワークはデバイスを停止する前にドライバーの EvtDeviceSelfManagedIoSuspend コールバック関数を呼び出します。 デバイスを停止した後、フレームワークはドライバーの EvtDeviceSelfManagedIoFlush コールバック関数を呼び出します。 デバイスが削除されると、フレームワークは EvtDeviceSelfManagedIoCleanup コールバック関数を呼び出します。
デバイスは既に予期せず取り外されています (突然の取り外し)。
デバイスのバスのドライバーがデバイスが存在しなくなったと判断した場合、またはスタック内の別のドライバーがデバイスが応答していないと判断した場合、問題を検出したドライバーは PnP マネージャーに通知します。 PnP マネージャーは、デバイスがなくなったことをドライバーの残りの部分に通知します。 フレームワーク ベースのドライバーの場合、フレームワークは PnP マネージャーのメッセージを受信し、ドライバーの EvtDeviceSelfManagedIoSuspend、EvtDeviceSelfManagedIoFlush、EvtDeviceSelfManagedIoCleanup コールバック関数を呼び出します。
(ドライバーは EvtDeviceSurpriseRemoval コールバック関数を登録することもできます。 デバイスが削除されたときに動作中 (D0) 状態であった場合、フレームワークはセルフ管理 I/O コールバック関数を呼び出す前に EvtDeviceSurpriseRemoval を呼び出します。 デバイスが取り外されたときに低電力状態であった場合、EvtDeviceSurpriseRemoval は EvtDeviceSelfManagedIoSuspend の後に呼び出されます)
フレームワークがドライバーのコールバック関数を呼び出す順序については、「PnP と電源管理シナリオ」をご参照ください。
ほとんど必要になることはありませんが、フレームワークでは、フレームワーク内のステート マシンにアクセスすることで、ドライバーがデバイスの PnP と電源の状態をさらに制御できます。