I/O 要求の非同期送信

I/O 要求を非同期で I/O ターゲットに送信するには、あらかじめ要求をフォーマットしておく必要があります。ドライバーで I/O 要求をフォーマットするための I/O ターゲット オブジェクト メソッドを、次の表に示します。

メソッド 目的

WdfIoTargetFormatRequestForRead

読み取り要求をフォーマットします。

WdfIoTargetFormatRequestForWrite

書き込み要求をフォーマットします。

WdfIoTargetFormatRequestForIoctl

デバイス制御要求をフォーマットします。

WdfIoTargetFormatRequestForInternalIoctl

内部デバイス制御要求をフォーマットします。

WdfIoTargetFormatRequestForInternalIoctlOthers

非標準の内部デバイス制御要求をフォーマットします。

 

I/O 要求を非同期で送信するには、ドライバーで次の処理を行う必要があります。

  1. 要求をフォーマットします。

    前の表に示したメソッドのいずれかを使用して、要求をフォーマットします。これらのメソッドの使用方法の詳細については、メソッドのリファレンス ページを参照してください。

  2. CompletionRoutine コールバック関数を登録します。

    非同期で要求を送信する場合、通常は他のドライバーが各要求を完了したときに、フレームワークからドライバーに通知を受ける必要があります。このため、ドライバーで CompletionRoutine コールバック関数を定義し、WdfRequestSetCompletionRoutine を呼び出して登録する必要があります。詳細については、「I/O 要求の完了」を参照してください。

  3. 要求を送信します。

    ドライバーで要求をフォーマットし、CompletionRoutine コールバック関数を登録したら、WdfRequestSend を呼び出す必要があります。このメソッドでは、要求を同期と非同期のどちらで送信するかを、入力パラメーターの 1 つで指定できます。I/O 要求を同期的に送信する簡単な方法については、「I/O 要求の同期送信」を参照してください。

ドライバーで WdfRequestSend を呼び出して I/O 要求を送信した場合、後からこのドライバーで要求の取り消しを試行できます。詳細については、「I/O 要求の取り消し」を参照してください。

ドライバーによっては、1 つの I/O 要求を複数のデバイス (つまり複数の I/O ターゲット) に送信するものもあります。これを行うには、各要求について WdfRequestSend を複数回呼び出します。このようなドライバーでは、最初に WdfRequestSend を呼び出した後、次に同メソッドを呼び出すたびに、先に WdfRequestChangeTarget を呼び出して、要求を次の I/O ターゲットに送信できるかどうか確認する必要があります。