USBIP解读及源码分析
+ -

USBIP虚拟控制器和根集线器HUB的设备信息分析

2021-11-18 135 1

USBIP是一套可以实现USB远程设备的本机映射,这样就像在本地操作目标USB设备一样。其原理是在本地端通过安装一个虚拟的USB根控制器,根集线器,同时虚拟出4个USB端口,当远程USB设备连接到远程机器时,可以把远程设备的USB信息通过网络传输到本地,在本地的虚拟USB端口虚拟一个相同的设备,这样本地机器在操作这个虚拟的设备时,通过网络就像操作远程设备一样。这个功能相当于一个网络硬盘一样,只是这玩意用于USB设备。

USBIP代码开源,本人拿到的这一套代码比较老,不过还好支持X64系统,在Win10上安装有一点小问题,本人经过排查并修改了这个BUG.但这并不妨碍本人这一套代码的敬佩。

USBIP的工程目录

USBIP的工程目录如下图所示,有设备端的,有主机端的,有关于网络通讯端,也有公共的代码。本人现在并未完全研究,所以也暂时说不上来这些代码的功能,但并不妨碍我们对这些代码有一个认识.
USBIP的工程目录

工程名 输出 类型
attacher attacher.exe 应用
libdrv libdrv.lib 驱动
usbip_common usbip_common.lib
usbip_stub usbip_stub.sys 驱动
usbip_vhci usbip_vhci.sys 驱动
usbip_vhci_ude usbip_vhci_ude.sys 驱动
usbipd usbipd.exe 应用

USBIP编译后的

USBIP整个工程编译完成后如下图:
编译后的USBIP
除过本人调试要用的intall.bat和Devcon.exe,剩下的都是编译后的文件。

USBIP的安装

在主机端即需要虚拟USB设备端,是需要先安装虚拟USB控制器和虚拟USB集线器的。不过实际我们只需要安装根控制器,而根集线器会自动安装。

USBIP使用如下命令安装:

usbip.exe install -w

usbip.exe对应的工程为usbip,而且该工程引用了usbip_common编译后的lib文件。

而本人通过devcon也可以使用如下方式安装:

CD /d %~dp0
devcon.exe install usbip_root.inf "USBIPWIN\root"

执行完成以上命令后,就可以看到USBIP虚拟控制器和根集线器的驱动安装完成。
我们在设备管理器中可以看到如下:
设备管理器中USBIP

我们对设备树进行整理:

名称 sys文件 inf文件 硬件ID
usbip-win VHIC Root usbip_vhic.sys usbip_root.inf USBIPWIN\root
usbip-win VHCI usbip_vhic.sys usbip_vhci.inf(oem115.inf) USBIPWIN\vhci
usbip-win VHUB usbip_vhic.sys usbip_vhci.inf(oem115.inf) USB\ROOT_HUB&VID1209&PID8250&REV0000

我们也可以通过USBTreeview来看到设备树,其中VHCI-USB控制器的信息如下图:
VHCI-USB控制器


    ===================== USB Host Controller =======================

        +++++++++++++++++ Device Information ++++++++++++++++++
Device Description       : usbip-win VHCI
Device Path 1            : \\?\USBIPWIN#vhci#1&79f5d87&58#{3abf6f2d-71c4-462a-8a92-1e6861e6af27} (GUID_DEVINTERFACE_USB_HOST_CONTROLLER)
Device Path 2            : \\?\USBIPWIN#vhci#1&79f5d87&58#{d35f7840-6a0c-11d2-b841-00c04fad5171}
Kernel Name              : \Device\0000007c
Device ID                : USBIPWIN\VHCI\1&79F5D87&58
Hardware IDs             : USBIPWIN\vhci
Driver KeyName           : {36fc9e60-c465-11cf-8056-444553540000}\0116 (GUID_DEVCLASS_USB)
Driver                   : \SystemRoot\System32\drivers\usbip_vhci.sys (Version:   Date: 2021-04-14)
Driver Inf               : C:\Windows\inf\oem115.inf
Legacy BusType           : PNPBus
Class                    : USB
Class GUID               : {36fc9e60-c465-11cf-8056-444553540000} (GUID_DEVCLASS_USB)
Service                  : usbip_vhci
Enumerator               : USBIPWIN
Location Info            : Root
Manufacturer Info        : usbip-win
Capabilities             : 0x00 (-)
Status                   : 0x0180200A (DN_DRIVER_LOADED, DN_STARTED, DN_DISABLEABLE, DN_NT_ENUMERATOR, DN_NT_DRIVER)
Problem Code             : 0
Address                  : 1
HcDisableSelectiveSuspend: 0
EnableSelectiveSuspend   : 0
SelectiveSuspendEnabled  : 0
EnhancedPowerMgmtEnabled : 0
IdleInWorkingState       : 0
WakeFromSleepState       : 0
Power State              : D0 (supported: D0, D3)
 Child Device 1          : usbip-win VHUB
  Device Path            : \\?\USB#ROOT_HUB#2&31d71e8d&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} (GUID_DEVINTERFACE_USB_HUB)
  Kernel Name            : \Device\0000007d
  Device ID              : USB\ROOT_HUB\2&31D71E8D&0
  Class                  : USB
  Driver KeyName         : {36fc9e60-c465-11cf-8056-444553540000}\0117 (GUID_DEVCLASS_USB)
  Service                : usbip_vhci

        --------------- USB Hostcontroller Info0 --------------
