创建虚拟USB设备

时间:2011-02-16 12:22:32

标签: usb device drivers

我是一个学习如何为USB设备编写WDM设备驱动程序的新手,发现可用的材料太难理解了(DDK在线文档是最难读的,而WDM设备驱动书是由Oney并不是更好的事情。)

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

到目前为止,据我所知,HIDClass驱动程序(hidclass.sys)有一个usb总线的微控制器(hidusb.sys),用于执行附加USB硬件的枚举。那么,如果我想劫持硬件枚举过程并创建我自己的虚拟硬件,我是否应该在某处包含一个过滤器驱动程序来拦截与硬件枚举过程相关的一些IRP?

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

4 个答案:

答案 0 :(得分:20)

Windows使用即插即用架构。 当您插入USB设备时,它会向设备发送低级USB请求,然后根据设备的响应决定加载哪个驱动程序。匹配是通过将供应商ID,产品ID等与inf文件部分进行比较来完成的。驱动程序以带有xxx.inf文件的已编译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

(可以在https://docs.microsoft.com/en-us/windows-hardware/drivers/install/inf-manufacturer-section上找到inf文件中的内容的更详细说明


详细了解USB枚举过程(使用USB记录器):

  • USB设备已插入
  • USB总线驱动程序请求
    • GetDescriptor(设备)
    • GetDescriptor(配置)
    • GetDescriptor(String iSerialNumber),用作设备实例ID
    • GetDescriptor(String iProduct),用于“新硬件已识别”弹出窗口
  • PNP(即插即用)管理器被告知公交车司机已添加设备。
  • PNP管理员然后使用PNP请求向总线驱动程序询问设备信息,要求:
    • DeviceID字符串,表示USB供应商和产品ID
    • HardwareIDs string,
    • CompatibleIDs字符串,表示USB设备的接口类,子类和协议,以及
    • InstanceID字符串,表示在具有相同兼容ID的所有实例集合中此特定设备的uid连接到计算机。

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

  • 打开设备管理器(Windows菜单 - >“设备管理器”,或控制面板 - >“系统” - >“硬件” - >“设备管理器”)
  • 然后使用“view”菜单切换到“Device by Connection”
  • 打开“ACPI [...]” - > “PCI总线”/“PCI Express Root Complex” - > “[...] USB [...]主机控制器”
  • 展开主机控制器下的任何条目,对于列出的任何设备,右键单击以获取其属性,打开“详细信息”选项卡,然后使用属性下拉菜单查找“硬件ID”,“兼容的ID“,”设备实例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:\ WINDOWS \ inf \
    • 驱动程序.sys文件位于:C:\ WINDOWS \ system32 \ drivers
  • 如果PNP找不到匹配的字符串,则会提示您显示xxx.sys和xxx.inf的路径

为了写作司机,我的建议是:

  1. 不要从实现HID(人机接口设备)设备开始,因为您可以使Windows为您的鼠标或键盘而不是原始驱动程序使用自定义驱动程序,这将禁用您的鼠标或键盘,非常危险。
  2. 不要将驱动程序加载到您的开发机器中:
    1. 使用虚拟机并在那里安装驱动程序。为您的虚拟机设置内核调试程序:http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
    2. 或在其他测试机器上加载驱动程序。
  3. USB驱动程序的良好学习平台是“OSR USB-FX2学习套件”

答案 1 :(得分:4)

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

提供自己的总线类型和调查员会不会更有意义吗?