如何在虚拟一个USB设备 [问题点数:100分]



  • 不显示删除回复
  • 显示所有回复
  • 显示星级回复
  • 显示得分回复
  • 只显示楼主
  •        收藏




winterxu416

winterxu416 等级:

结帖率:98.75%

楼主 发表于: 2011-05-04 14:20:53



我想在本地虚拟一个USB接口,USB接口的数据来自于TCP/IP通道的另一端。
其中这个USB接口是通用的,也就是说,这个接口上虚拟出来的设备类型比较多,可能是U盘、摄像头、USB Key等各种设备。

如果想开发这样一个USB接口,我应该如何做?
另外,本人从未做过DDK方面的开发,但是有多年c语言开发经验,希望各位高手给建议时,能够稍微详细一点儿,万分感谢。




对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理


回复次数:15



SupermanKing

人类 等级:


#1 得分:0 回复于: 2011-05-04 14:44:00



这种需求肯定要用驱动来支持,而按你的需求来说,应该用WDM模型开发驱动。
不过你想一个驱动实现多种设备的虚拟,估计比较难实现。
你可以换个思路,每种设备写一个驱动,然后当你要使用什么样的设备时,再
触发某个驱动载入过程,这样理解就简单多了。
至于该如何做的问题,你应该看看驱动开发相关的书籍,然后了解一下计算机
接口技术,相信你就应该知道大概的开发路线了。
驱动开发上可以参考一下《Windows驱动开发技术详解》这本书,有电子版的,
而且在网上也有下,你可以看看的。


别让高能耗机房拖了企业发展的后腿



对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



VisualEleven 


Eleven 等级:





2






更多勋章


#2 得分:0 回复于: 2011-05-04 14:45:38



呃,Windows驱动编程~





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



winterxu416

winterxu416 等级:

#3 得分:0 回复于: 2011-05-04 14:56:42



补充一点,我希望虚拟的USB接口是通用的,我可以在本地安装驱动来调用这个USB接口,就像一个真正的USB硬件接口一样。
另外各位能否给一下关于USB虚拟接口开发的文章?





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



SupermanKing

人类 等级:


#4 得分:0 回复于: 2011-05-04 15:17:54



USB只是一种接口技术,属于计算机接口技术的其中一种接口技术,这种
技术是一种规范的通讯标准而已,而这种通讯标准非常的灵活,可以包含
任何形式的数据通信,但是你要求的是虚拟设备驱动,这和这种通讯标准
无关,完全是在Windows抽象化后的环境开发就可以了,不用涉及具体的
USB通讯相关的东西,只要用好DDK中的API、结构体、宏命令就OK了。
因为驱动程序可以说是没有任何硬件形式而存在的软件程序,所谓的USB
驱动并不是真正直接对应硬件的程序,而是安装时放在注册表某个指定位
置而已,连图标或设备分类都可以自己在安装程序中定义,真正的驱动程
序不会管注册表位置在哪而执行不同过程,而是同样的入口,同样的 IRP
请求包,没什么应用层看见的这种某种设备的概念。所以,专业上来说是
“驱动开发”,而不是“USB驱动开发”、“PCI驱动开发”,他们的区别
只是如何操作IRP、如何用好宏命令、如何用好下层的NTAPI。





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



mhjava

mhjava 等级:

#5 得分:0 回复于: 2011-05-09 23:13:36



做这个东西很复杂,好像wdk里面有一套微软的可以虚拟任意的usb设备你可以到网上查查,
开发这个你要先把usb在windows的架构搞清楚,驱动层次搞清楚,这些都可以参考wdk.下载一个
wdk慢慢研究吧。





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



seeicool

seeicool 等级:

#6 得分:0 回复于: 2011-05-16 11:08:36



虚拟成hub啊





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



yangxhjamin

yangxhjamin 等级:

#7 得分:0 回复于: 2011-05-23 17:11:01



