本主题介绍从版本 2 开始的内核模式驱动程序框架 (KMDF) 或用户模式驱动程序框架 (UMDF) 驱动程序可以使用 Windows 驱动程序框架 (WDF) 提供的 USB 设备对象方法执行的操作。
它包含以下部分:
有关编写基于 KMDF 的简单 USB 客户端驱动程序的分步说明,请参阅如何编写第一个 USB 客户端驱动程序(KMDF)。
创建 USB 设备对象
若要使用框架的 USB I/O 目标对象(WDFUSBDEVICE、WDFUSBINTERFACE 和 WDFUSBPIPE),客户端驱动程序必须首先调用 WdfUsbTargetDeviceCreateWithParameters 来创建 USB 设备对象。 通常,驱动程序从其 EvtDevicePrepareHardware 回调函数调用 WdfUsbTargetDeviceCreateWithParameters。
当驱动程序调用 WdfUsbTargetDeviceCreateWithParameters 时,框架将创建一个 WDFUSBDEVICE 对象并将其与表示 USB 设备的 FDO 相关联。 该方法向新的框架 USB 设备对象返回句柄,然后 USB 客户端驱动程序可以使用该句柄与物理设备通信。
调用 WdfUsbTargetDeviceCreateWithParameters 后,驱动程序可以调用 WdfUsbTargetDeviceGetDeviceDescriptor 和 WdfUsbTargetDeviceRetrieveConfigDescriptor 从设备获取 USB 描述符。 这些描述符包含有关设备的第一个配置、其接口设置及其定义的终结点的信息。 (USB 描述符是在官方 USB 规范中定义的。
配置 USB 设备
WdfUsbTargetDeviceCreateWithParameters 方法还会为设备第一个配置包含的每个 USB 接口创建框架 USB 接口对象。
调用 WdfUsbTargetDeviceCreateWithParameters 后,客户端驱动程序必须调用 WdfUsbTargetDeviceSelectConfig 以选择配置。 此方法为所选配置中接口的每个备用设置创建框架接口对象。
该方法还创建管道对象,这些对象表示所选配置的每个接口的每个备用设置中定义的终结点。
选择配置后,可以根据需要更改配置的接口 的备用设置 。
还可以调用 WdfUsbTargetDeviceSelectConfig 来取消配置设备。
有关相关信息,请参阅:
获取设备信息
配置设备后,客户端驱动程序可以调用以下方法来获取有关 USB 设备的信息:
WdfUsbTargetDeviceQueryUsbCapability
确定主机控制器和 USB 驱动程序堆栈是否支持特定功能。 在调用 WdfUsbTargetDeviceQueryUsbCapability 之前,驱动程序必须调用 WdfUsbTargetDeviceCreateWithParameters。
WdfUsbTargetDeviceGetIoTarget
返回与 USB 设备关联的 I/O 目标对象的句柄。 驱动程序可以将此句柄传递给 WdfRequestSend 或 WdfIoTargetStop。
WdfUsbTargetDeviceRetrieveInformation
检索与 USB 设备关联的版本和功能信息。
WdfUsbTargetDeviceIsConnectedSynchronous(仅 KMDF)
确定设备是否已连接。
WdfUsbTargetDeviceRetrieveCurrentFrameNumber(仅 KMDF)
检索当前的 USB 帧编号。
获取 USB 描述符
若要获取 USB 设备描述符中包含的 Unicode 字符串,驱动程序可以调用以下任一方法:
WdfUsbTargetDeviceGetDeviceDescriptor
获取设备的 USB 设备描述符。
WdfUsbTargetDeviceRetrieveConfigDescriptor
获取设备的 USB 配置描述符、接口描述符和终结点描述符。
WdfUsbTargetDeviceQueryString
将 Unicode 字符串复制到驱动程序提供的缓冲区。
WdfUsbTargetDeviceAllocAndQueryString
将 Unicode 字符串复制到框架提供的缓冲区。
WdfUsbTargetDeviceFormatRequestForString
格式化 Unicode 字符串请求。 驱动程序可以调用 WdfRequestSend 以同步或异步发送请求。
发送控制传输
驱动程序可以调用以下方法来发送 I/O 请求,该请求描述标准、设备类特定或特定于供应商的 USB 控制传输。
WdfUsbTargetDeviceSendControlTransferSynchronously
同步发送 USB 控制传输请求。
WdfUsbTargetDeviceFormatRequestForControlTransfer
设置 USB 控制传输请求的格式。 驱动程序可以调用 WdfRequestSend 以同步或异步发送请求。
有关相关信息,请参阅 如何发送 USB 控制传输。
重置和电源循环设备的端口
您的驱动程序可以调用以下方法来重置或重启设备连接到的 USB 端口:
WdfUsbTargetDeviceResetPortSynchronously
同步地发送请求以重置设备的 USB 端口。
WdfUsbTargetDeviceCyclePortSynchronously(仅 KMDF)
同步发送设备 USB 端口电源循环的请求。
WdfUsbTargetDeviceFormatRequestForCyclePort(仅 KMDF)
格式化设备 USB 端口的电源循环请求。 驱动程序必须调用 WdfRequestSend 以同步或异步发送请求。
有关相关信息,请参阅 如何从 USB 管道错误中恢复。
将 URB 发送到设备
如果 KMDF 驱动程序通过发送包含 URB 的 I/O 请求来与其 USB 设备通信,驱动程序可以调用以下方法:
WdfUsbTargetDeviceCreateUrb(仅限 KMDF)
分配一个 USB 请求块 (URB)。 在调用 WdfUsbTargetDeviceCreateUrb 之前,驱动程序必须调用 WdfUsbTargetDeviceCreateWithParameters。
WdfUsbTargetDeviceCreateIsochUrb(仅限 KMDF)
分配一个等时 USB 请求块 (URB)。 在调用 WdfUsbTargetDeviceCreateIsochUrb 之前,驱动程序必须调用 WdfUsbTargetDeviceCreateWithParameters。
WdfUsbTargetDeviceSendUrbSynchronously(仅 KMDF)
同步发送包含 URB 的 I/O 请求。
WdfUsbTargetDeviceFormatRequestForUrb(仅 KMDF)
设置包含 URB 的 I/O 请求的格式。 驱动程序必须调用 WdfRequestSend 以同步或异步发送请求。
WdfUsbTargetDeviceWdmGetConfigurationHandle(仅 KMDF)
返回设备的 USBD 配置句柄。 某些 URB 需要使用此句柄。
有关 URB 的常规概念背景,请参阅 分配和生成 URB。