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를 사용하지 않습니다. 데이터 버퍼에 액세스하기 위해 지원되는 방법에 대한 자세한 내용은 다음 설명 섹션을 참조하세요.
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 요청도 지원합니다.

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
머리글 wdfrequest.h(Wdf.h 포함)
라이브러리 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