usb - 创建虚拟USB设备

标签 usb device drivers

我是一名新手,正在学习如何为USB设备编写WDM设备驱动程序,发现可用的材料太难理解了(DDK在线文档是最难阅读的文档之一,而Oney撰写的WDM设备驱动程序书是'没有更好的东西了。

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

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

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

最佳答案

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


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



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


USB设备已插入
USB总线驱动程序请求


GetDescriptor(设备)
GetDescriptor(配置)
GetDescriptor(String iSerialNumber),用作设备实例ID
GetDescriptor(String iProduct),在“已识别新硬件”弹出窗口中使用

PNP(即插即用)管理器被告知总线驱动程序已添加设备。
然后,PNP管理器通过使用PNP请求向总线驱动程序询问设备信息,要求:


DeviceID字符串,代表USB供应商和产品ID,
HardwareIDs字符串,
CompatibleIDs字符串,表示USB设备的接口类,子类和协议,以及
InstanceID字符串,代表与计算机连接的具有相同兼容ID的所有实例集中该特定设备的uid。



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


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


例如,我有一个连接了Device Id = usb\class_08&subclass_06&prot_50的USB存储设备,并且此字符串可以与.inf文件匹配,该文件在第一次枚举后已添加到已知设备的列表中。该文件具有字符串Service = USBSTOR,因此我们知道usbstor.sys用于与此USB Mass Storage Device进行接口。

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


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的路径。




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


不要从实现HID(人机界面设备)设备开始,因为您可能会导致Windows使用鼠标或键盘的自定义驱动程序代替原始驱动程序,这会禁用鼠标或键盘,这非常危险。
不要将驱动程序加载到您的开发机器中:


使用虚拟机并在那里安装驱动程序。为您的虚拟机设置内核调试器:http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
或在其他测试计算机上加载驱动程序。

USB驱动程序的良好学习平台是“ OSR USB-FX2学习套件”

关于usb - 创建虚拟USB设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5016363/

相关文章:

android - 如何在应用程序中与 2 个机器人进行通信?

使用 Apple TV 和智能手机登录 facebook

ios - 即使应用程序在后台运行,如何在越狱 ios 设备上收听所有触摸事件

db2 - TransactionScope 不适用于 DB2 提供者

node.js - 如何获取已安装的 USB 设备的名称?

c++ - 为什么当我在 Ubuntu 终端上发送 SIGTERM (Ctrl + C) 时我的 C++ 代码没有终止?

linux - umount -l 后删除挂载目录

macos - 是否有任何软件实用程序可用于在 MAC OSx 中进行 USB 端口嗅探?

c++ - 在客户端看不到的内部接口(interface)中测试有效参数

arm - FIQ和IRQ中断系统有什么区别?