次の方法で共有


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

I/O ターゲット オブジェクトは、インゲートとアウトゲートの 2 つのゲートを持つものとして視覚化できます。 アウトゲートは、フレームワークがターゲット デバイス オブジェクトに要求を配信するタイミングを制御し、インゲートは要求が I/O ターゲットに入ることが許可されるタイミングを制御します。

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

Started
I/O ターゲット オブジェクトの両方のゲートが開いています。 ドライバーは I/O ターゲット キューに I/O 要求を送信でき、フレームワークは適切なドライバーに要求を配信します。

停止
I/O ターゲットのインゲートは開いていますが、アウトゲートは閉じています。 フレームワークは、適切なドライバーへの要求の配信を停止します。 I/O 要求を I/O ターゲットに送信するには、ドライバーは、各要求の WDF_REQUEST_SEND_OPTIONS 構造体でWDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE または WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET を設定する必要があります。

Purged
I/O ターゲット オブジェクトの両方のゲートが閉じています。 ドライバーは、WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE または WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET を設定しない限り、I/O ターゲットに I/O 要求を送信できません。 さらに、フレームワークは、I/O ターゲット オブジェクトの内部キュー内の未処理の要求を取り消します。 この状態は、KMDF バージョン 1.11 以降で使用できます。

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

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

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

WDF_IO_TARGET_STATE 列挙は、これらの状態を表す値を定義します。 ドライバーは WdfIoTargetGetState を呼び出して、I/O ターゲットの状態を取得できます。

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

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

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

KMDF バージョン 1.11 以降では、ドライバーは WdfIoTargetPurge を呼び出して、一時的に I/O 要求がローカル I/O ターゲットに送信されないようにし、ターゲットのキュー内の未処理の要求を取り消すことができます。 たとえば、ファイル ハンドルのクリーンアップの一部として、ドライバーがローカル I/O ターゲットを消去して、ドライバーに送信されたすべての要求が取り消されるようにする場合があります。

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

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

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

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

KMDF バージョン 1.11 以降では、ドライバーは WdfIoTargetPurge を呼び出して、一時的に I/O 要求がリモート I/O ターゲットに送信されないようにし、ターゲットのキュー内の未処理の要求を取り消すことができます。

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

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

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

EvtIoTargetRemoveCanceled
リモート I/O ターゲットのデバイスの削除が取り消されたことをドライバーに通知します。 このコールバック関数は WdfIoTargetOpen を呼び出す必要があり、ドライバーは通常、WDF_IO_TARGET_OPEN_PARAMS_INIT関数を初期化するために WDF_IO_TARGET_OPEN_PARAMS_INIT_REOPEN を呼び出します。

ドライバーがリモート I/O ターゲットの使用を完了し、ターゲットをもう使用せず、ターゲットにまだ保留中の子要求オブジェクトがない場合、ドライバーは最初に WdfIoTargetClose を呼び出すことなく WdfObjectDelete を呼び出すことができます。 ターゲットにまだ保留中の子要求オブジェクトがある場合、ドライバーは WdfObjectDelete を安全に呼び出す前に WdfIoTargetClose を呼び出す必要があります。