创建虚拟USB设备

创建虚拟USB设备,usb,device,drivers,Usb,Device,Drivers,我是一个学习如何为USB设备编写WDM设备驱动程序的新手,发现可用的材料太难理解了(DDK online doc是最难阅读的文件之一,Oney的WDM设备驱动程序手册也不是更好的) 所以,我有一个简单的问题。如果我想创建一个虚拟USB设备(例如,一个看起来像连接到USB端口的真实USB鼠标的虚拟USB鼠标)进行测试/学习,从哪里开始 到目前为止,我所了解的是HIDClass驱动程序(HIDClass.sys)有一个用于usb总线(hidusb.sys)的微型驱动程序,用于执行连接的usb硬件的枚

我是一个学习如何为USB设备编写WDM设备驱动程序的新手,发现可用的材料太难理解了(DDK online doc是最难阅读的文件之一,Oney的WDM设备驱动程序手册也不是更好的)

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

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


很抱歉,如果上述内容毫无意义,因为我仍处于学习阶段,这实际上是我认为可以帮助我更好地学习编写USB设备驱动程序的练习之一。

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

Windows使用即插即用架构。 当您插入USB设备时,它会向设备发送低级USB请求,然后根据设备的响应决定加载哪个驱动程序。通过将供应商id、产品id等与inf文件部分进行比较来完成匹配。驱动程序以编译的xxx.sys和xxx.inf文件的形式出现,并加载到内核空间。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
文件中内容的更详细说明,请参阅)


详细介绍USB枚举过程(使用USB记录器):

  • USB设备已插入
  • USB总线驱动程序请求
    • GetDescriptor(设备)
    • GetDescriptor(配置)
    • GetDescriptor(字符串iSerialNumber),用作设备实例ID
    • GetDescriptor(字符串IPProduct),用于“已识别新硬件”弹出窗口
  • PNP(即插即用)管理器被告知总线驱动程序添加了一个设备
  • 然后,PNP管理器使用PNP请求向总线驱动程序请求设备信息,请求:
    • DeviceID字符串,表示USB供应商和产品ID
    • HardwareIDs字符串
    • CompatibleIDs字符串,表示USB设备的接口类、子类和协议,以及
    • InstanceID字符串,表示连接到计算机的具有相同兼容id的所有实例集中此特定设备的uid
对于任何连接的USB设备,您可以使用设备管理器查看以下字符串:

  • 打开设备管理器(windows菜单->设备管理器,或控制面板->系统->硬件->设备管理器)
  • 然后使用“查看”菜单切换到“设备连接”
  • 打开“ACPI[…]”->“PCI总线”/“PCI Express根复合体”->“[…]USB[…]主机控制器”
  • 展开主机控制器下的任何条目,对于列出的任何设备,右键单击以获取其属性,打开“详细信息”选项卡,然后使用属性下拉菜单查找“硬件ID”、“兼容ID”、“设备实例ID”、“匹配设备ID”、“服务”等
例如,我有一个连接了
设备Id=USB\class\u 08&subclass\u 06&prot\u 50
的USB存储设备,该字符串可以与第一次枚举后添加到已知设备列表中的
.inf
文件相匹配。此文件有一个字符串
Service=USBSTOR
,因此我们知道
USBSTOR.sys
用于与此USB大容量存储设备进行接口

让我们继续匹配过程

  • PNP管理器尝试确定设备是否已“安装”:
    • 它在注册表中搜索与“DeviceInstance ID”匹配的键,以查看哪个服务处理与该设备的接口。具体来说,它在
      HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Enum\USB
对于键上的磁盘,您可以看到如下内容:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0781&Pid_5406\0775555ACA54ADE3]
"Service"="USBSTOR"
  • 然后,PNP管理器根据PNP请求中的字符串与.inf数据库中的数据之间的匹配来加载关联的驱动程序:
    • inf数据库位于以下位置:C:\WINDOWS\inf\
    • drivers.sys文件位于:C:\WINDOWS\system32\drivers
  • 如果PNP找不到匹配的字符串,您将得到提示,显示到xxx.sys和xxx.inf的路径

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

  • 不要从实现HID(人机界面设备)设备开始,因为您可能会导致windows为您的鼠标或键盘使用自定义驱动程序而不是原始驱动程序,这将禁用您的鼠标或键盘,非常危险
  • 不要将驱动程序加载到您的开发计算机中:
  • 使用虚拟机并在那里安装驱动程序。为虚拟机设置内核调试器:
  • 或者在其他测试机器上加载驱动程序
  • USB驱动程序的良好学习平台是“OSR USB-FX2学习工具包”

  • 使用设备模拟框架(DSF)


    您可以使用USB/IP项目模拟您想要的任何设备。在我的博客中,我演示了如何使用USB/IP项目在python中模拟USB鼠标设备:


    它不会帮助您理解如何创建虚拟USB设备(该过程在USB/IP驱动程序中完成,您可以阅读代码),但它将创建虚拟USB HID设备,您可以使用发送到USB驱动程序的HID参数

    如果出于学习的目的,我想创建一个虚拟USB设备,该怎么办?我的观点是,出于学习的目的,最好从不涉及混淆操作系统的东西开始。如果你真的想介绍