WdfUsbTargetPipeFormatRequestForWrite 함수(wdfusb.h)

[KMDF 및 UMDF에 적용]

WdfUsbTargetPipeFormatRequestForWrite 메서드는 USB 출력 파이프에 대한 쓰기 요청을 작성하지만 요청을 보내지 않습니다.

구문

NTSTATUS WdfUsbTargetPipeFormatRequestForWrite(
  [in]           WDFUSBPIPE        Pipe,
  [in]           WDFREQUEST        Request,
  [in, optional] WDFMEMORY         WriteMemory,
  [in, optional] PWDFMEMORY_OFFSET WriteOffset
);

매개 변수

[in] Pipe

WdfUsbInterfaceGetConfiguredPipe를 호출하여 가져온 프레임워크 파이프 개체에 대한 핸들입니다.

[in] Request

프레임워크 요청 개체에 대한 핸들입니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

[in, optional] WriteMemory

프레임워크 메모리 개체에 대한 핸들입니다. 이 개체는 파이프로 전송될 데이터가 포함된 버퍼를 나타냅니다. 이 버퍼에 대한 자세한 내용은 다음 주의 섹션을 참조하세요.

[in, optional] WriteOffset

선택적 바이트 오프셋 및 길이 값을 제공하는 호출자가 할당한 WDFMEMORY_OFFSET 구조체에 대한 포인터입니다. 프레임워크는 이러한 값을 사용하여 데이터 전송에 대한 쓰기 버퍼 내의 시작 주소와 길이를 결정합니다. 이 포인터가 NULL이면 데이터 전송이 버퍼의 시작 부분에서 시작되고 전송 크기는 버퍼 크기입니다.

반환 값

WdfUsbTargetPipeFormatRequestForWrite 는 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.

반환 코드 설명
STATUS_INVALID_PARAMETER
잘못된 매개 변수가 감지되었습니다.
STATUS_INSUFFICIENT_RESOURCES
메모리가 부족했습니다.
STATUS_INVALID_DEVICE_REQUEST
잘못된 메모리 설명자가 지정되었거나, 파이프의 형식이 잘못되었거나, 전송 방향이 잘못되었거나, 지정된 I/O 요청이 이미 I/O 대상에 큐에 대기되었습니다.
STATUS_INTEGER_OVERFLOW
Offset 매개 변수가 지정한 오프셋 이 잘못되었습니다.
STATUS_REQUEST_NOT_ACCEPTED
Request 매개 변수가 나타내는 IRP(I/O 요청 패킷)는 드라이버가 요청을 전달할 수 있는 충분한 IO_STACK_LOCATION 구조를 제공하지 않습니다.
 

이 메서드는 다른 NTSTATUS 값을 반환할 수도 있습니다.

드라이버가 잘못된 개체 핸들을 제공하는 경우 버그 검사 발생합니다.

설명

WdfUsbTargetPipeFormatRequestForWriteWdfRequestSend를 사용하여 동기 또는 비동기적으로 쓰기 요청을 보냅니다. 또는 WdfUsbTargetPipeWriteSynchronously 메서드를 사용하여 쓰기 요청을 동기적으로 보냅니다.

지정된 파이프는 출력 파이프여야 하며 파이프의 형식WdfUsbPipeTypeBulk 또는 WdfUsbPipeTypeInterrupt여야 합니다.

드라이버가 I/O 큐에서 받은 I/O 요청을 전달하거나 새 요청을 만들고 보낼 수 있습니다. 두 경우 모두 프레임워크에는 요청 개체와 일부 버퍼 공간이 필요합니다.

드라이버가 I/O 큐에서 받은 I/O 요청을 전달하려면 다음을 수행합니다.

  1. WdfUsbTargetPipeFormatRequestForWrite 메서드의 Request 매개 변수에 대해 수신된 요청의 핸들을 지정합니다.
  2. WdfUsbTargetPipeFormatRequestForWrite 메서드의 WriteMemory 매개 변수에 대해 수신된 요청의 입력 버퍼를 사용합니다.

    드라이버는 WdfRequestRetrieveInputMemory 를 호출하여 요청의 입력 버퍼를 나타내는 프레임워크 메모리 개체에 대한 핸들을 가져오고 해당 핸들을 WriteMemory의 값으로 사용해야 합니다.

I/O 요청을 전달하는 방법에 대한 자세한 내용은 I/O 요청 전달을 참조하세요.

드라이버는 수신된 I/O 요청을 I/O 대상으로 보내는 더 작은 요청으로 나누는 경우가 많으므로 드라이버는 새 요청을 만들 수 있습니다.

새 I/O 요청을 만들려면 다음을 수행합니다.

  1. 새 요청 개체를 만들고 WdfUsbTargetPipeFormatRequestForWrite 메서드의 Request 매개 변수에 대한 핸들을 입력합니다.

    WdfRequestCreate를 호출하여 하나 이상의 요청 개체를 미리 할당합니다. WdfRequestReuse를 호출하여 이러한 요청 개체를 다시 사용할 수 있습니다. 드라이버의 EvtDriverDeviceAdd 콜백 함수는 디바이스에 대한 요청 개체를 미리 할당할 수 있습니다.

  2. 버퍼 공간을 제공하고 WdfUsbTargetPipeFormatRequestForWrite 메서드의 WriteMemory 매개 변수에 대한 버퍼 핸들을 제공합니다.

    드라이버는 이 버퍼 공간을 프레임워크 관리 메모리에 대한 WDFMEMORY 핸들로 지정해야 합니다. 드라이버는 다음 중 하나를 수행할 수 있습니다.

    • 드라이버가 새 버퍼를 I/O 대상에 전달하도록 하려면 WdfMemoryCreate 또는 WdfMemoryCreatePreallocated 를 호출하여 새 메모리 버퍼를 만듭니다.
    • 드라이버가 해당 버퍼의 콘텐츠를 I/O 대상에 전달하도록 하려면 WdfRequestRetrieveInputMemory 를 호출하여 수신된 I/O 요청의 버퍼를 나타내는 메모리 개체에 대한 핸들을 가져옵니다.
    드라이버가 WdfRequestRetrieveInputMemory 를 호출하고 메모리 핸들을 WdfUsbTargetPipeFormatRequestForWrite에 전달하는 경우 드라이버는 드라이버가 드라이버에서 만든 새 요청 개체를 삭제, 재사용 또는 다시 포맷할 때까지 수신된 I/O 요청을 완료하지 않아야 합니다. (WdfUsbTargetPipeFormatRequestForWrite 는 메모리 개체의 참조 횟수를 증가합니다. 요청 개체를 삭제, 재사용 또는 다시 포맷하면 메모리 개체의 참조 수가 감소합니다.)
