USB 设备识别如何工作?

Nat*_*ong 17 windows usb

我很好奇 USB 设备识别在 Windows 中是如何工作的。我它是这样的:

  • 当您插入设备时,它会告诉 Windows“这是我的设备 ID 来告诉您我是什么”
  • Windows 会查看是否安装了与该设备 ID 匹配的任何驱动程序。驱动程序可能会告诉 Windows 设备应该叫什么——比如“BlackBerry Curve”或“Canon Printer”
  • 如果是这样,它会以某种方式将该设备与该驱动程序相关联
  • 否则,它会在线寻找匹配的驱动程序(如果您允许的话)

我对吗?如果是这样,那仍然会留下一些问题。

  • 当您安装驱动程序时,它们会去哪里?它们是文件夹中的文件,还是被添加到注册表中?
  • 当 Windows 首次识别设备、思考并最终说“您的新设备已安装并可以使用时,它在做什么?”
  • Windows 在哪里查找丢失的驱动程序?是在他们自己的数据库中吗?设备制造商是否将驱动程序提交给 Microsoft 以包含在那里?

任何人都可以解释这个过程是如何真正起作用的吗?另外,其他操作系统是否以不同的方式执行此操作?

RBe*_*eig 27

USB 总线的物理设计使得插入(和移除)插头的行为可以被主机控制器识别。当这个“plug”事件发生时,主机控制器通知它的设备驱动程序扫描总线并要求每个设备识别自己。

所有 USB 设备都包含有关设备的信息集合,称为描述符。使用相同的命令从所有设备检索设备描述符。这允许 USB 总线本身的设备驱动程序有效地询问新连接的设备它是什么,并期望得到合理的响应。

在所有描述符中,只有少数直接用于将驱动程序匹配到大多数设备。这是因为 USB 定义了设备类,通常每个设备类的系统驱动程序足以处理声称属于该类的任何设备。

例如,所有键盘都将声称属于 HID(人机界面)类,鼠标、平板电脑和游戏控制器也是如此。HID 类有几个子类(键盘、鼠标等),因此每个子类都以预期的方式处理。

大多数类似磁盘的设备都声称属于大容量存储类,系统驱动程序也只适用于这些设备。

除了类和子类之外,描述符还包括供应商 ID (VID)、产品 ID (PID) 和修订版。供应商 ID 由标准委员会分配(主要是按发布顺序,但有些公司有特殊要求:例如,intel 是 0x8086)。产品 ID 由每个供应商分配,并且 VID 和 PID 的组合对于每个发布的产品必须是唯一的。

首次安装设备时,会以可预测的方式使用 VID、PID、修订版、类和子类来选择加载的设备驱动程序。具有供应商和产品特定名称使供应商可以自定义设备,否则可能会(几乎)由库存系统驱动程序正确处理。

另一个重要的描述符是设备序列号。如果设备具有序列号,则即使使用不同的物理 USB 端口,再次插入时也可以对其进行识别和处理。这对于存储设备很重要,以便为它们分配相同的驱动器号,对于串行端口适配器和调制解调器等设备,以便为它们指定相同的 COM 端口名称。

这整个过程记录在MSDN 上,但详细信息散布在各个地方。

  • 当我为 Windows 编写第一个设备驱动程序时,我从文档和示例中收集这些细节所花费的时间是一项意外的任务。我很高兴分享结果...... (3认同)

Chr*_*her 7

问题 :

  • 目录: 驱动程序安装到 2 个目录中。运行部分(在大多数情况下)安装到 %RootDir%\system32,设备信息部分安装到 %RootDir%\inf。在 inf 目录下,为已安装/注册的驱动程序创建了 oem*.inf 文件。(* 是一个数字)。在 Vista 下,驱动程序被复制到 %RootDir%\system32\driverstore 目录中作为安装尚未遇到的设备时的参考。
  • 注册表: 驱动程序安装为内核模式服务。为此,为驱动程序服务创建了某些注册表项。总线驱动程序下还有一个地方,对应的设备在那里得到一个单独的设备实例密钥。在这个键中,设备引用了这个设备当前使用的驱动程序。
  • 设备“到达”:当总线驱动程序在其总线上发现一个新设备时,它会在自己的密钥下创建一个密钥注册表,该注册表对应于唯一的设备实例 ID,可用于唯一标识系统上的设备。如果此键已存在,则总线驱动程序会尝试加载此节点引用的设备。当此节点不存在或驱动程序未加载时,系统会尝试通过扫描 %RootDir%\inf 下已注册的设备驱动程序来为设备找到兼容的驱动程序。符合此设备的驱动程序将被枚举和排序。然后为设备选择并加载最佳驱动程序。
  • 驱动程序搜索:首先在 inf 目录中搜索驱动程序。当没有找到驱动程序时,windows 会询问用户,他是否可以提供驱动程序或者是否应该在 Microsoft 服务器上查找。驱动程序制造商可以提交他们的驱动程序以包含在 Microsoft 设备驱动程序服务器中。

Lunatik 有答案的第一部分,即所谓的总线驱动程序如何找到设备。