次の方法で共有


WdfRequestRetrieveInputMemory 関数 (wdfrequest.h)

[KMDF と UMDF に適用]

WdfRequestRetrieveInputMemory メソッドは、I/O 要求の入力バッファーを表すフレームワーク メモリ オブジェクトへのハンドルを取得します。

構文

NTSTATUS WdfRequestRetrieveInputMemory(
  [in]  WDFREQUEST Request,
  [out] WDFMEMORY  *Memory
);

パラメーター

[in] Request

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

[out] Memory

フレームワーク メモリ オブジェクトへのハンドルを受け取る場所へのポインター。

戻り値

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

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

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

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

注釈

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

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

WdfRequestRetrieveInputMemory がSTATUS_SUCCESSを返す場合、ドライバーは、入力バッファーを表すフレームワーク メモリ オブジェクトへのハンドルを受け取ります。 バッファーにアクセスするには、ドライバーは WdfMemoryGetBuffer を呼び出す必要があります。

ドライバーは、Request パラメーターが表す I/O 要求が完了するまで、取得したフレームワーク メモリ オブジェクトにアクセスできます。

ドライバーは WdfRequestRetrieveInputMemory を呼び出す代わりに、バッファーのアドレスと長さを取得する WdfRequestRetrieveInputBuffer を呼び出すことができます。

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

次のコード例は、 EvtIoWrite コールバック関数が、書き込み要求の入力バッファーを表すフレームワーク メモリ オブジェクトへのハンドルを取得する方法を示しています。 次に、USB I/O ターゲットに書き込み要求を書式設定して送信する例を示します。

VOID 
MyEvtIoWrite(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN size_t  Length
    )
{
    NTSTATUS  status;
    WDFUSBPIPE  pipe;
    WDFMEMORY  reqMemory;
    PDEVICE_CONTEXT  pDeviceContext;

    //
    // The driver previously stored a pipe handle in 
    // the device object's context space.
    //
    pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
    pipe = pDeviceContext->BulkWritePipe;

    //
    // Get input memory.
    //
    status = WdfRequestRetrieveInputMemory(
                                           Request,
                                           &reqMemory
                                           );
    if(!NT_SUCCESS(status)){
        goto Exit;
    }

    //
    // Format the request.
    //
    status = WdfUsbTargetPipeFormatRequestForWrite(
                                          pipe,
                                          Request,
                                          reqMemory,
                                          NULL
                                          );
    if (!NT_SUCCESS(status)) {
        goto Exit;
    }
    WdfRequestSetCompletionRoutine(
                                   Request,
                                   EvtRequestWriteCompletionRoutine,
                                   pipe
                                   );

    //
    // Send the request.
    //
    if (WdfRequestSend(
                       Request,
                       WdfUsbTargetPipeGetIoTarget(pipe),
                       WDF_NO_SEND_OPTIONS
                       ) == FALSE) {
        status = WdfRequestGetStatus(Request);
        goto Exit;
    }
Exit:
    //
    // Complete the request now if an error occurred.
    //
    if (!NT_SUCCESS(status)) {
        WdfRequestCompleteWithInformation(
                                          Request,
                                          status,
                                          0
                                          );
    }
    return;
}

要件

要件
対象プラットフォーム ユニバーサル
最小 KMDF バージョン 1.0
最小 UMDF バージョン 2.0
Header wdfrequest.h (Wdf.h を含む)
Library Wdf01000.sys (KMDF);WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI コンプライアンス規則 DriverCreate(kmdf)InputBufferAPI(kmdf)InvalidReqAccess(kmdf)InvalidReqAccessLocal(kmdf)KmdfIrql(kmdf)KmdfIrql2(kmdf)、KmdfIrqlExplicit(kmdf)、 MemAfterReqCompletedIntIoctl(kmdf)MemAfterReqCompletedIntIoctlA(kmdf)MemAfterReqCompletedIoctl(kmdf)MemAfterReqCompletedIoctlA(kmdf)MemAfterReqCompletedRead(kmdf)MemAfterReqCompletedWrite(kmdf)MemAfterReqCompletedWriteA(kmdf)

こちらもご覧ください

WdfMemoryGetBuffer

WdfRequestRetrieveInputBuffer

WdfRequestRetrieveOutputMemory