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
USB 设备对象的句柄,该对象是从之前调用 WdfUsbTargetDeviceCreateWithParameters 获取的。
[in, optional] Attributes
指向调用方提供的 WDF_OBJECT_ATTRIBUTES 结构的指针,该结构包含新内存对象的属性。 如果驱动程序提供此参数,则结构的 ParentObject 成员必须是 WDFUSBDEVICE) (USB 设备对象,或者是框架创建的 WDFREQUEST) (请求对象,或者其父链导致其中一种类型的任何对象。 此参数是可选的,可以WDF_NO_OBJECT_ATTRIBUTES。
[in] NumberOfIsochPackets
指定系统在 URB 中为其分配内存的常时等量数据包数。
[out] UrbMemory
指向 WDFMEMORY 类型位置的指针,该位置接收框架内存对象的句柄。
[out, optional] Urb
指向 URB 结构的指针,该结构接收新的常时等量 URB 的地址。 框架将 URB 结构的内容初始化为零。 此参数是可选的,可以为 NULL。
返回值
如果操作成功,WdfUsbTargetDeviceCreateIsochUrb 将返回STATUS_SUCCESS。 否则,此方法可返回以下值之一:
返回代码 | 说明 |
---|---|
|
检测到无效的参数。 |
|
驱动程序在调用 WDF_USB_DEVICE_CREATE_CONFIG_INIT 时未指定客户端协定版本。 |
|
可用内存不足。 |
此方法还可能返回其他 NTSTATUS 值。
注解
在调用 WdfUsbTargetDeviceCreateIsochUrb 之前,驱动程序必须调用 WdfUsbTargetDeviceCreateWithParameters。 如果成功, WdfUsbTargetDeviceCreateIsochUrb 会向描述新分配的常时等量 URB 的框架内存对象返回句柄。
驱动程序可以在调用 WdfUsbTargetDeviceFormatRequestForUrb 之前调用 WdfUsbTargetDeviceCreateIsochUrb 来分配 URB 结构。
通常,驱动程序从请求处理程序中调用 WdfUsbTargetDeviceCreateIsochUrb。
删除父对象时,将删除内存对象及其缓冲区。 驱动程序还可以通过调用 WdfObjectDelete 来删除内存对象及其缓冲区。
有关相关信息,请参阅 WdfUsbTargetDeviceCreateUrb 的“备注”部分。
示例
以下代码示例基于 Isorwr 示例驱动程序中的 PerformIsochTransfer 例程。 该示例调用 WdfUsbTargetDeviceCreateIsochUrb 来分配常量 USB 请求块。 该示例确定保存常量传输请求所需的字节数,然后在 URB 中手动配置 URB 标头和常时等量数据包。 此时,驱动程序可以调用 WdfUsbTargetPipeFormatRequestForUrb,如 WdfUsbTargetDeviceCreateUrb 中的示例所示。
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) |
Library | Wdf01000.sys (请参阅框架库版本控制.) |
IRQL | <=DISPATCH_LEVEL |
DDI 符合性规则 | DriverCreate (kmdf) |