模拟设备通过USB连接

5

我有一个设备和该设备的驱动程序。我的目标是构建一个应用程序,模拟一个USB设备,以便与第三方应用程序通信。

更具体地说,我正在尝试构建一个可以模拟Microsoft Zune的USB设备的应用程序。我想让我的应用程序注册为Zune设备,然后与客户端通信。我已经向我的应用程序中添加了几个DLL文件,以尝试确定调用哪些函数来告诉软件连接的设备是合法的Zune,但到目前为止我还没有得到太多帮助。

我对这种开发方式——模仿硬件设备还很陌生,并且我不太熟悉导入用C/C++编写的dll文件。我正在使用Visual Studio 2010 (.net 4.0)来开发我的应用程序,我将非常感谢任何可以帮助我模拟硬件的人所提供的任何帮助。我确实拥有设备驱动程序,但Visual studio拒绝直接引用它们。我也有一个实际的物理设备,所以我可以看到它在设备管理器中使用的驱动程序。

目标如下:

  1. 应用程序将自身注册为USB设备,类似于Virtual Clone Drive模拟DVD播放器。
  2. 应用程序被Zune客户端识别为有效的Microsoft Zune。
  3. Zune软件与应用程序一样与硬件设备配合工作(同步等)。

你需要让模拟的Zune做到与普通Zune一样的所有功能(至少在USB接口方面)吗?基本上你将不得不编写Zune固件的大部分代码。驱动程序和固件是完全不同的东西。你愿意花多少时间来完成这个任务?也许直接购买100个真正的Zune会更便宜... - Justin
它不会执行所有功能。理想情况下,它将通过同步传递,以便您可以设置应用程序将媒体传递到指定位置。我希望使zune软件识别设备为有效设备,允许您通过zune客户端选择同步策略,然后将适当的媒体同步到应用程序指向的任何位置。同步部分实际上很容易。我已经可以通过客户端dll看到如何做到这一点。我想避免使我的应用程序支持选择要同步的媒体。我知道那可能更容易。 - Josh
umockdev可以帮助模拟USB设备。https://dev59.com/rknSa4cB1Zd3GeqPMDlO#43917529 - Abdullah Farweez
2个回答

3
我刚刚发现了一个叫做Device Simulation Framework的东西,可能正是你所需要的。不过完成你的解决方案仍需要对USB如何工作进行大量研究,通常使用C或C++实现。
Zune使用修改版MTP协议称为MTPZ,但我找到了这个使用设备模拟框架模拟普通MTP设备的示例。它被称为The MTP Device Simulator。我无法确定源代码是否可用。

链接现在不可用,您能再次分享链接吗? - Hien Nguyen

2
你能否用自己的DLL替换Zune客户端软件使用的DLL?如果可以的话,你可以用你的DLL包装原始的DLL并拦截操作。
更新:要找出DLL中函数的签名,请查看Dependency Walker工具,它将列出导出的函数(以及许多其他信息)。我猜你会想用C语言编写你的替代DLL。
否则,您将需要编写驱动程序来注册具有适当端点的USB设备。我不确定如何在Windows上执行此操作-我只在固件方面进行过USB编码,而不是驱动程序方面。您应该能够使用任何创建Windows USB驱动程序的教程,例如入门USB驱动程序开发
Zune特定信息也可能很有用。也许这篇博客文章及其后续内容可以帮助:深入了解Zune / USB协议:第1部分

我很想用自己的DLL包装zune驱动程序,但我不确定如何提取我的导入方法签名。 - Josh
@Josh - 试着使用“Dependency Walker”工具(已更新答案)。 - Justin
非常酷,但它显示的是名称而不是参数。看起来我需要猜测很多,因为没有什么是特定于Zune或明显的。 - Josh
@Josh - 是的,更简单的方法可能是编写虚拟USB驱动程序。看起来可以使用称为WinUSB的东西而不必编写内核模式驱动程序。 - Justin
使用Zune INF文件会有帮助吗?我在这里真的是瞎猜。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接