次の方法で共有


WdfIoTargetSendReadSynchronously 関数 (wdfiotarget.h)

[KMDF と UMDF に適用]

WdfIoTargetSendReadSynchronously メソッドは、読み取り要求をビルドし、I/O ターゲットに同期的に送信します。

構文

NTSTATUS WdfIoTargetSendReadSynchronously(
  [in]            WDFIOTARGET               IoTarget,
  [in, optional]  WDFREQUEST                Request,
  [in, optional]  PWDF_MEMORY_DESCRIPTOR    OutputBuffer,
  [in, optional]  PLONGLONG                 DeviceOffset,
  [in, optional]  PWDF_REQUEST_SEND_OPTIONS RequestOptions,
  [out, optional] PULONG_PTR                BytesRead
);

パラメーター

[in] IoTarget

WdfDeviceGetIoTarget または WdfIoTargetCreate を する以前の呼び出しまたは特殊な I/O ターゲットが提供するメソッドから取得されたローカルまたはリモートの I/O ターゲット オブジェクトへのハンドル。

[in, optional] Request

フレームワーク要求オブジェクトへのハンドル。 このパラメーターは省略可能であり、NULLできます。 このパラメーターの詳細については、次の「解説」セクションを参照してください。

[in, optional] OutputBuffer

デバイスからデータを受信するバッファーを記述する呼び出し元によって割り当てられた WDF_MEMORY_DESCRIPTOR 構造体へのポインター。このパラメーターは省略可能であり、NULLできます。 このパラメーターの詳細については、次の「解説」セクションを参照してください。

[in, optional] DeviceOffset

転送の開始オフセットを指定する場所へのポインター。 I/O ターゲット (つまり、次の下位ドライバー) は、この値の使用方法を定義します。 たとえば、ディスクのドライバー スタック内のドライバーは、ディスクの先頭からのオフセットを指定する場合があります。 I/O ターゲットは、要求の WDF_REQUEST_PARAMETERS 構造体の Parameters.Read.DeviceOffset メンバーでこの情報を取得します。 このポインターは省略可能です。 ほとんどのドライバーは、このポインター NULLに設定します。

[in, optional] RequestOptions

読み取り要求のオプションを指定する呼び出し元によって割り当てられた WDF_REQUEST_SEND_OPTIONS 構造体へのポインター。 このポインターは省略可能であり、NULLできます。

[out, optional] BytesRead

操作が成功した場合に読み取られたバイト数を受け取る場所へのポインター。 このポインターは省略可能であり、NULLできます。

戻り値

操作が成功した場合、WdfIoTargetSendReadSynchronously は I/O 要求の完了後に戻り、戻り値は要求の完了状態値になります。 それ以外の場合、このメソッドは次のいずれかの値を返す可能性があります。

リターン コード 形容
STATUS_INVALID_PARAMETER
無効なパラメーターが検出されました。
STATUS_INFO_LENGTH_MISMATCH
RequestOptions パラメーターが指すWDF_REQUEST_SEND_OPTIONS構造体のサイズが正しくありません。
STATUS_INVALID_DEVICE_REQUEST
I/O 要求は既に I/O ターゲットにキューに登録されています。
STATUS_INSUFFICIENT_RESOURCES
フレームワークは、システム リソース (通常はメモリ) を割り当てませんでした。
STATUS_IO_TIMEOUT
ドライバーがタイムアウト値を指定し、割り当てられた時間内に要求が完了しませんでした。
STATUS_REQUEST_NOT_ACCEPTED
要求 パラメーターが表す I/O 要求パケット (IRP) は、ドライバーが要求を転送するのに十分な IO_STACK_LOCATION 構造体を提供しません。
 

このメソッドは、他の NTSTATUS 値を返す場合もあります。

ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。

備考

WdfIoTargetSendReadSynchronously メソッドを使用して、読み取り要求を同期的に送信します。 読み取り要求を非同期的に送信するには、WdfIoTargetFormatRequestForRead メソッドを使用し、その後に WdfRequestSend メソッドを使用します。

