适用于 Windows 的 USB/IP
构建在 Windows 10 x64 上进行了测试,并且默认情况下为此目标配置了项目。
应该支持 x86/x64 平台。但是,我们目前没有用于测试的 x86 设置。
对于Windows 7用户,更改usbip_stub和usbip_vhci项目的目标操作系统版本Windows 7。
右键单击 Project > Properties > Driver Settings > Target OS version > Windows 7
最近支持的标签版本是 v0.1.0。v0.1.0之后的所有版本都不支持Windows 7或8,因为usbip-win开始使用Windows 10的内核库。
构建工具
Visual Studio 2019 社区 (v142)
如果设置中的平台工具集配置为 v141,也可以使用 VS 2017 (v141) 构建。
Windows SDK 10.0.18362.0(推荐)
VS 2019 (v142):需要 >= 10.0.18xxx
VS 2017 (v141):需要 >= 10.0.17xxx
Windows 驱动程序工具包 Windows 10,版本 1903 (10.0.18362)
还测试了 WDK 10.0.17134 (1803)、10.0.17763 (1809) 和 10.0.18346。
构建过程
打开 usbip_win.sln
如果使用 VS 2017 ,则应调整用户空间项目 ( usbip, usbip_common, usbipd, stubctl) 的SDK 版本。
设置证书驱动程序签名的usbip_stub和usbip_vhci项目
右键单击 Project > Properties > Driver Signing > Test Certificate
浏览到driver/usbip_test.pfx(密码:usbip)
构建解决方案或所需的项目
所有输出文件都在 {Debug,Release}/{x64,x86} 文件夹下创建。
安装
Windows USB/IP 服务器
准备一台 Linux 机器作为 USB/IP 客户端或 Windows usbip-win VHCI 客户端(在内核为 4.15.0-29 的 Ubuntu 16.04 上测试 - 在其他一些版本上观察到 USB/IP 内核模块崩溃)
# modprobe vhci-hcd
安装 USB/IP 测试证书
安装driver/usbip_test.pfx(密码:usbip)
证书应该安装到
“本地计算机”中的“受信任的根证书颁发机构”(不是当前用户)和
“本地计算机”中的“可信发布者”(不是当前用户)
启用测试签名
> bcdedit.exe /set TESTSIGNING ON
重新启动系统以应用
将usbip.exe, usbipd.exe, usb.ids, usbip_stub.sys,复制usbip_stub.inx到目标机器的文件夹中
你可以找到usbip.exe,usbipd.exe,usbip_stub.sys编译后或在输出文件夹中释放页面。
userspace/usb.ids
driver/stub/usbip_stub.inx
查找 USB 设备 ID
您可以从 usbip 列表中获取 id
> usbip.exe list -l
总线 ID 始终为 1。因此usbip.exe列表的输出显示为:
usbip.exe list -l
- busid 1-59 (045e:00cb)
Microsoft Corp. : Basic Optical Mouse v2.0 (045e:00cb)
- busid 1-30 (80ee:0021)
VirtualBox : USB Tablet (80ee:0021)
将 USB 设备绑定到 usbip 存根
下一个命令将现有的功能驱动程序替换为 usbip 存根驱动程序
这应该使用管理员权限执行
usbip_stub.inx和usbip_stub.sys文件应该在同一个文件夹中usbip.exe
> usbip.exe bind -b 1-59
跑 usbipd.exe
> usbipd.exe -d -4
TCP端口3240应该被防火墙允许
在 Linux 机器上连接 USB/IP 设备
# usbip attach -r <usbip server ip> -b 1-59
Windows USB/IP 客户端
目前,VHCI 驱动程序有 2 个版本,安装程序不同:
vhci(wdm):原始版本,通过 WDM(Windows 驱动程序模型)实现;
vhci(ude): 新开发的版本完全支持 USB 应用程序并通过 UDE(USB 设备仿真)实现,这是 MS 提供的基于 KMDF(内核模型驱动程序框架)的 USB 虚拟化框架。
准备一台 Linux 机器作为 USB/IP 服务器或 Windows usbip-win 存根服务器 -(在 Ubuntu 16.04(内核 4.15.0-29)、18.04、20.04 上测试)
# modprobe usbip-host
您可以使用虚拟usbip-vstub作为存根服务器
在 USB/IP 服务器上运行 usbipd (Linux)
# usbipd -4 -d
安装 USB/IP 测试证书
安装driver/usbip_test.pfx(密码:usbip)
证书应该安装到
“本地计算机”中的“受信任的根证书颁发机构”(不是当前用户)和
“本地计算机”中的“可信发布者”(不是当前用户)
启用测试签名
> bcdedit.exe /set TESTSIGNING ON
重新启动系统以应用
将 VHCI 驱动程序文件复制到目标机器的文件夹中
如果您正在测试vhci(ude),复制usbip.exe,usbip_vhci_ude.sys,usbip_vhci_ude.inf,usbip_vhci_ude.cat成目标机器的文件夹;
如果您正在测试vhci(wdm),复制usbip.exe,usbip_vhci.sys,usbip_vhci.inf,usbip_root.inf,usbip_vhci.cat成目标机器的文件夹;
您可以在构建后或在发布页面上找到输出文件夹中的所有文件。
安装 USB/IP VHCI 驱动程序
您可以使用usbip.exe或手动安装
使用usbip.exe安装命令
以管理员身份运行 PowerShell 或 CMD
PS> usbip.exe install
前面的命令将根据可用文件安装 UDE 驱动程序或 WDM 驱动程序
(UDE 版本优先)
PS> usbip.exe install -u 如果只有 UDE 驱动程序
PS> usbip.exe install -w 如果仅 WDM 驱动程序
vhci(ude) 手动安装
以管理员身份运行 PowerShell 或 CMD
PS> pnputil /add-driver usbip_vhci_ude.inf
启动设备管理器
从“操作”菜单中选择“添加旧硬件”。
选择“安装我从列表中手动选择的硬件”。
单击“下一步”。
单击“从磁盘安装”,单击“浏览”,选择复制的文件夹,然后单击“确定”。
单击“usbip-win VHCI(ude)”,然后单击“下一步”。
单击“完成添加/删除硬件向导”中的完成。
手动安装 vhci(wdm)
以管理员身份运行 PowerShell 或 CMD
PS> pnputil /add-driver usbip_vhci.inf
启动设备管理器
从“操作”菜单中选择“添加旧硬件”。
选择“安装我从列表中手动选择的硬件”。
单击“下一步”。
单击“从磁盘安装”,单击“浏览”,选择复制的文件夹,然后单击“确定”。
单击“USB/IP VHCI Root”,然后单击“下一步”。
单击“完成添加/删除硬件向导”中的完成。
连接远程 USB 设备
PS> usbip.exe attach -r <usbip server ip> -b 2-2
卸载驱动
PS> usbip.exe uninstall
禁用测试签名
> bcdedit.exe /set TESTSIGNING OFF
重新启动系统以应用
报告错误
usbip-win尚未准备好用于生产。我们可以通过详细的日志找到问题。
如何获取 vhci(wdm) 的 Windows 内核日志
设置注册表项以启用调试过滤器
usbip-win使用DbgPrintEx API 进行内核日志记录。
将以下内容另存为.reg文件并运行或手动插入注册表项
重新启动系统以应用
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
"IHVDRIVER"=dword:ffffffff
在测试之前运行调试日志查看器程序。
DebugView是查看日志的好工具。
如果您的测试机出现 BSOD(蓝屏死机),您应该通过远程调试获得它。
WinDbg 在虚拟机上获取日志会很好。
如何获取 vhci(ude) 的 Windows 内核日志
新的 vhci(ude) 实现使用 WPP SW 跟踪而不是 DbgPrintEx。
DebugView.exe 无法捕获 VHCI 调试消息
TraceView.exe 是一种很好的实用程序,适用于 WDK 中包含的新方法。
usbip_vhci_ude.pdb 需要文件才能轻松添加跟踪提供程序。
创建一个新的会话登录 TraceView.exe
在“提供者控制 GUID 设置”弹出对话框中选择 PDB 文件单选按钮
指定usbip_vhci_ude.pdb为 PDB 文件
您可以通过在“高级日志会话选项”中进行修改来向 WinDbg 发送实时跟踪消息。
如果您的测试机出现 BSOD(蓝屏死机),您应该通过远程调试获得它。
WinDbg 在虚拟机上获取日志会很好
如何获取usbip转发器日志
usbip-win 通过用户态转发器传输 usbip 数据包。
转发器日志是查看 usbip 数据包内部结构的最佳方式。
编辑usbip_forward.c定义DEBUG_PDU在文件的头部
编译usbip.exe或usbipd.exe
debug_pdu.log 在可执行文件运行的路径上创建。
如何获取linux内核日志
有时需要 Linux 内核日志
# dmesg --follow | tee kernel_log.txt