WdfUsbTargetDeviceCreateIsochUrb 함수(wdfusb.h)
[KMDF에만 적용]
WdfUsbTargetDeviceCreateIsochUrb 메서드는 URB(등시 USB 요청 블록)를 할당합니다.
구문
NTSTATUS WdfUsbTargetDeviceCreateIsochUrb(
[in] WDFUSBDEVICE UsbDevice,
[in, optional] PWDF_OBJECT_ATTRIBUTES Attributes,
[in] ULONG NumberOfIsochPackets,
[out] WDFMEMORY *UrbMemory,
[out, optional] PURB *Urb
);
매개 변수
[in] UsbDevice
WdfUsbTargetDeviceCreateWithParameters에 대한 이전 호출에서 가져온 USB 디바이스 개체에 대한 핸들입니다.
[in, optional] Attributes
새 메모리 개체에 대한 특성을 포함하는 호출자가 제공한 WDF_OBJECT_ATTRIBUTES 구조체에 대한 포인터입니다. 드라이버가 이 매개 변수를 제공하는 경우 구조체의 ParentObject 멤버는 프레임워크에서 만든 USB 디바이스 개체(WDFUSBDEVICE) 또는 요청 개체(WDFREQUEST) 또는 부모 체인이 이러한 형식 중 하나로 이어지는 개체여야 합니다. 이 매개 변수는 선택 사항이며 WDF_NO_OBJECT_ATTRIBUTES 수 있습니다.
[in] NumberOfIsochPackets
시스템이 URB에서 메모리를 할당하는 등시 패킷 수를 지정합니다.
[out] UrbMemory
프레임워크 메모리 개체에 대한 핸들을 수신하는 WDFMEMORY 형식의 위치에 대한 포인터입니다.
[out, optional] Urb
새 등시 URB의 주소를 수신하는 URB 구조체에 대한 포인터입니다. 프레임워크는 URB 구조체의 콘텐츠를 0으로 초기화합니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.
반환 값
WdfUsbTargetDeviceCreateIsochUrb 은 작업이 성공하면 STATUS_SUCCESS 반환합니다. 그렇지 않으면 이 메서드는 다음 값 중 하나를 반환할 수 있습니다.
반환 코드 | 설명 |
---|---|
|
잘못된 매개 변수가 감지되었습니다. |
|
드라이버가 WDF_USB_DEVICE_CREATE_CONFIG_INIT 호출할 때 클라이언트 계약 버전을 지정하지 않았습니다. |
|
메모리가 부족했습니다. |
이 메서드는 다른 NTSTATUS 값을 반환할 수도 있습니다.
설명
WdfUsbTargetDeviceCreateIsochUrb를 호출하기 전에 드라이버는 WdfUsbTargetDeviceCreateWithParameters를 호출해야 합니다. 성공하면 WdfUsbTargetDeviceCreateIsochUrb 는 새로 할당된 등시 URB를 설명하는 프레임워크 메모리 개체에 대한 핸들을 반환합니다.
드라이버는 WdfUsbTargetDeviceRequestForUrb 를 호출하기 전에 WdfUsbTargetDeviceCreateIsochUrb를 호출하여 URB 구조를 할당할 수 있습니다.
일반적으로 드라이버는 요청 처리기 내에서 WdfUsbTargetDeviceCreateIsochUrb를 호출합니다.
부모 개체가 삭제되면 메모리 개체와 해당 버퍼가 삭제됩니다. 드라이버는 WdfObjectDelete를 호출하여 메모리 개체 및 해당 버퍼를 삭제할 수도 있습니다.
관련 정보는 WdfUsbTargetDeviceCreateUrb의 설명 섹션을 참조하세요.
예제
다음 코드 예제는 Isorwr 샘플 드라이버의 PerformIsochTransfer 루틴을 기반으로 합니다. 이 예제 에서는 WdfUsbTargetDeviceCreateIsochUrb 를 호출하여 등시 USB 요청 블록을 할당합니다. 이 예제에서는 등시 전송 요청을 보유하는 데 필요한 바이트 수를 확인한 다음 URB 헤더 및 URB에서 등시 패킷을 수동으로 구성합니다. 이 시점에서 드라이버는 WdfUsbTargetDeviceCreateUrb의 예제와 같이 WdfUsbTargetPipeFormatRequestForUrb를 호출할 수 있습니다.
USBD_PIPE_HANDLE usbdPipeHandle;
ULONG numPackets = UserBufferLength/TransferSizePerFrame;
ULONG urbSize;
PURB urb;
WDFMEMORY memory;
WDF_OBJECT_ATTRIBUTES_INIT(&objectAttribs);
objectAttribs.ParentObject = UsbDevice;
status = WdfUsbTargetDeviceCreateIsochUrb(
pDevContext->WdfUsbTargetDevice,
&objectAttribs,
0,
numPackets,
&memory,
NULL
);
urb = WdfMemoryGetBuffer(urbMemory, &urbSize);
urbSize = GET_ISO_URB_SIZE(numPackets);
usbdPipeHandle = WdfUsbTargetPipeWdmGetPipeHandle(pipe);
urb->UrbIsochronousTransfer.Hdr.Length = GET_ISO_URB_SIZE(numPackets);
urb->UrbIsochronousTransfer.Hdr.Function = URB_FUNCTION_ISOCH_TRANSFER;
urb->UrbIsochronousTransfer.PipeHandle = usbdPipeHandle;
for (packetId = 0; packetId < numberOfPackets; packetId++) {
Urb-> UrbIsochronousTransfer.IsoPacket[packetId].Offset = xxx;
Urb-> UrbIsochronousTransfer.IsoPacket[packetId].YYY = yyy;
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista |
대상 플랫폼 | 유니버설 |
최소 KMDF 버전 | 1.11 |
머리글 | wdfusb.h(Wdfusb.h 포함) |
라이브러리 | Wdf01000.sys(프레임워크 라이브러리 버전 관리 참조) |
IRQL | <=DISPATCH_LEVEL |
DDI 규정 준수 규칙 | DriverCreate(kmdf) |