PciVendorId              : 0x0000
PciDeviceId              : 0x0000
PciRevision              : 0x00
NumberOfRootPorts        : 0x01 (1 Ports)
ControllerFlavor         : 0x3E8 (1000 = EHCI_Generic)
HcFeatureFlags           : 0x00
 Port Power Switching    : no
 Selective Suspend       : no
 Legacy BIOS             : no

Roothub Symbolic Link    : USB#ROOT_HUB#2&31d71e8d&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8}

BusStatistics Error      : ERROR_INVALID_FUNCTION

DriverVersion Error      : ERROR_INVALID_FUNCTION

BandwidthInfo Error      : ERROR_INVALID_FUNCTION

        -------- USB Hostcontroller Power States Info ---------
SystemState              : S0    S1    S2    S3    S4    S5    
HcDevicePowerState       : D0    --    --    --    D3    --    
HcDeviceWake             : --    --    --    --    --    --    
HcSystemWake             : --    --    --    --    --    --    
RhDevicePowerState       : --    D3    D3    D3    D3    --    
RhDeviceWake             : D2    D2    D2    D2    D2    D2    
RhSystemWake             : S0    S0    S0    S0    S0    S0    
LastSystemSleepState     : --    --    --    --    --    --    
CanWakeup                : no    no    no    no    no    no    
IsPowered                : no    no    no    no    no    no

根集线器HUB的信息如下图:
集线器HUB的信息


    ========================= USB Root Hub =========================
Sum of Hubs and Devices  : 0
Sum of Endpoints         : 0

        +++++++++++++++++ Device Information ++++++++++++++++++
Device Description       : usbip-win VHUB
Device Path              : \\?\USB#ROOT_HUB#2&31d71e8d&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} (GUID_DEVINTERFACE_USB_HUB)
Kernel Name              : \Device\0000007d
Device ID                : USB\ROOT_HUB\2&31D71E8D&0
Hardware IDs             : USB\VID_1209&PID_8250&REV_0000
Driver KeyName           : {36fc9e60-c465-11cf-8056-444553540000}\0117 (GUID_DEVCLASS_USB)
Driver                   : \SystemRoot\System32\drivers\usbip_vhci.sys (Version:   Date: 2021-04-14)
Driver Inf               : C:\Windows\inf\oem115.inf
Legacy BusType           : PNPBus
Class                    : USB
Class GUID               : {36fc9e60-c465-11cf-8056-444553540000} (GUID_DEVCLASS_USB)
Service                  : usbip_vhci
Enumerator               : USB
Location Info            : VHCI
Manufacturer Info        : usbip-win
Capabilities             : 0x00 (-)
Status                   : 0x0180200A (DN_DRIVER_LOADED, DN_STARTED, DN_DISABLEABLE, DN_NT_ENUMERATOR, DN_NT_DRIVER)
Problem Code             : 0
Address                  : 1
HcDisableSelectiveSuspend: 0
EnableSelectiveSuspend   : 0
SelectiveSuspendEnabled  : 0
EnhancedPowerMgmtEnabled : 0
IdleInWorkingState       : 0
WakeFromSleepState       : 0
Power State              : D0 (supported: D0, D3)

        ------------------- USB Hub Descriptor -----------------
