Windows 机密提醒我切勿重蹈覆辙

Raymond Chen

曾有一个用于 Windows® 95 系列操作系统的旧工具,名为“自动忽略驱动程序”。您对此工具的第一反应可能是它笨拙的名称,甚至于您可能怀疑字母 ASD 代表着其他意思。您的感觉非常准确。

Windows 95 必须处理大量非即插即用设备,因为当时的绝大多数系统均没有应用插即用规格。缺少合适的即插即用设备时,硬件检测是一件非常可怕的事情。

例如,检测调制解调器需要查询多个调制解调器寄存器的值。尽管存在很完美的基本调制解调器命令集,但在执行命令语言的生僻部分时,仍存在重大的差异。毫无疑问,此不一致性对于通信程序而言非常令人沮丧,因为它需要针对不同调制解调器型号添加特殊情况以满足它们各自的奇特之处;但是,此不一致性对于 Windows 却是意外的恩赐:由于每个调制解调器的行为均存在细微差异,Windows 可调查这些生僻之处并将调制解调器的行为与已知调制解调器以及它们响应的表格相比较。

  

在 Windows 95 团队中,有一个人的职责是安装人们所知的所有调制解调器并运行一个小程序来让调制解调器经历它的所有步骤、寻找生僻之处并从每个调制解调器收集结果,以建立详尽的调制解调器数据库。如果您仍可访问运行 Windows 95 的计算机,可快速浏览 Windows\Inf 目录并查看名称以 MDM 开头的所有文件。与调制解调器相关的设备信息文件超过 1 MB。需要某人花几年的时间才能消化 1 MB 难以理解的十六进制数字。

检测调制解调器非常安全,因为几乎所有调制解调器在较高级别的行为均大概相同;所有令人兴奋之处均在于细节。更加可怕的是使用 I/O 端口的设备。例如,要检测是否安装了特定视频卡,Windows 95 配置管理器的视频卡检测模块会将仔细选择的值发送到特定 I/O 端口并侦听设备的所有响应。如果设备以正确方式做出响应,它会假定找到了正在寻找的东西。否则,它会转向下一视频卡型号。

当然,如果该 I/O 端口上安装的设备并非配置管理器正在通过测试想得到的视频卡,它可能变得非常不高兴,因为有人向它发送了毫无意义的值。设备可能会视情况挂起或重启计算机。它不会向配置管理器提出预告。因而产生了名为 ASD 的模块。

在执行这些存在潜在灾难的硬件试探前,配置管理器会创建一个文件,大致说“哦, 我要做危险的事情 X!”。这是计算机版本的经典“如果我一去不返,请把它打开”信封,动作片中的英雄去参加打击坏人的自杀性任务前会给他的女朋友留下这样一封信。

实际上,如果危险事情 X 确实导致计算机挂起、崩溃或重启,则在下次系统启动时,它会发现这个神奇的文件并“打开信封”看到导致计算机崩溃的危险事情 X。然后,系统会得出结论:尝试检测设备 X 是灾难性的,切勿重蹈覆辙!

执行此工作的模块即名为 ASD。字母 ASD 表示“尝试危险的事物”。

Raymond Chen 的网站 The Old New Thing 及同名著作 (Addison-Wesley, 2007) 均讲述了 Windows 的历史发展情况及 Win32 编程。因为这一方面非常热门,所以他倍加小心。

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.