UMDF での一般 I/O ターゲットの状態の制御

警告

UMDF 2 は UMDF の最新バージョンであり、UMDF 1 に取って代わるものです。 すべての新しい UMDF ドライバーは、UMDF 2 を使用して記述する必要があります。 UMDF 1 には新機能が追加されておらず、Windows 10 の新しいバージョンでは UMDF 1 のサポートが制限されています。 ユニバーサル Windows ドライバーでは、UMDF 2 を使用する必要があります。

アーカイブされた UMDF 1 サンプルは、Windows 11, バージョン 22H2 - 2022 年 5 月 ドライバー サンプル アップデートでご確認いただけます。

詳しくは、UMDFの概要をご覧ください。

フレームワークは、一般的な I/O ターゲットに対して次の状態を定義します。

Started
I/O ターゲットが開いてして (つまり、UMDF ドライバーで使用可能)、ドライバーは I/O 要求を送信できます。 フレームワークは、適切なドライバーに要求を配信します。

停止
I/O ターゲットは開いていますが、UMDF ドライバーが IWDFIoRequest::Send メソッドの呼び出しで Flags パラメーターにWDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE フラグを渡さない限り、ドライバーは I/O ターゲットに I/O 要求を送信できません。

フレームワークは、適切なドライバーへの要求の配信を停止します。

クエリ削除用にクローズ
I/O ターゲットは、デバイスが間もなく削除される可能性があるため、一時的に閉じられています。

終了済
I/O ターゲットは閉じられているので、開始も停止もできません。

Deleted
I/O ターゲットのデバイスが削除されました。

WDF_IO_TARGET_STATE 列挙は、これらの状態を表す値を定義します。

ローカル I/O ターゲットの状態

フレームワークは、ローカル I/O ターゲットを自動的に開いて開始します。

必要に応じて、ドライバーは IWDFIoTargetStateManagement::Stop を呼び出してローカル I/O ターゲットを一時的に停止し、IWDFIoTargetStateManagement::Start を呼び出して再開できます。 たとえば、ドライバーが一時的なエラー条件を検出した場合、ローカル I/O ターゲットを停止し、エラー条件が修正された場合に I/O ターゲットを再開することがあります。

ローカル I/O ターゲットのデバイスが削除されると、フレームワークは自動的に I/O ターゲットを停止して閉じ、ターゲットのキューにあるすべての I/O 要求を取り消します。 フレームワークは、デバイス オブジェクト イベントコールバック関数を呼び出すことによって、デバイスが使用できなくなったことをドライバーに通知します。 これらのコールバック関数の詳細については、「UMDF の PnP と電源管理のシナリオ」を参照してください。

ドライバーは、IWDFIoTargetStateManagement::GetState を呼び出して、ローカル I/O ターゲットの現在の状態を取得できます。

リモート I/O ターゲットの状態

ドライバーは、リモート I/O ターゲットを開くには、IWDFRemoteTarget::OpenFileByName または IWDFRemoteTarget::OpenRemoteInterface を呼び出す必要があります。 ドライバーがリモート I/O ターゲットを開くと、フレームワークによって I/O ターゲットが自動的に開始されます。

必要に応じて、ドライバーは IWDFRemoteTarget::Stop を呼び出してリモート I/O ターゲットを一時的に停止し、IWDFRemoteTarget::Start を呼び出して再開できます。

リモート I/O ターゲットのデバイスが削除されると、ドライバーが次のイベント コールバック関数を登録していない限り、フレームワークは自動的に I/O ターゲットを停止して閉じ、ターゲットのキューにあるすべての I/O 要求を取り消します。

IRemoteTargetCallbackRemoval::OnRemoteTargetQueryRemove
リモート I/O ターゲットのデバイスが削除される可能性があることをドライバーに通知します。 ドライバーでデバイスの削除を許可する場合は、ドライバーで IWDFRemoteTarget::CloseForQueryRemove を呼び出す必要があります。

IRemoteTargetCallbackRemoval::OnRemoteTargetRemoveComplete
リモート I/O ターゲットのデバイスが削除されたことをドライバーに通知します。 このコールバック関数は、IWDFRemoteTarget::Close を呼び出す必要があります。

IRemoteTargetCallbackRemoval::OnRemoteTargetRemoveCanceled
リモート I/O ターゲットのデバイスの削除が取り消されたことをドライバーに通知します。 ドライバーでターゲットを引き続き使用する場合、ドライバーは IWDFRemoteTarget::Reopen を呼び出す必要があります。 通常、ドライバーは、OnRemoteTargetRemoveCanceled コールバック関数内から Reopen を呼び出しますが、代わりに、OnRemoteTargetRemoveCanceled が返された後に Reopen を呼び出すこともできます。

ドライバーは、IWDFRemoteTarget::GetState を呼び出して、リモート I/O ターゲットの現在の状態を取得できます。