2011-02-16 1634 views
16

我是一个学习如何编写USB设备的WDM设备驱动程序的新手,并发现可用的材料都很难理解(DDK在线文档是最难读的之一,而且Oney的WDM设备驱动程序书不是更好)。创建一个虚拟USB设备

所以,我有一个简单的问题。如果我想创建一个虚拟USB设备(例如,虚拟USB鼠标,它看起来像一个连接到USB端口的真正的USB鼠标)以进行测试/学习,我该从哪里开始。

到目前为止,我所了解的是HIDClass驱动程序(hidclass.sys)有一个用于USB总线(hidusb.sys)的小型驱动程序,用于执行枚举连接的USB硬件。因此,如果我想劫持硬件枚举过程并创建自己的虚拟硬件,是否应该在某处包含过滤器驱动程序来拦截与硬件枚举过程相关的一些IRP?

对不起,如果上述没有意义,因为我仍然处于学习阶段,这实际上是我认为可以帮助我学习更好地编写USB设备驱动程序的练习之一。

+0

用于linux平台的嘲笑usb设备http://stackoverflow.com/a/43917529/6180077 – 2017-05-11 13:58:57

回答

16

Windows使用即插即用架构:插入USB设备,Windows注册设备已连接。它向设备发送低级USB请求,然后根据设备的响应决定要加载的驱动程序。该驱动程序以编译的xxx.sys文件的形式出现并加载到内核空间中。 Windows根据设备驱动程序附带的* .inf文件决定加载哪个xxx.sys。

这些文件有这样几个部分:

[Manufacturer] 
%Manufacturer% = DeviceInstall 

[DeviceInstall] 
"some usb dev"=OTHER_SECTION_DEV, USB\Vid_XXXX&Pid_yyyy 

# This is where windows learns to match this information 
# to your device, using the product id (Pid) and the 
# vendor id (Vid) that Windows gets back during the 
# low level USB DeviceDescriptor request 

[OTHER_SECTION_DEV] 
CopyFiles = xxx.sys, 10,system32\drivers 

(对什么是在inf文件更详细的描述可以在http://www.osronline.com/ddkx/install/inf-format_2k8i.htm发现以上)


详细看看USB枚举过程:

  • 插入USB设备
  • USB总线驱动程序请求(这些指令是通过USB线发送,使用USB记录仪看到他们):
    • GetDescriptor(设备)
    • GetDescriptor(配置)
    • GetDescriptor(字符串iSerialNumber)用作设备实例ID
    • GetDescriptor(字符串iProduct),在所使用的“新硬件被确定”的弹出窗口
  • 的PNP(即插即用)管理器被通知中加入设备由巴士司机。
  • PnP管理然后请求使用PNP请求,请求设备PVC门总线驱动器:
    • 的DeviceID串,表示USB供应商和产品ID,
    • HardwareIDs串,
    • CompatibleIDs串,表示USB设备的接口类,子类和协议,以及表示具有与计算机相同的compatibleid的所有实例集中的此特定设备的uid的InstanceID字符串。

对于任何连接的USB设备,您可以使用设备管理器这些字符串看:

  • 打开设备管理器(Windows菜单 - > “设备管理器”,或控制面板 - >“系统“ - >”硬件“ - >”设备管理器“)
  • 然后使用”查看“菜单切换到”设备连接“
  • 打开”ACPI [...]“ - >”PCI总线“ /“PCI Express根联合体” - >“USB主机控制器”
  • 展开主机控制器下的任何条目,并为列出的任何设备右键单击以获取其属性,打开“详细信息”选项卡,然后使用属性下拉菜单查找“硬件ID”,“兼容IDS”,‘设备实例ID’,‘匹配设备ID’,‘服务’等

例如,我有Device Id = usb\class_08&subclass_06&prot_50 USB存储设备挂接,并且该字符串可以匹配到.inf在安装此设备的驱动程序时添加到已知信息列表中的文件。该文件的字符串为Service = USBSTOR,因此我们知道usbstor.sys用于与此USB大容量存储设备进行连接。

让我们继续进行匹配过程。

  • PnP管理器试图确定是否设备已经“安装”:
    • 它在注册表中搜索匹配“DeviceInstance ID”,看看哪些服务处理与该设备接口的关键。具体而言,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

搜索此有关密钥盘,你可以看到:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_5406\0775555ACA54ADE3] 
"Service"="USBSTOR" 
  • PnP管理器,然后加载基于之间的匹配相关的驱动程序它在PNP中查看的字符串请求设备,以及.inf数据库中的数据:
    • inf数据库位置是c:\ WI NDOWS \ INF \这里位于ç
    • 驱动程序:\ WINDOWS \ SYSTEM32 \ DRIVERS
  • 如果它不能执行这样的匹配,它会要求用户浏览一个驱动程序,而不是使用。

用于编写驱动程序我的建议是:

  1. 不要执行HID(人机接口设备)设备开始的,因为你可能会导致Windows尝试应用您的自定义驱动程序驱动程序对于已安装的鼠标或键盘,无法访问它们。
  2. 驱动程序不加载到您的实际机器:
    1. 使用虚拟机并安装您的驱动存在。建立一个内核调试器为您的虚拟机:http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
    2. 您也可以尝试使用物理板如OSR的USB-FX2的学习套件
1

提供您自己的总线类型和枚举器是否更有意义?

+0

如果为了学习的目的,我想创建一个虚拟USB设备? – JavaMan 2011-02-16 14:36:59

+1

我的观点是,为了学习的目的,最好从不涉及混淆操作系统的东西开始。如果你真的想要引入一个虚拟USB设备,那么提供你自己的USB主机适配器是一种方法。 – 2011-02-16 15:29:58

2

您可以使用USB/IP项目效仿,你想要的任何设备。在我的博客我演示了如何使用USB/IP项目模拟USB鼠标设备在python: http://breaking-the-system.blogspot.com/2014/08/emulating-usb-devices-in-python-with-no.html

它不会帮助您了解如何创建虚拟USB设备(该过程在USB做过/ IP驱动程序,您可以阅读代码),但它会创建虚拟USB HID设备,您可以使用发送给USB驱动程序的HID参数进行播放。