bDescriptorLength        : 0x09 (9 bytes)
bDescriptorType          : 0x29 (Hub Descriptor)
bNumberOfPorts           : 0x06 (6 Ports)
wHubCharacteristics      : 0x0000
 Power switching         : Ganged
 Compound device         : No
 Over-current protection : Global
 TT Think Time           : At most 8 FS bit times
 Port Indicators         : Not supported
bPowerOnToPowerGood      : 0x01 (2 ms)
bHubControlCurrent       : 0x01 (1 mA)
DeviceRemovable          : 0x00
 Bit 0                   : 0 (reserved, any value)
 Bit 1                   : 0 (Device at Port 1 is removable)
 Bit 2                   : 0 (Device at Port 2 is removable)
 Bit 3                   : 0 (Device at Port 3 is removable)
 Bit 4                   : 0 (Device at Port 4 is removable)
 Bit 5                   : 0 (Device at Port 5 is removable)
 Bit 6                   : 0 (Device at Port 6 is removable)
 Bit 7                   : 0 (unused, must be 0)
PowerControlMask         : 0x00
Data (HexDump)           : 09 29 06 00 00 01 01 00 00                        .).......
HubIsBusPowered          : 0x00 (Self Powered)

        -------------- Extended USB Hub Descriptor -------------
HubType                  : USB Root Hub
HighestPortNumber        : 6

        ------------------- USB Hub Descriptor -----------------
bDescriptorLength        : 0x09 (9 bytes)
bDescriptorType          : 0x29 (Hub Descriptor)
bNumberOfPorts           : 0x06 (6 Ports)
wHubCharacteristics      : 0x0000
 Power switching         : Ganged
 Compound device         : No
 Over-current protection : Global
 TT Think Time           : At most 8 FS bit times
 Port Indicators         : Not supported
bPowerOnToPowerGood      : 0x01 (2 ms)
bHubControlCurrent       : 0x01 (1 mA)
DeviceRemovable          : 0x00
 Bit 0                   : 0 (reserved, any value)
 Bit 1                   : 0 (Device at Port 1 is removable)
 Bit 2                   : 0 (Device at Port 2 is removable)
 Bit 3                   : 0 (Device at Port 3 is removable)
 Bit 4                   : 0 (Device at Port 4 is removable)
 Bit 5                   : 0 (Device at Port 5 is removable)
 Bit 6                   : 0 (Device at Port 6 is removable)
 Bit 7                   : 0 (unused, must be 0)
PowerControlMask         : 0x00
Data (HexDump)           : 09 29 06 00 00 01 01 00 00                        .).......

        ----------------- USB Hub Capabilities ----------------
HighSpeedCapable         : No
HighSpeed                : No
MultiTtCapable           : Yes
HubIsMultiTt             : Yes
ArmedWakeOnConnect       : Yes
IsBusPowered             : No
IsRoot                   : Yes
Data (HexDump)           : BC FF FF FF                                       ....

0 篇笔记 写笔记

