次の方法で共有


WdfRequestRetrieveInputBuffer 関数 (wdfrequest.h)

[KMDF と UMDF に適用]

WdfRequestRetrieveInputBuffer メソッドは、I/O 要求の入力バッファーを取得します。

構文

NTSTATUS WdfRequestRetrieveInputBuffer(
  [in]            WDFREQUEST Request,
                  size_t     MinimumRequiredLength,
  [out]           PVOID      *Buffer,
  [out, optional] size_t     *Length
);

パラメーター

[in] Request

フレームワーク要求オブジェクトへのハンドル。

MinimumRequiredLength

ドライバーが I/O 要求を処理するために必要な最小バッファー サイズ (バイト単位)。

[out] Buffer

バッファーのアドレスを受け取る場所へのポインター。

[out, optional] Length

バッファーのサイズをバイト単位で受け取る場所へのポインター。 このパラメーターは省略可能であり、 NULL にすることができます。

戻り値

操作が成功した場合、WdfRequestRetrieveInputBuffer はSTATUS_SUCCESSを返します。 それ以外の場合、このメソッドは次のいずれかの値を返す可能性があります。

リターン コード 説明
STATUS_INVALID_PARAMETER
入力パラメーターが無効です。
STATUS_BUFFER_TOO_SMALL
入力バッファーの長さが 0 であるか、 MinimumRequiredSize パラメーターがバッファーの実際のサイズより大きいバッファー サイズを指定します。
STATUS_INVALID_DEVICE_REQUEST
要求の種類が無効であるか、要求で バッファーされた I/O も直接 I/O も使用されていません。 データ バッファーにアクセスするためのサポートされているメソッドの詳細については、次の「解説」セクションを参照してください。
STATUS_INTERNAL_ERROR
要求は既に完了しています。
STATUS_INSUFFICIENT_RESOURCES
メモリが不足しています。
 

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

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

注釈

要求の入力バッファーには、要求の発信元によって提供されたディスクに書き込まれるデータなどの情報が含まれます。 ドライバーは WdfRequestRetrieveInputBuffer を呼び出して、書き込み要求またはデバイス I/O 制御要求の入力バッファーを取得できますが、読み取り要求では取得できません (読み取り要求では入力データが提供されないため)。

WdfRequestRetrieveInputBuffer メソッドは、バッファー化された I/O メソッドまたはデータ バッファーにアクセスするための直接 I/O メソッドを使用する I/O 要求の入力バッファーを取得します。 要求の I/O 制御コードが IRP_MJ_INTERNAL_DEVICE_CONTROLされている場合、または要求が別のカーネル モード ドライバーから送信された場合、 WdfRequestRetrieveInputBuffer では 、バッファーされた I/O も直接 I/O も使用しない I/O 要求もサポートされます。

WdfRequestRetrieveInputBuffer がSTATUS_SUCCESSを返した場合、ドライバーはアドレスと、必要に応じて入力バッファーのサイズを受け取ります。

ドライバーは、Request パラメーターが表す I/O 要求が完了するまで、取得したバッファーにアクセスできます。

WdfRequestRetrieveInputBuffer を呼び出す代わりに、ドライバーは WdfRequestRetrieveInputMemory を呼び出すことができます。これにより、バッファーを表すフレームワーク メモリ オブジェクトが作成されます。

WdfRequestRetrieveInputBuffer の詳細については、「Framework-Based ドライバーでのデータ バッファーへのアクセス」を参照してください。

次のコード例は、 シリアル サンプル ドライバーの EvtIoDeviceControl コールバック関数の一部です。 I/O 制御コードがIOCTL_SERIAL_SET_TIMEOUT場合、ドライバーは I/O 要求の入力バッファーから新しいタイムアウト値を取得します。

VOID
SerialEvtIoDeviceControl(
    IN WDFQUEUE     Queue,
    IN WDFREQUEST   Request,
    IN size_t       OutputBufferLength,
    IN size_t       InputBufferLength,
    IN ULONG        IoControlCode
    )
{
    PVOID  buffer;
    size_t  bufSize;

    switch (IoControlCode) {
...

        case IOCTL_SERIAL_SET_TIMEOUTS: {

            PSERIAL_TIMEOUTS NewTimeouts;

            Status = WdfRequestRetrieveInputBuffer(
                                                   Request,
                                                   sizeof(SERIAL_TIMEOUTS),
                                                   &buffer,
                                                   &bufSize
                                                   );
            if (!NT_SUCCESS(Status)) {
                break;
            }

            NewTimeouts =(PSERIAL_TIMEOUTS)buffer;
    }
...
}

要件

要件
対象プラットフォーム ユニバーサル
最小 KMDF バージョン 1.0
最小 UMDF バージョン 2.0
Header wdfrequest.h (Wdf.h を含む)
Library Wdf01000.sys (KMDF);WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 BufAfterReqCompletedIntIoctl(kmdf), BufAfterReqCompletedIntIoctlA(kmdf), BufAfterReqCompletedIoctl(kmdf), BufAfterReqCompletedIoctlA(kmdf),BufAfterReqCompletedRead(kmdf), BufAfterReqCompletedWrite(kmdf), BufAfterReqCompletedWriteA(kmdf), DriverCreate(kmdf), InputBufferAPI(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

こちらもご覧ください

WdfRequestRetrieveInputMemory

WdfRequestRetrieveOutputBuffer

WdfUsbTargetDeviceRetrieveConfigDescriptor