Windows下USB百科
+ -

Windows系统实现USB设备的拨出与重新插入

2022-08-01 629 0

最近在搞USBHOUND,原理比较简单,但是涉及的东西还是比较多,这不,为了搞清楚URB之间的传递脉路,又开始进入了USBCCGP淅代码中。

USBCCGP是Windows系统中关于USB比较重要的一个驱动,其实原了USB物理复合设备到逻辑设备的基本功能,其中有大量的关于USB相关处理请求,是值得我们在开发USB驱动时借鉴。

这里我们注意到两个IOCTL,分别为:

  • IOCTL_INTERNAL_USB_RESET_PORT:用于USB设备端口的复位

    A driver can use this request to reset the upstream port of the device it manages. After a successful reset, the bus driver reselects the configuration and any alternative interface settings that the device had before the reset occurred. All pipe handles, configuration handles and interface handles remain valid.

  • IOCTL_INTERNAL_USB_CYCLE_PORT:模拟USB设备的拨出与再插入。

    This I/O request simulates a device unplug and replug on the port associated with the PDO.

以上的两个IOCTL功能类似,并且不能实现重入,并且是发给真实的物理设备的,故在USBCCPG的FDO中对其下层PDO操作。。

        case IOCTL_INTERNAL_USB_RESET_PORT:
        case IOCTL_INTERNAL_USB_CYCLE_PORT:
            if (parentFdoExt->state == STATE_STARTED){
                status = ParentResetOrCyclePort(parentFdoExt, irp, ioControlCode);
            }
            else {
                DBGERR(("ParentInternalDeviceControl (IOCTL_INTERNAL_USB_RESET_PORT): BAD PNP state! - parent has state %xh.", parentFdoExt->state));
                status = STATUS_DEVICE_NOT_READY;
            }
            break;

并且,这里对该设备执行这两个操作,也只能是正常工作并已经启动了的设备。其处理函数是通过ParentResetOrCyclePort实现的。
其大致原理是对该请求IRP进行判断是否是有相同的IRP已经在执行,如果已经有,则将该IRP pending,并持入待完成队列。如果没有,则同步执行给下层设备PDO.当执行完成时,则完成已经挂起的所有IRP,实现多个相同的IRP请求OVERLAP功能。

/*

  • Some redundant RESET or CYCLE irps may have been sent while we
  • were processing this one, and gotten queued.
  • We’ll complete these now that the parent has been reset.
    */

不过在应用层其功能实现,应该和USBTREEVIEW这个操作有关,详细的可以参见USBVIEW代码。
USBTREEVIEW

这里标记一下。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

BOT MASS_STORAGE_RESET
Bulk-Only Mass Storage Reset类特定请求是USB大容量存储设备独有的。 该特定类请求的功能用于复位大容量存储设备和与之关联的接口。通知设备接下来的批量端点输出数据为命令块包(CBW)。由于该请求是控制请求,所以是通过端点0发送的。在设备完成该请求即复位之前,设备应......
TYPE-C PD供电协议常用功能序列(接口数据包开始SOP,线缆数据包开始SOP''、硬件复位、线缆复位
使用TYPE-C PD供电协议信号-4b5b编码对照表的序列组合,可以组成一些常用的功能序列。硬件复位hard Reset硬件复位信令是为了被物理层识别而发送的一组有序字节。硬复位信号顺序集定义为:三个RST-1 K代码,后跟一个RST-2 K代码。硬件复位的功能是对接口和线缆进行复位K......
USB高速基础知识
USB 2.0 中引入了对规范的高速添加,以响应 Firewire 的更高速度。由于 High Speed 是事后才添加的,并且必须在不影响性能的情况下保持兼容性,所以我们将保留对 High Speed 的描述,直到我们涵盖了原始规范的基础知识数据传输高速实现的数据速率为 480 Mb/s。这需要......
USB设备复位、挂起和恢复命令
USB主机除了在正常的操作期间发送到设备的控制命令外,主机还可以发出三种独特的信号条件:复位、挂起或恢复挂起的设备。设备复位RESET在枚举过程中,主机向设备发出复位信号。注意此USB 复位与硬件或上电复位不相同,是两个概念。USB 复位的目的是设置设备的软件状态,以便进行枚举。当 D- 和 D......
HID键盘鼠标复位报告描述符
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x02, // USAGE (Mouse) 0xa1, 0x01, ......
USB设备通过BUSHOUND抓包IRP被取消USTS状态为0xC0010000
通过BUSHOUND抓包内容为: 16.0 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTOR 336us 16.0 32 IN 09 02 20 00 ......
Windows系统实现USB设备的拨出与重新插入
最近在搞USBHOUND,原理比较简单,但是涉及的东西还是比较多,这不,为了搞清楚URB之间的传递脉路,又开始进入了USBCCGP淅代码中。USBCCGP是Windows系统中关于USB比较重要的一个驱动,其实原了USB物理复合设备到逻辑设备的基本功能,其中有大量的关于USB相关处理请求,是值得我......
复位USB端口设备IOCTL_USB_HUB_CYCLE_PORT
在设备管理器中通过设备的实例ID查找到设备后,然后确定设备端口中,再根据设备端口号获取其父设备即USB集本器,打开集线器,发送IOCTL_USB_HUB_CYCLE_PORT 请求来复位集线器端口达到复位设备。IOCTL_USB_HUB_CYCLE_PORT在Vista和Windows 7下不支持......
通过软件层复位重启USB设备源代码
复位USB设备,这样USB设备会重新枚举加载void RestartDevice(char* strHardWareId){ HDEVINFO devs = INVALID_HANDLE_VALUE; devs = SetupDiGetClassDevs(NULL, NULL, ......
USBIP 复位集线器下游端口/IOCTL_INTERNAL_USB_RESET_PORT
向USB集线器下发的IOCTRL之一就是IOCTL_INTERNAL_USB_RESET_PORT。用于复位USB集线器的下游端口。static NTSTATUSstore_urbr_submit(PIRP irp, struct urb_req *urbr){... case IO......
USB集线器复位端口
USB集线器复位端口使用的IOCTL为IOCTL_INTERNAL_USB_RESET_PORT,即当需要复位USB集线器的某个端口时,只需要对该USB集线器下发该请求即可。复位端口对应的URB功能号为:USB_REQUEST_SET_FEATURE.对应的USB集线器类请求为:Requ......
Windows复位USB集线器HUB端口设备RestartUsbPort
本人描述了如何在 Windows 下使用IOCTL_USB_HUB_CYCLE_PORT 重新启动USB端口。具体过程为:通过给定的设备实例ID在 Windows设备管理中查找USB 备、确定使用的 USB 端口号、获取其父设备(其 USB 集线器)、打开集线器并执行 IOCTL_USB_HUB_C......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!