WdfUsbTargetPipeFormatRequestForWrite를 호출하여 I/O 요청의 형식을 지정한 후 드라이버는 WdfRequestSend를 호출하여 요청을 I/O 대상에 동기적으로 또는 비동기적으로 보내야 합니다.

동일한 요청을 사용하는 WdfUsbTargetPipeFormatRequestForWrite 에 대한 여러 호출로 인해 추가 리소스 할당이 발생하지 않습니다. 따라서 WdfRequestCreate 가 STATUS_INSUFFICIENT_RESOURCES 반환할 가능성을 줄이기 위해 드라이버의 EvtDriverDeviceAdd 콜백 함수는 WdfRequestCreate 를 호출하여 디바이스에 대해 하나 이상의 요청 개체를 미리 할당할 수 있습니다. 이후에 드라이버는 WdfRequestCreate에 대한 이후 호출에서 STATUS_INSUFFICIENT_RESOURCES 반환 값을 위험하지 않고 다시 사용(WdfRequestReuse 호출), reformat(WdfUsbTargetPipeFormatRequestForWrite 호출) 및 각 요청 개체를 다시 보내기(WdfRequestSend 호출)할 수 있습니다. 재사용된 요청 개체에 대한 WdfUsbTargetPipeFormatRequestForWrite 에 대한 모든 후속 호출은 매개 변수 값이 변경되지 않으면 STATUS_SUCCESS 반환합니다. 드라이버가 매번 동일한 요청 형식 메서드를 호출하지 않으면 추가 리소스가 할당될 수 있습니다.

I/O 요청이 완료된 후 상태 정보를 가져오는 방법에 대한 자세한 내용은 완료 정보 가져오기를 참조하세요.

WdfUsbTargetPipeFormatRequestForWrite 메서드 및 USB I/O 대상에 대한 자세한 내용은 USB I/O 대상을 참조하세요.

예제

다음 코드 예제는 kmdf_fx2 샘플 드라이버에서 가져옵니다. 이 예제는 쓰기 요청을 USB 파이프에 전달하는 EvtIoWrite 콜백 함수입니다. 이 예제에서는 WdfRequestRetrieveInputMemory 를 호출하여 요청의 입력 버퍼를 가져온 다음, 요청을 USB 파이프로 보낼 수 있도록 쓰기 요청의 형식을 지정합니다. 다음으로, 이 예제에서는 CompletionRoutine 콜백 함수를 등록합니다. 마지막으로 USB 파이프에 요청을 보냅니다.

VOID 
OsrFxEvtIoWrite(
    IN WDFQUEUE  Queue,
    IN WDFREQUEST  Request,
    IN size_t  Length
    )
{
    NTSTATUS  status;
    WDFUSBPIPE  pipe;
    WDFMEMORY  reqMemory;
    PDEVICE_CONTEXT  pDeviceContext;
 
    if (Length > TEST_BOARD_TRANSFER_BUFFER_SIZE) {
        status = STATUS_INVALID_PARAMETER;
        goto Exit;
    }

    pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
 
    pipe = pDeviceContext->BulkWritePipe;

    status = WdfRequestRetrieveInputMemory(
                                           Request,
                                           &reqMemory
                                           );
    if (!NT_SUCCESS(status)){
        goto Exit;
    }

    status = WdfUsbTargetPipeFormatRequestForWrite(
                                                   pipe,
                                                   Request,
                                                   reqMemory,
                                                   NULL
                                                   );
    if (!NT_SUCCESS(status)) {
        goto Exit;
    }

    WdfRequestSetCompletionRoutine(
                                   Request,
                                   EvtRequestWriteCompletionRoutine,
                                   pipe
                                   );

    if (WdfRequestSend(
                       Request,
                       WdfUsbTargetPipeGetIoTarget(pipe),
                       WDF_NO_SEND_OPTIONS
                       ) == FALSE) {
        status = WdfRequestGetStatus(Request);
        goto Exit;
    }

Exit:
    if (!NT_SUCCESS(status)) {
        WdfRequestCompleteWithInformation(
                                          Request,
                                          status,
                                          0
                                          );
    }
    return;
}

요구 사항

요구 사항
대상 플랫폼 유니버설
최소 KMDF 버전 1.0
최소 UMDF 버전 2.0
머리글 wdfusb.h(Wdfusb.h 포함)
라이브러리 Wdf01000.sys(KMDF); WUDFx02000.dll(UMDF)
IRQL <=DISPATCH_LEVEL
DDI 규정 준수 규칙 DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), RequestFormattedValid(kmdf), RequestSendAndForgetNoFormatting(kmdf), RequestSendAndForgetNoFormatting2(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf)

추가 정보

WdfUsbTargetPipeFormatRequestForRead