WdfUsbTargetPipeFormatRequestForRead 함수(wdfusb.h)
[KMDF 및 UMDF에 적용]
WdfUsbTargetPipeFormatRequestForRead 메서드는 USB 입력 파이프에 대한 읽기 요청을 작성하지만 요청을 보내지 않습니다.
통사론
NTSTATUS WdfUsbTargetPipeFormatRequestForRead(
[in] WDFUSBPIPE Pipe,
[in] WDFREQUEST Request,
[in, optional] WDFMEMORY ReadMemory,
[in, optional] PWDFMEMORY_OFFSET ReadOffset
);
매개 변수
[in] Pipe
WdfUsbInterfaceGetConfiguredPipe호출하여 가져온 프레임워크 파이프 개체에 대한 핸들입니다.
[in] Request
프레임워크 요청 개체에 대한 핸들입니다. 자세한 내용은 다음 설명 섹션을 참조하세요.
[in, optional] ReadMemory
프레임워크 메모리 개체에 대한 핸들입니다. 이 개체는 파이프에서 데이터를 받을 버퍼를 나타냅니다. 드라이버가 WdfUsbTargetPipeSetNoMaximumPacketSizeCheck호출하지 않는 한 버퍼 크기는 파이프의 최대 패킷 크기의 배수여야 합니다. 이 버퍼에 대한 자세한 내용은 다음 주의 섹션을 참조하세요.
[in, optional] ReadOffset
선택적 바이트 오프셋 및 길이 값을 제공하는 호출자가 할당한 WDFMEMORY_OFFSET 구조체에 대한 포인터입니다. 프레임워크는 이러한 값을 사용하여 데이터 전송에 대한 읽기 버퍼 내의 시작 주소와 길이를 결정합니다. 이 포인터가 NULL 경우 데이터 전송은 버퍼의 시작 부분에서 시작되고 전송 크기는 버퍼 크기입니다.
반환 값
WdfUsbTargetPipeFormatRequestForRead 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.
반환 코드 | 묘사 |
---|---|
|
잘못된 매개 변수가 검색되었습니다. |
|
메모리가 부족했습니다. |
|
잘못된 메모리 설명자가 지정되었거나, 파이프의 형식이 잘못되었거나, 전송 방향이 잘못되었거나, 지정된 I/O 요청이 이미 I/O 대상에 큐에 대기되었습니다. |
|
Offset 매개 변수가 지정한 오프셋이 잘못되었습니다. |
|
버퍼 크기가 파이프의 최대 패킷 크기의 배수가 아닙니다. 드라이버가 WdfUsbTargetPipeSetNoMaximumPacketSizeCheck호출하지 않는 한 버퍼 크기는 파이프의 최대 패킷 크기의 배수여야 합니다. |
|
Request 매개 변수가 나타내는 I/O 요청 패킷(IRP)은 드라이버가 요청을 전달할 수 있는 충분한 IO_STACK_LOCATION 구조를 제공하지 않습니다. |
이 메서드는 다른NTSTATUS 값을 반환할 수도 있습니다.
드라이버에서 잘못된 개체 핸들을 제공하면 버그 검사가 수행됩니다.
발언
WdfUsbTargetPipeFormatRequestForRead 사용하고 그 다음에 WdfRequestSend사용하여 비동기적으로 또는 비동기적으로 읽기 요청을 보냅니다. 또는 WdfUsbTargetPipeReadSynchronously 메서드를 사용하여 읽기 요청을 동기적으로 보냅니다.
Pipe 매개 변수가 지정하는 파이프는 입력 파이프여야 하며, 파이프의 형식 WdfUsbPipeTypeBulk 또는 WdfUsbPipeTypeInterrupt 합니다.
드라이버가 I/O 큐에서 받은 I/O 요청을 전달하거나 새 요청을 만들고 보낼 수 있습니다. 두 경우 모두 프레임워크에는 요청 개체와 일부 버퍼 공간이 필요합니다.
드라이버가 I/O 큐에서 받은 I/O 요청을 전달하려면 다음을 수행합니다.
- WdfUsbTargetPipeFormatRequestForRead 메서드의 Request 매개 변수에 대해 수신된 요청의 핸들을 지정합니다.
-
수신된 요청의 출력 버퍼를 WdfUsbTargetPipeFormatRequestForRead 메서드의 ReadMemory 매개 변수에 사용합니다.
드라이버는 WdfRequestRetrieveOutputMemory 호출하여 요청의 출력 버퍼를 나타내는 프레임워크 메모리 개체에 대한 핸들을 가져오고 해당 핸들을 ReadMemory 매개 변수의 값으로 사용해야 합니다.
드라이버는 수신된 I/O 요청을 I/O 대상으로 보내는 더 작은 요청으로 나누는 경우가 많으므로 드라이버는 새 요청을 만들 수 있습니다.
새 I/O 요청을 만들려면 다음을 수행합니다.
-
새 요청 개체를 만들고 WdfUsbTargetPipeFormatRequestForRead 메서드의 Request 매개 변수에 대한 핸들을 제공합니다.
WdfRequestCreate 호출하여 하나 이상의 요청 개체를 미리 할당합니다. WdfRequestReuse호출하여 이러한 요청 개체를 다시 사용할 수 있습니다. 드라이버의 EvtDriverDeviceAdd 콜백 함수는 디바이스에 대한 요청 개체를 미리 할당할 수 있습니다.
-
버퍼 공간을 제공하고 WdfUsbTargetPipeFormatRequestForRead 메서드의 ReadMemory 매개 변수에 대한 버퍼 핸들을 제공합니다.
드라이버는 이 버퍼 공간을 프레임워크 관리 메모리에 대한 WDFMEMORY 핸들로 지정해야 합니다. 드라이버는 다음 중 하나를 수행할 수 있습니다.
- 드라이버가 새 버퍼를 I/O 대상에 전달하려는 경우 WdfMemoryCreate 또는 WdfMemoryCreatePreallocated 호출하여 새 메모리 버퍼를 만듭니다.
- 드라이버가 해당 버퍼의 내용을 I/O 대상에 전달하도록 하려면 WdfRequestRetrieveOutputMemory 호출하여 수신된 I/O 요청의 버퍼를 나타내는 메모리 개체에 대한 핸들을 가져옵니다.
동일한 요청을 사용하는 WdfUsbTargetPipeFormatRequestForRead 대한 여러 호출은 추가 리소스 할당을 발생시키지 않습니다. 따라서 WdfRequestCreate STATUS_INSUFFICIENT_RESOURCES 반환할 가능성을 줄이기 위해 드라이버의 EvtDriverDeviceAdd 콜백 함수는 WdfRequestCreate 호출하여 디바이스에 대한 하나 이상의 요청 개체를 미리 할당할 수 있습니다. 이후에 드라이버는 WdfRequestReuse호출), reformat(WdfUsbTargetPipeFormatRequestForRead호출) 및 WdfRequestCreate에 대한 이후 호출에서 STATUS_INSUFFICIENT_RESOURCES 반환 값을 위험하지 않고 각 요청 개체를 다시 사용하고(WdfRequestSend호출)수 있습니다. 다시 사용된 요청 개체에 대한 WdfUsbTargetPipeFormatRequestForRead 대한 모든 후속 호출은 매개 변수 값이 변경되지 않으면 STATUS_SUCCESS 반환합니다. (드라이버가 매번 동일한 요청 형식 지정 메서드를 호출하지 않으면 추가 리소스가 할당될 수 있습니다.)
프레임워크는 내부 URBUSBD_SHORT_TRANSFER_OK 플래그를 설정합니다. 이 플래그를 설정하면 데이터 전송의 마지막 패킷이 최대 패킷 크기보다 작을 수 있습니다.
I/O 요청이 완료된 후 상태 정보를 가져오는 방법에 대한 자세한 내용은 완료 정보 가져오기 참조하세요.
WdfUsbTargetPipeFormatRequestForRead 메서드 및 USB I/O 대상에 대한 자세한 내용은 USB I/O 대상참조하세요.
예제
다음 코드 예제는 kmdf_fx2 샘플 드라이버에서 가져옵니다. 이 예제는 읽기 요청을 USB 파이프로 전달하는 EvtIoRead 콜백 함수입니다. 이 예제에서는 WdfRequestRetrieveOutputMemory 호출하여 요청의 출력 버퍼를 가져온 다음, 요청을 USB 파이프로 보낼 수 있도록 읽기 요청의 형식을 지정합니다. 다음으로, 예제에서는 CompletionRoutine 콜백 함수를 등록합니다. 마지막으로 USB 파이프에 요청을 보냅니다.
VOID
OsrFxEvtIoRead(
IN WDFQUEUE Queue,
IN WDFREQUEST Request,
IN size_t Length
)
{
WDFUSBPIPE pipe;
NTSTATUS status;
WDFMEMORY reqMemory;
PDEVICE_CONTEXT pDeviceContext;
//
// First, validate input parameters.
//
if (Length > TEST_BOARD_TRANSFER_BUFFER_SIZE) {
status = STATUS_INVALID_PARAMETER;
goto Exit;
}
pDeviceContext = GetDeviceContext(WdfIoQueueGetDevice(Queue));
pipe = pDeviceContext->BulkReadPipe;
status = WdfRequestRetrieveOutputMemory(
Request,
&reqMemory
);
if (!NT_SUCCESS(status)){
goto Exit;
}
status = WdfUsbTargetPipeFormatRequestForRead(
pipe,
Request,
reqMemory,
NULL
);
if (!NT_SUCCESS(status)) {
goto Exit;
}
WdfRequestSetCompletionRoutine(
Request,
EvtRequestReadCompletionRoutine,
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), UsbKmdfIrql(kmdf), UsbKmdfIrql2(kmdf), UsbKmdfIrqlExplicit(kmdf) |
참고 항목
WdfRequestCompleteWithInformation