如何在虚拟一个USB设备 [问题点数:100分]
- 不显示删除回复
- 显示所有回复
- 显示星级回复
- 显示得分回复
- 只显示楼主
- 收藏
winterxu416 等级: 结帖率:98.75% | 楼主 发表于: 2011-05-04 14:20:53 我想在本地虚拟一个USB接口,USB接口的数据来自于TCP/IP通道的另一端。 |
回复次数:15 |
人类 等级: | #1 得分:0 回复于: 2011-05-04 14:44:00 这种需求肯定要用驱动来支持,而按你的需求来说,应该用WDM模型开发驱动。 |
Eleven 等级: 2 | #2 得分:0 回复于: 2011-05-04 14:45:38 呃,Windows驱动编程~ |
winterxu416 等级: | #3 得分:0 回复于: 2011-05-04 14:56:42 补充一点,我希望虚拟的USB接口是通用的,我可以在本地安装驱动来调用这个USB接口,就像一个真正的USB硬件接口一样。 |
人类 等级: | #4 得分:0 回复于: 2011-05-04 15:17:54 USB只是一种接口技术,属于计算机接口技术的其中一种接口技术,这种 |
mhjava 等级: | #5 得分:0 回复于: 2011-05-09 23:13:36 做这个东西很复杂,好像wdk里面有一套微软的可以虚拟任意的usb设备你可以到网上查查, |
seeicool 等级: | #6 得分:0 回复于: 2011-05-16 11:08:36 虚拟成hub啊 |
yangxhjamin 等级: | #7 得分:0 回复于: 2011-05-23 17:11:01 呵呵,这个东西嘛,据我所知与驱动基本没关系。 |
allenzh 等级: | #8 得分:0 回复于: 2011-05-25 20:47:51 yangxhjamin说的应该是另外一个办法,这个办法我没有验证过 |
人类 等级: | #9 得分:0 回复于: 2011-05-30 14:32:57 引用 7 楼 yangxhjamin 的回复:
如果真的没关系就不可能做出来。光看你说的 WDK 和DDK,就明显的与驱动挂钩了,怎么还能说与驱动无关呢?你所说的只是这种驱动程序是自己写还是用现成的程序过代码而已,飞不出去的。 还有就是,不要被“USB”这个词所误导,这种程序和USB通讯协议无关。因为既然是虚拟的,就不会存在真正的USB通讯过程,就不去要处理USB通讯上的相关IRP请求,只要处理相应的磁盘或目标设备处理过程的IPR请求就可以了。当然,如果要模拟USB的HID设备通讯,需要了解HID通讯过程,才需要处理相应的IRP请求,但如果是模拟磁盘、光盘这种设备,没必要涉及这方面的东西。因为事实是即使真的USB设备,要在系统中实现磁盘或光盘的处理,除了处理USB数据传输这一块,主要的还是处理目标设备的IRP信息处理过程,在驱动程序中来看,除了通讯过程,其他的和USB这种接口无关。 打个比方,就像以前的一款软件,叫网络蜂盘,是通过 Internet 网络进行数据的交换,然后虚拟出本地硬盘。这种方式和 USB 的移动硬盘区别只是在于传输数据的方式和速度不同,但最终都是实现磁盘设备的接口处理,难道这种驱动应该被叫成“网络驱动”?只要是通过网络传输数据的,无论虚拟出的是磁盘、光盘、键盘、打印机,难道都应该叫“网络驱动”?还有那种直接通过磁盘文件内容虚拟成一个本地磁盘的方式,难道也应该叫成“文件驱动”?不是这样的,这种只是数据的接口来源方式而已,和驱动程序的定性无关。除非是模拟一个 USB 通讯通道,如前面我说的 USB HID 设备的通讯模拟,这种需求因为要实质了解通讯的设置与数据交换过程才能实现,所以这种可以叫做“USB驱动”,否则是与 USB 这种接口技术是无关的。 之所以我一再说这种问题,主要是纠正理解概念上的问题,因为如果理解的概念上错了,将会走很多的弯路。理解这种问题应该这样,“磁盘驱动”、“光盘驱动”、“键盘驱动”……,这样理解目标程序比较贴切。因为只有这样去理解,才会正确的找出访问磁盘时的过程需要处理哪些 IRP 请求。不然路一偏,去了解 USB 通讯时的具体过程、有几种方式、要处理哪些请求、每种请求的含义、具体的设备地址、宏操作方式等等等等,走了一大截,发现和目标根本就很远,当意识过来,发现走了很多弯路,所以说概念一定要清楚,不然一定会很苦。 |
yangxhjamin 等级: | #10 得分:0 回复于: 2011-06-02 10:07:15 引用 9 楼 supermanking 的回复:
当然“与驱动基本没关系”我说的有点绝对了,wdk的确大多数人是它用来开发设备驱动的,但它在其中增加了另一块儿-DSF;如果你安装下wdk就会看到其中包含DDK和DSF及其他东西,ddk和dsf被安装在不同的地方;说这个的目的说dsf是专门提供用来做虚拟设备的所以他被独列出来了,虚拟设备的市场需求最终导致微软专门提供了一套开发虚拟设备的框架DSF;USB当然只是一种接口,具体是什么驱动当然得根据设备功能来定,这个也是初学者容易搞混的地方。 据我目前所知,开发虚拟设备有两条路线:1从驱动整体结构入手欺骗操作系统开发虚拟设备,2用dsf架构欺骗操作系统开发虚拟设备。随着Windows的安全机制的完善第一种方案难度很大,而且只有对驱动开发比较熟悉的工程师才搞的来,这个也就是你说的从驱动入手用驱动虚拟;第二种就不用说了,微软专门搞了个Divice simulation Framework(DSF)欺骗自己的操作系统用于开发虚拟设备(目前仅支持开发USB接口的设备),据我对DSF的了解微软自己搞的DSF就是用小端口驱动把一个虚拟USB设备控制器驱动接在USB控制器驱动上,前面的关于驱动层面的东西DSF已经做好了,开发人员不需要管驱动的东西,所以开发基于DSF框架的虚拟设备已经与驱动没有关系了。如果还有不清楚的可以看MSDN官网提供的资料 http://msdn.microsoft.com/en-us/library/ff542267(v=VS.85).aspx |
wowop 等级: | #11 得分:0 回复于: 2011-07-19 16:08:26 mark |
C_panpan 等级: | #12 得分:0 回复于: 2011-11-28 17:27:30 楼主,你写出来了没?我也想看一看,如果写出来,请拿出来晒一晒吧!!!谢谢 |
nothing0x 等级: | #13 得分:0 回复于: 2012-10-11 15:08:01 需要用到dsf吧。 |
project2502 等级: | #14 得分:0 回复于: 2012-10-26 19:48:12 这个超简单 |
zyyjaf 等级: | #15 得分:0 回复于: 2012-11-23 16:44:49 能否再具体一点,我现在也要做一个这样的虚拟设备,可以挂载同种设备类但不同PID的多种设备的驱动程序,当有该设备类类型的设备接入时,对应的驱动程序会被调用,不再需要手动安装驱动程序。 |