Spice Windows Client 利用 USBDk 实现USB重定向

本文介绍如何在Fedora 19 64位环境下,利用mingw32和mingw64编译环境,编译spice-gtk-0.29、virt-viewer-2.0等软件,并通过安装UsbDk实现USB设备透传。文章详细记录了编译过程中的步骤及遇到的问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2016.3.15 修改,红色字体
1. 编译环境
Fedora 19 64位,mingw32 和 mingw64
2. 相关源码及工具
2.1 spice-gtk-0.29,virt-viewer-2.0,UsbDk_1.0.6_x64.msi,UsbDk_1.0.6_x86.msi
下载地址 http://www.spice-space.org/download.html
2.2 libusb
下载地址 https://github.com/libusb/libusb
3. 编译及测试
3.1 32位
3.1.1 编译 libusb,因为现有的libusb的release版本还不支持usbdk,安装官方的说法libusb 21 才会加入,所以我们现在用的是github上的一个测试版本
编译参数 mingw32-configure –enable-usbdk –enable-debug-log,最好加上debug参数,如果出错了可以方便查看。
make
make install
3.1.2 编译 spice-gtk-0.29
修改usbredir的相关源码,去掉usbclerk的分支,直接走libusb
mingw32-configure –with-gtk=2.0 –enable-usbredir=yes –with-sasl=no –enable-vala
make
make install
cd spice-common/spice-protocol
make install
3.1.3 编译 virt-viewer-2.0
mingw32-configure –with-gtk=2.0 –with-spice-gtk
make
make install
3.1.4 测试
virt-viewer 本身提供了一个nsis的打包脚本,可以直接打成一个Windows下的安装包,依赖可能不是很全,自己去编译环境下找就行了。
我的测试环境是win7 32位,安装完客户端后,安装usbdk x86的安装包,然后把UsbDkHelper.dll拷贝到remote-viewer.exe所在的目录
运行remote-viewer.exe,建议从cmd命令行下运行并且加入 –spice-debug 参数,如果崩溃或者报错的话查看命令行下的输出日志,排查错误。
我遇到的问题有两个,1. 加载UsbDkHelper.dll出错,检查下该dll是否正确 2. remote-viewer 直接崩溃,查看Windows提供的详细信息发现是ntdll.dll(我记得是叫这个名字)崩溃了,如果是这个问题的话检查一下有没有安装 mingw32-nss 这个包,有的话把它卸载掉重新编译一下spice就行了。如果还有其他的问题参考log和Windows提供的错误信息解决就行了。
至此,remote-viewer.exe已经成功运行了,插入U盘测试是否可以透传。我的测试结果还是不错的,相比之前用winUSB的驱动usbdk要给力多了,驱动转换非常快,而且稳定性也有了很大的提高。
顺便提一下,现在的spice已经加入了Windows下USB设备名称的识别功能,有兴趣的可以看一下 usbutil.c 这个文件。

 3.2 64 位
      编译方法跟32位的一样,需要注意的问题是如果你的glib版本是 2.36 的话,在64位的环境下运行会有个bug,运行remote-viewer.exe时会弹出一个窗口报错,Error in LIBGIO~1.DLL

Missing entry: g_win32_run_session_bus@16

      修改方法:
      1. 升级glib, 应该是比这个版本新的就可以
      2. 修改源码重新编译,文件 gio/gdbusaddress.c ,函数 get_session_address_dbus_launch  修改内容如下
wcscpy (args, L"\"");
wcscat (args, rundll_path);
wcscat (args, L"\" ");
wcscat (args, gio_path_short);
#if defined(_WIN64) || defined(_M_X64) || defined(_M_AMD64)
wcscat (args, L",g_win32_run_session_bus");
#elif defined (_MSC_VER)
wcscat (args, L",_g_win32_run_session_bus@16");
#else
wcscat (args, L",g_win32_run_session_bus@16");
#endif

res = CreateProcessW (rundll_path, args,
                    0, 0, FALSE,
                    NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW | DETACHED_PROCESS,
                    0, NULL /* TODO: Should be root */,
                    &si, &pi);

注: spice-gtk-0.29现在默认还是需要usbclerk的,也可以自己把它去掉。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值