呵呵,这个东西嘛,据我所知与驱动基本没关系。
去微软官网下个wdk最新的7600.***版,从ddk6.0开始微软专门提供了一套设备虚拟框架DSF,wdk安装后DSF就会被安装在C盘program files下,里面有四个例子;在ddk提供的源码src\test\dsf\usb下有这四个例子的源码。
DSF是microsoft提供专门用于基于USB接口设备虚拟的框架,开发人员不需要管驱动之类的复杂的东西(基本一点关系都没有),只需要开发一个动态链接库用做模拟设备功能,再开发一个脚本文件(microsoft提供的脚本文件是用VBscript编写)用于模拟设备的物理插拔动作;这样一个虚拟设备就模拟ok了。
详细资料可以去官网查看
http://msdn.microsoft.com/en-us/library/ff542267(v=VS.85).aspx 还发现有一个2月份在发表在《计算机系统应用》上的一篇论文:基于DSF架构的USB设备虚拟,想办法弄下来就行了http://www.cnki.com.cn/Article/CJFDTotal-XTYY201102052.htm
还有《软件导刊》上的:基于TCP/IP虚拟USB集线器的设计
http://www.cnki.com.cn/Article/CJFDTotal-RJDK200907049.htm

呵呵,给分





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理




allenzh

allenzh 等级:

#8 得分:0 回复于: 2011-05-25 20:47:51



yangxhjamin说的应该是另外一个办法,这个办法我没有验证过
使用驱动方式是可以实现的,我曾经开发过一个虚拟usb设备,可以将远端很多usb设备接入进来,包括键盘,鼠标,U盘,Camera,Audio,Printer,Reader等等USB设备





对我有用[1]  丢个板砖[0]  引用 |  举报 |  管理



SupermanKing

人类 等级:


#9 得分:0 回复于: 2011-05-30 14:32:57



引用 7 楼 yangxhjamin 的回复:

呵呵,这个东西嘛,据我所知与驱动基本没关系。
去微软官网下个wdk最新的7600.***版,从ddk6.0开始微软专门提供了一套设备虚拟框架DSF,wdk安装后DSF就会被安装在C盘program files下,里面有四个例子;在ddk提供的源码src\test\dsf\usb下有这四个例子的源码。
DSF是microsoft提供专门用于基于USB接口设备虚拟的框架,开发人员不需要管驱动之类……


如果真的没关系就不可能做出来。光看你说的 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 通讯时的具体过程、有几种方式、要处理哪些请求、每种请求的含义、具体的设备地址、宏操作方式等等等等,走了一大截,发现和目标根本就很远,当意识过来,发现走了很多弯路,所以说概念一定要清楚,不然一定会很苦。







对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



yangxhjamin

yangxhjamin 等级:

#10 得分:0 回复于: 2011-06-02 10:07:15



引用 9 楼 supermanking 的回复:

引用 7 楼 yangxhjamin 的回复:

呵呵,这个东西嘛,据我所知与驱动基本没关系。
去微软官网下个wdk最新的7600.***版,从ddk6.0开始微软专门提供了一套设备虚拟框架DSF,wdk安装后DSF就会被安装在C盘program files下,里面有四个例子;在ddk提供的源码src\test\dsf\usb下有这四个例子的源码。
DSF是microsoft提供专门用于基……


   当然“与驱动基本没关系”我说的有点绝对了,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






对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



wowocpp

wowop 等级:

#11 得分:0 回复于: 2011-07-19 16:08:26



mark 
youkong yangjiu yixia 





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



C_panpan

C_panpan 等级:

#12 得分:0 回复于: 2011-11-28 17:27:30



楼主,你写出来了没?我也想看一看,如果写出来,请拿出来晒一晒吧!!!谢谢





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



nothing0x

nothing0x 等级:

#13 得分:0 回复于: 2012-10-11 15:08:01



需要用到dsf吧。





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



project2502

project2502 等级:

#14 得分:0 回复于: 2012-10-26 19:48:12



这个超简单  

你看看ddk 里 vhidmini 这个例子  和usb协议中关于 usb描述符的部分

只要简单的改改 usb描述符 就可以 将vhidmini虚拟成任何usb设备

数据可以是从用户模式得到 也可以通过 与ndis过滤驱动交互得到





对我有用[0]  丢个板砖[0]  引用 |  举报 |  管理



zyyjaf

zyyjaf 等级:

#15 得分:0 回复于: 2012-11-23 16:44:49



能否再具体一点,我现在也要做一个这样的虚拟设备,可以挂载同种设备类但不同PID的多种设备的驱动程序,当有该设备类类型的设备接入时,对应的驱动程序会被调用,不再需要手动安装驱动程序。