WdfUsbTargetDeviceCreateIsochUrb 函数 (wdfusb.h)

[仅适用于 KMDF]

WdfUsbTargetDeviceCreateIsochUrb 方法分配一个不连续的 USB 请求块(URB)。

语法

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 结构的内容初始化为零。 此参数是可选的,可以是 NULL。

返回值

WdfUsbTargetDeviceCreateIsochUrb 如果作成功,则返回STATUS_SUCCESS。 否则,此方法可以返回以下值之一:

返回代码 描述
STATUS_INVALID_PARAMETER
检测到无效参数。
STATUS_INVALID_DEVICE_STATE
驱动程序在调用 WDF_USB_DEVICE_CREATE_CONFIG_INIT时未指定客户端协定版本。
STATUS_INSUFFICIENT_RESOURCES
内存不足。
 

此方法还可以 返回其他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)
Wdf01000.sys(请参阅框架库版本控制。
IRQL <=DISPATCH_LEVEL
DDI 符合性规则 DriverCreate(kmdf)

另请参阅

WdfUsbTargetDeviceCreateUrb

WdfUsbTargetDeviceCreateWithParameters