如何在虚拟一个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
wowocpp
等级:
#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的多种设备的驱动程序,当有该设备类类型的设备接入时,对应的驱动程序会被调用,不再需要手动安装驱动程序。

如何在虚拟一个USB设备相关推荐

  1. 怎样删除usb计算机连接网络打印机驱动,惠普激光打印机安装驱动时报“跟这台计算机连接的一个 USB 设备运行不正...

    1. 确保打印机驱动的安装方法是采用软件优先安装的方法.即,先将打印机和计算机断开连接,直接运行驱动光盘,当计算机提示"请确保打印机已连接到计算机,并打开打印机电源"时,再将打印机 ...

  2. Win10出现跟这台计算机连接的一个usb设备运行不正常怎么办

    可能大家在使用Win10电脑的时候,都会遇到跟这台计算机连接的一个usb设备运行不正常这样的问题,这时候就需要我们对电脑的驱动检查一下了,来看看如何操作的吧. 更多系统教程尽在小白系统重装官网 系统: ...

  3. 跟想这台计算机usb无法识别,无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...

    把计算机电源线从插座上拔下来,将插头短接一段时间后重新启动就好了,哈哈!windows 真奇怪!! 短接方法: 方法二: 我这2天也遇此问题,U盘绝对没坏,在人家的机器上能使,本机插上U盘就会出现:& ...

  4. 跟这台计算机连接的一个USB设备运行不正常,Windows无法识别

    问题描述:用集线器(hub)连接电脑,android设备连接接线器,今天早上打开电脑和项目突然爆出错误: 跟这台计算机连接的一个USB设备运行不正常,Windows无法识别 该设备已被禁用,原因是,设 ...

  5. 无法识别的usb跟这台计算机,【实战成功】无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...

    [实战成功]无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别 症状:一插U盘就总是提示:无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WIN ...

  6. 无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...

    我朋友的电脑今天插上U盘就会出现:"无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别",怎么折腾也找不到原因,后来把计算机电源线从插座上拔下 ...

  7. 跟这台计算机连接的一个usb设备运行不正常windows无法识别,win10跟这台计算机连接的一个usb设备运行不正常怎么办...

    最近使用win10操作系统的用户反应自己电脑中连接手机后无法正常识别的现象,该怎么办呢?我们可以通过将手机和电脑连接的方法管理手机,在电脑中操作的话不仅方便而且可以通过手机管理软件能够清晰的看到手机中 ...

  8. 如何解决跟这台计算机连接的一个usb设备运行不正常

    我们使用电脑的时候经常会和一些usb设备进行外部连接,一般情况下都不会出现什么问题,但有的时候也会遇到跟这台计算机连接的一个usb设备运行不正常的情况,遇到这种情况我们该怎么办呢? 右键单击" ...

  9. 计算机usb无法识别网络连接,打印机安装出现“跟这台计算机连接的一个USB设备运行不正常,windows无法识别”解决方法...

    标题太长,但是不是标题党!但是也可以说是标题党,因为这篇文章说是技术文章,但是也不是技术文章,只是我做个记录.("说是"."也不是"可以用这个造句了,哈哈) 前 ...

最新文章

  1. 《我想进大厂》之JVM夺命连环10问
  2. 【Visual C++】一些开发心得与调试技巧
  3. 第三次学JAVA再学不好就吃翔(part48)--String类的判断功能
  4. n以内的素数c语言,关于求N以内素数的一点小问题(N小于一亿)
  5. 源码阅读:SDWebImage(五)——SDWebImageFrame
  6. mysql主从数据库不同步的2种解决方法(转)
  7. split() 注意事项.
  8. Ajax Session Timeout处理
  9. android 小说下载器 源码 分享
  10. linux操作系统 第12章 网络与通信应用
  11. python模拟按键_Python在windows下模拟按键和鼠标点击代码
  12. Spring-Cache
  13. 【AdaBoost算法】
  14. http协议(一)/应用层
  15. 群晖NAS搭建WebDav服务,并内网穿透实现公网访问
  16. miscellaneous_7
  17. 异军突起的链游Cryptoblades
  18. Webug靶场之旅——显错注入
  19. 【Python】绘制股票K线图(烛状图)并增加成交量和移动平均线(详细简单)
  20. mongodb和mysql中自动增长id_如何在java中维护MongoDB的_id字段的自动增长

热门文章

  1. 2019年春运首日 上海三大火车站预计发送旅客35.9万人次
  2. ArcGIS JS API实现地图场景视频融合
  3. Juniper Junos设置3层接口
  4. WIN11win10 使用Anaconda下载Pytorch详细教程(包括换源)
  5. unity 调用打印机打印图片问题
  6. 【STC8A8K64D4开发板】——开发板程序下载
  7. UTF-8、en_US.UTF-8和zh_CN.UTF-8的区别
  8. XAMARIN.ANDROID的安装
  9. 华为打造的智慧办公“新物种”,为何在央视节目露脸?
  10. 红木整装——成为现代装修行业中的新宠