品牌和型号信息存储在输出设备的哪里?

品牌和型号信息存储在输出设备的哪里?

例如,为什么当我将闪存驱动器插入计算机时,Windows 会显示“SanDisk Ultra USB 3.0 USB Device”字符串?

或者,为什么当我将鼠标插入计算机时,Windows 会显示“GXT 922 游戏鼠标”字符串?

我可以通过低级语言(例如 Assembly 或 Hex)访问和/或重写/修改这些信息吗?

以下是屏幕截图:

在此处输入图片描述

答案1

例如,为什么当我将闪存驱动器插入计算机时,Windows 会显示“SanDisk Ultra USB 3.0 USB Device”字符串?

或者,为什么当我将鼠标插入计算机时,Windows 会显示“GXT 922 游戏鼠标”字符串?

Windows 主要从设备中的 USB 控制器接收这些信息。每个 USB 设备都会报告其“设备描述符”,其中包括其供应商 ID 和产品 ID(数字 VID&PID 值)以及制造商名称和产品名称的文本版本,此外还有种类它是什么样的设备以及它支持哪些“接口”。

设备的 USB 控制器会将其存储在某种 EEPROM 或闪存中,但这可能因设备而异,并且不会向主机系统显示 - 操作系统只能获取完全格式化的 USB 设备描述符,而不会真正读取原始内存。

但是由于这些标签的长度有限,Windows 还允许驱动程序在需要时使用更好的标签覆盖它们(将描述符中的 VID 和 PID 映射到驱动程序中的标签)。许多设备都有 .inf-only“驱动程序”,它们本身并没有真正安装驱动程序,而只是为设备提供更好的标签(PCI 设备也会出现这种情况,它们甚至无法报告名称)。通常,这些标签都是从 Windows Update 获得的,但一些这样的驱动程序包可能仍与 Windows 本身离线捆绑在一起。

更多细节:

我可以通过低级语言(例如 Assembly)访问和/或重写/修改此信息吗?

有时可能,但语言帮不了你太多忙。原因有二:

  1. 低级语言:在每个现代操作系统中,程序都没有特殊的硬件访问权限不管它们是用什么语言编写的?也就是说,操作系统要么让进程做某事(使用 I/O 寄存器、访问原始内存等),要么不让进程做某事,但语言对此没有帮助。另一方面,你用汇编语言来做,你也可以用 C 和类似语言来做。

  2. 该设备必须支持编辑这些数据,大多数设备根本不会这样做。整个 USB 描述符可能只是存储在一次性可编程 ROM 中,一旦写入,您就无法物理更改。此外,没有标准命令 - 通常只有制造商才需要这样做。

    (对于某些设备,可能泄露的制造工具使用“隐藏”命令来重新标记设备 - 特别是对于 USB 记忆棒,我过去至少使用过两种不同的工具,但每种工具都只针对特定系列的 USB 闪存芯片。我真的不希望鼠标或打印机存在类似的东西......)

...或 Hex?

那甚至不是一种编程语言。Hex 不任何东西——它实际上只是书写数字的不同方式。

相关内容