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
- 如果它不能执行这样的匹配,它会要求用户浏览一个驱动程序,而不是使用。
用于编写驱动程序我的建议是:
- 不要执行HID(人机接口设备)设备开始的,因为你可能会导致Windows尝试应用您的自定义驱动程序驱动程序对于已安装的鼠标或键盘,无法访问它们。
- 驱动程序不加载到您的实际机器:
- 使用虚拟机并安装您的驱动存在。建立一个内核调试器为您的虚拟机:http://www.codeproject.com/KB/winsdk/KernelModeDebuggerSetup.asp
- 您也可以尝试使用物理板如OSR的USB-FX2的学习套件
用于linux平台的嘲笑usb设备http://stackoverflow.com/a/43917529/6180077 – 2017-05-11 13:58:57