WdfIoTargetSendReadSynchronously は、RequestOptions パラメーターの WDF_REQUEST_SEND_OPTIONS 構造体にタイムアウト値を指定しない限り、またはエラーが検出されない限り、要求が完了するまで戻りません。

ドライバーが I/O キューで受信した I/O 要求を転送することも、新しい要求を作成して送信することもできます。 どちらの場合も、フレームワークには要求オブジェクトとバッファー領域が必要です。

ドライバーが I/O キューで受信した I/O 要求を転送するには:

  1. Request パラメーターに対して、受信した要求のハンドルを指定します。
  2. WdfIoTargetSendReadSynchronously メソッドの OutputBuffer パラメーターに対して、受信した要求の出力バッファーを使用します。

    ドライバーは、要求の出力バッファー 表すフレームワーク メモリ オブジェクトへのハンドルを取得する WdfRequestRetrieveOutputMemory を呼び出す必要があります。 その後、ドライバーは、OutputBuffer パラメーターにドライバーが提供する WDF_MEMORY_DESCRIPTOR 構造体にそのハンドルを配置する必要があります。

I/O 要求の転送の詳細については、「転送 I/O 要求」を参照してください。

ドライバーは、多くの場合、受信した I/O 要求を、I/O ターゲットに送信する小さな要求に分割するため、ドライバーは新しい要求を作成する可能性があります。

新しい I/O 要求を作成するには:

  1. WdfIoTargetSendReadSynchronously メソッドの Request パラメーターに対して、NULL 要求ハンドルを指定するか、新しい要求オブジェクトを作成してそのハンドルを指定します。
    • NULL 要求ハンドルを指定すると、フレームワークは内部要求オブジェクトを使用します。 この手法は簡単に使用できますが、ドライバーは要求をキャンセルできません。
    • WdfRequestCreate を呼び出して 1 つ以上の要求オブジェクトを作成する場合は、WdfRequestReuse呼び出すことによって、これらの要求オブジェクトを再利用できます。 この手法を使用すると、ドライバーの EvtDriverDeviceAdd コールバック関数を使用して、デバイスの要求オブジェクトを事前に割り当てることができます。 さらに、別のドライバー スレッドは、WdfRequestCancelSentRequest を呼び出して、必要に応じて要求を取り消すことができます。

    ドライバーは、以外の NULL または NULLRequest パラメーターを提供するかどうかに関係なく、NULLRequestOptions パラメーターを指定できます。 たとえば、RequestOptions パラメーターを使用してタイムアウト値を指定できます。

  2. WdfIoTargetSendReadSynchronously メソッドの OutputBuffer パラメーターにバッファー領域を指定します。

    ドライバーは、ローカルに割り当てられたバッファーとして、WDFMEMORY ハンドルとして、またはメモリ記述子リスト (MDL) として、このバッファー領域を指定できます。 最も便利な方法を使用できます。

    必要に応じて、フレームワークは、バッファーの説明を、データ バッファーにアクセスするための I/O ターゲットの メソッド正しいものに変換します。

    バッファー領域を指定する次の手法を使用できます。

    • ローカル バッファーを指定します。

      WdfIoTargetSendReadSynchronously は I/O 要求を同期的に処理するため、次のコード例に示すように、ドライバーは呼び出し元ルーチンにローカルな要求バッファーを作成できます。

      WDF_MEMORY_DESCRIPTOR  MemoryDescriptor;
      MY_BUFFER_TYPE  MyBuffer;
      WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&MemoryDescriptor,
                                        (PVOID) &MyBuffer,
                                        sizeof(MyBuffer));
      
    • WDFMEMORY ハンドルを指定します。

      次のコード例に示すように、WdfMemoryCreate 呼び出すか、WdfMemoryCreatePreallocated を して、フレームワークマネージド メモリへのハンドルを取得します。

      WDF_MEMORY_DESCRIPTOR  MemoryDescriptor;
      WDFMEMORY  MemoryHandle = NULL;
      status = WdfMemoryCreate(NULL,
                               NonPagedPool,
                               POOL_TAG,
                               MY_BUFFER_SIZE,
                               &MemoryHandle,
                               NULL);
      WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(&MemoryDescriptor,
                                        MemoryHandle,
                                        NULL);
      

      または、ドライバー WdfRequestRetrieveOutputMemory を呼び出して、受信した I/O 要求の出力バッファーを表すフレームワーク メモリ オブジェクトへのハンドルを取得することもできます (ドライバーがそのバッファーの内容を I/O ターゲットに渡す場合)。 WdfIoTargetSendReadSynchronously I/O ターゲットに送信 新しい要求が削除、再利用、または再フォーマットされるまで、ドライバーは受信した I/O 要求を完了してはなりません。 (WdfIoTargetSendReadSynchronously メモリ オブジェクトの参照カウントをインクリメントします。要求オブジェクトを削除、再利用、または再フォーマットすると、メモリ オブジェクトの参照カウントがデクリメントされます)。

    • MDL を指定します。

      ドライバーは、WdfRequestRetrieveOutputWdmMdl呼び出すことによって、受信した I/O 要求に関連付けられている MDL を取得できます。

