다음을 통해 공유


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

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
머리글 wdfrequest.h(Wdf.h 포함)
라이브러리 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), InvalidReqAccess(kmdf), InvalidReqAccessLocal(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

추가 정보

WdfRequestRetrieveInputMemory

WdfRequestRetrieveOutputBuffer

WdfUsbTargetDeviceRetrieveConfigDescriptor