如何使用Windows API重置USB设备?

Isa*_*ses 8 usb winapi

您是否知道使用Windows XP API重置USB总线的方法?换句话说,我希望操作系统能够启动当前连接的任何USB设备,然后重新自动检测所有内容.

我知道devcon,我想我可以对它进行系统调用,但我希望直接调用API.

Ily*_*lya 12

从内核模式:您可以通过IOCTL_INTERNAL_USB_CYCLE_PORT向其PDO 发送一个特定的USB设备来重新连接,就好像它已被拔掉并重新插入一样.(这只能通过内核模式完成,例如通过辅助驱动程序.)此"循环"操作将导致USB重置,之后将重新枚举设备.例如,如果设备带有不同的USB设备描述符,则可以匹配不同的驱动程序.

从用户模式:您可以通过CfgMgr API弹出设备来完成此操作.例如,要遍历所有USB集线器并弹出所有设备:

  1. 发现有设备接口的所有设备GUID_DEVINTERFACE_USB_HUBSetupDiGetClassDevs(... DIGCF_DEVICEINTERFACE).
  2. 枚举返回的设备信息集(SetupDiEnumDeviceInfo).
  3. 对于每个设备,获取DevInst成员:
    1. 调用CM_Get_Child(DevInst)然后CM_Get_Sibling重复遍历集线器的所有子节点(即USB设备).
    2. 对于每个子节点,请致电CM_Request_Device_Eject.


Pet*_*man 2

好吧,用户可以使用Setup API(SetupDiXXX 函数)枚举系统中的USB 设备,然后对每个设备调用WinUsb_ResetPipe,但我不确定这是否是您正在寻找的。我已经有一段时间没有使用 USB 设备了,但我记得,没有标准的方法来重置设备(即模拟断电/通电循环)。如果特定设备可能,则必须向驱动程序发送适当的 IOCTL(使用 DeviceIOControl)。IOCTL 因制造商而异。