一部の I/O ターゲットは、長さ 0 のバッファーを持つ読み取り要求を受け入れます。 このような I/O ターゲットの場合、ドライバーは、OutputBuffer パラメーター NULL を指定できます。

I/O 要求が完了した後の状態情報の取得については、「完了情報の取得を参照してください。

WdfIoTargetSendReadSynchronouslyの詳細については、「一般的な I/O ターゲットへの I/O 要求の送信」を参照してください。

I/O ターゲットの詳細については、「I/O ターゲットの使用」を参照してください。

次のコード例では、フレームワーク メモリ オブジェクトを作成し、WDF_MEMORY_DESCRIPTOR 構造体を初期化し、その構造体を WdfIoTargetSendReadSynchronously渡します。 この例では、要求オブジェクト ハンドル NULL を指定するため、フレームワークは I/O ターゲットの新しい要求オブジェクトを作成します。

WDF_MEMORY_DESCRIPTOR  MemoryDescriptor;
WDFMEMORY  MemoryHandle = NULL;
ULONG_PTR  bytesRead = NULL;

status = WdfMemoryCreate(
                         NULL,
                         NonPagedPool,
                         POOL_TAG,
                         MY_BUFFER_SIZE,
                         &MemoryHandle,
                         NULL
                         );
WDF_MEMORY_DESCRIPTOR_INIT_HANDLE(
                                  &MemoryDescriptor,
                                  MemoryHandle,
                                  NULL
                                  );
status = WdfIoTargetSendReadSynchronously(
                                          ioTarget,
                                          NULL,
                                          &MemoryDescriptor,
                                          NULL,
                                          NULL,
                                          &bytesRead
                                          );
 

必要条件

要件 価値
ターゲット プラットフォーム の 万国
最小 KMDF バージョン 1.0
UMDF の最小バージョン を する 2.0
ヘッダー wdfiotarget.h (Wdf.h を含む)
ライブラリ Wdf01000.sys (KMDF);WUDFx02000.dll (UMDF)
IRQL PASSIVE_LEVEL
DDI コンプライアンス規則 を する DeferredRequestCompleted(kmdf), DriverCreate(kmdf), InternalIoctlReqs(kmdf), IoctlReqs(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestCompleted(kmdf), RequestCompletedLocal(kmdf), SyncReqSend(kmdf), WriteReqs(kmdf)

関連項目

EvtDriverDeviceAdd の

WDF_MEMORY_DESCRIPTOR

WDF_MEMORY_DESCRIPTOR_INIT_HANDLE

WDF_REQUEST_PARAMETERS

WDF_REQUEST_SEND_OPTIONS

WdfDeviceGetIoTarget の

WdfIoTargetCreate の

WdfIoTargetFormatRequestForRead の

WdfIoTargetSendWriteSynchronously を する

WdfMemoryCreate

WdfMemoryCreatePreallocated の

WdfRequestCancelSentRequest

WdfRequestCreate

WdfRequestRetrieveOutputMemory

WdfRequestRetrieveOutputWdmMdl

WdfRequestReuse

WdfRequestSend