USBIP整体架构
在普通的电脑上,想使用USB设备,必须将插入到主机。USBIP却可以通过网络,让主机访问其他主机上的外部设备,而用户程序完全感知不到区别。usbip的文章在这里:https://pdfs.semanticscholar.org/c7c4/cb054d75810fdb0a2affa11c288b76......
USBIP虚拟控制器和根集线器HUB的设备信息分析
USBIP是一套可以实现USB远程设备的本机映射,这样就像在本地操作目标USB设备一样。其原理是在本地端通过安装一个虚拟的USB根控制器,根集线器,同时虚拟出4个USB端口,当远程USB设备连接到远程机器时,可以把远程设备的USB信息通过网络传输到本地,在本地的虚拟USB端口虚拟一个相同的设备,这样......
USBIP虚拟控制器安装命令过程分析
USBIP虚拟控制器其自带的安装命令为:usbip.exe install -w可以看到,这是一个明显的自定义命令。这里一个比较有意思的是对命令行进行解析,使用的函数是getopt_long。在介绍这个命令之前,我们先介绍几个命令行参数的函数。命令行的长短项之分命令行分为长项和短项,我们一般使......
USBIP 设备树层次分析
通过前面知道,usbip_vhci工程实现的是pnp管理器虚拟出来的PDO的FDO,但同样也是这个FDO创建的PDO虚拟根USB控制器和其子设备HUB的驱动程序。USBIP设备硬件ID名称sys文件inf文件硬件IDusbip-win VHIC Rootusbip_vhic......
USBIP 驱动入口DriverEntry和vhci_driverUnload函数
无论该驱动被安装几次,DriverEntry和卸载函数只执行一次。DriverEntryWindows驱动和应用层一样,也有个入口函数,只是这个名字叫做DriverEntry。在DriverEntry中应实现的是该驱动各个IRP类类型的回调函数。PAGEABLE NTSTATUSDriverE......
USBIP 创建设备AddDevice
USBIP的AdDevice函数为vhci_add_device。DriverEntry(__in PDRIVER_OBJECT drvobj, __in PUNICODE_STRING RegistryPath){... drvobj->DriverExtension->......
USBIP 创建FDO设备和子设备PDO
设备创建由add_vdev函数实现,具体过程为:使用vdev_create创建设备建立自己的设备链表将创建的FDO和PDO使用IoAttachDeviceToDeviceStack函数关联最后根据设备类型进行初始化static PAGEABLE NTSTATUSadd_vdev(__in P......
USBIP FDO和PDO设备类型及结构体大小
设备类型typedef enum { VDEV_ROOT,//虚拟根设备FDO VDEV_CPDO,//虚拟USB控制器PDO VDEV_VHCI,//USB控制器FDO VDEV_HPDO,//USB根HUB PDO VDEV_VHUB, //USB根HUB......
USBIP设备启动IRP_MN_START_DEVICE
在主功能号为IRP_MJ_PNP的子功能号里,使用IRP_MN_START_DEVICE执行设备的启动。DriverEntry函数中为:drvobj->MajorFunction[IRP_MJ_PNP] = vhci_pnp;vhci_pnp(__in PDEVICE_OBJECT de......
USBIP 虚拟根设备(VDEV_ROOT)FDO的初始化过程
AddDeviceUSBIP使用devcon安装根设备驱动后,会创建其对应的PDO,这时系统会加载我们的驱动调用AddDevice函数创建PDO,进入进行堆栈。devcon.exe install vaudio.inf "USBIPWIN oot"我们在之前的创建设备Add......
USBIP 虚拟控制器设备(VDEV_CPDO)PDO的初始化过程
IRP_MN_QUERY_ID/BusQueryDeviceIDPAGEABLE NTSTATUSpnp_query_id(pvdev_t vdev, PIRP irp, PIO_STACK_LOCATION irpstack){ NTSTATUS status = STATUS_......
USBIP 虚拟控制器设备(VDEV_VHCI)FDO的初始化过程
虚拟ROOT总线FDO创建了虚拟USB控制器PDO之后,系统通过各种IRP_MJ_PNP收集完物理设备的信息之后,开始根据其硬件ID进行设备驱动批配,批配成功后,装载驱动并调用其AddDevice之后,开始FDO的创建过程。通过前面的可知,USBIP实现的根驱动,USB控制器、HUB和设备PDO的S......
USBIP 集线器PDO(VDEV_HPDO)的初始化过程
USB集线器其实也是USB设备的一类,其设备分类分类为0x09。和USBIP虚拟的控制器(VDEV_CPDO)类似,USB控制器创建了其PDO之后,会通过IRP_MN_QUERY_DEVICE_RELATIONS返回USB集线器HUB的PDO设备列表。PNP管理器收到有新的设备之后,会开始收集这个P......
USBIP 虚拟集线器FDO子设备的管理
IRP_MN_QUERY_DEVICE_RELATIONS这得从IRP_MN_QUERY_DEVICE_RELATIONS来谈起,好像有点看的不是很明白。先把上一节的代码复制过来,看一下:static PAGEABLE NTSTATUSget_bus_relations_vhub(pvhub_d......
USBIP 虚拟集线器FDO(VDEV_VHUB )的初始化
AddDevice执行vhci_add_device,返回的设备类型为VDEV_VHUB,集线器HUB的FDO类型。然后初始化HUB的FDO,使用init_dev_vhub(vdev);函数实现static PAGEABLE voidinit_dev_vhub(pvdev_t vdev){ ......
作者信息
USB中文网
B站搜索 站长漫谈 看视频。
pnpon内核开网,USB中文网,
busrom硬核技术网站长
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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