Windows 95 如何判断一个安装程序正在运行?
摘要
Raymond Chen 解释了 Windows 95 如何通过检查可执行文件名中是否包含“setup”或“install”等魔法词来判断一个程序是否为安装程序。
<p>不久前,我提到过 <a title="Windows 95 对安装程序覆盖旧版本文件的防御措施" href="https://devblogs.microsoft.com/oldnewthing/20260324-00/?p=112159">Windows 95 有一些防御措施,防止安装程序用旧版本覆盖文件</a>。这些防御措施会在检测到某个安装程序完成时触发。但问题是,<a href="https://devblogs.microsoft.com/oldnewthing/20260324-00/?p=112159&commentid=143974#comment-143974">系统是如何知道有一个安装程序正在运行的呢</a>?</p>
<p>答案是:靠猜测。</p>
<p>如果程序名称中包含“setup”、“install”或其他一些魔法词,那么它就被视为安装程序。以下是这些魔法词的列表。</p>
<table class="cp3" style="border-collapse: collapse;" border="1" cellspacing="0" cellpadding="3">
<tbody>
<tr>
<th>魔法词</th>
<th>备注</th>
</tr>
<tr>
<td><tt>setup</tt></td>
<td> </td>
</tr>
<tr>
<td><tt>install</tt></td>
<td>冗余</td>
</tr>
<tr>
<td><tt>inst</tt></td>
<td> </td>
</tr>
<tr>
<td><tt>imposta</tt></td>
<td>意大利语?</td>
</tr>
<tr>
<td><tt>ayarla</tt></td>
<td>土耳其语?</td>
</tr>
<tr>
<td><tt>felrak</tt></td>
<td>匈牙利语?</td>
</tr>
</tbody>
</table>
<p>条目 <tt>install</tt> 与 <tt>inst</tt> 是冗余的,因为任何包含“install”的字符串也必然包含“inst”。我猜测“install”是首先被添加的,后来有人发现很多安装程序都命名为“<span style="border: solid 1px currentcolor;">blah</span>inst”(其中“blah”代表各种前缀),于是又添加了“inst”条目,但忘记移除冗余的“install”条目了。</p>
<p>如果程序名称没有匹配项,Windows 95 还会检查可执行文件的路径中是否包含“Setup”一词。</p>
<p>在上述两种情况下,文件检查会延迟到下次启动时进行,因为有些安装程序会意识到文件正在使用中无法替换,于是它们使用 <code>ExitWindowsExec</code> 退出 Windows 返回 MS-DOS,运行一个批处理文件,然后再重新启动 Windows。我们必须等到 Windows 重新启动后才能捕获那些被批处理文件不当修改的文件。</p>
<p>作为额外奖励,Windows 95 会在通过 INF 文件安装任何多媒体驱动程序后执行实时文件检查。我猜多媒体团队发现很多驱动程序会在它们的 INF 文件中覆盖系统 DLL,因此他们要求在之后进行一次清理。</p>
<p>本文最初发布在 <a href="https://devblogs.microsoft.com/oldnewthing">The Old New Thing</a> 上,原标题为 <a href="https://devblogs.microsoft.com/oldnewthing/20260707-00/?p=112508">How did Windows 95 decide that a setup program ran?</a></p>
查看缓存全文
缓存时间: 2026/07/07 22:35
# Windows 95 如何判断安装程序已运行? - 经典旧事
来源:https://devblogs.microsoft.com/oldnewthing/20260707-00?p=112508
不久前我曾提到,Windows 95 对覆盖文件为旧版本的安装程序有一些防御措施(https://devblogs.microsoft.com/oldnewthing/20260324-00/?p=112159)。这些措施会在检测到安装程序完成时触发。但系统是如何知道安装程序正在运行的呢(https://devblogs.microsoft.com/oldnewthing/20260324-00/?p=112159&commentid=143974#comment-143974)?
它靠猜测。
如果程序名称中包含 "setup"、"install" 或其他几个魔法词,则被认为是一个安装程序。以下是魔法词列表。
| 魔法词 | 备注 |
|--------|------|
| setup | |
| install| |
| inst | 冗余 |
| imposta| 意大利语? |
| ayarla | 土耳其语? |
| felrak | 匈牙利语? |
"install" 这个条目与 "inst" 冗余,因为任何包含 "install" 的词必然也包含 "inst"。我猜 "install" 是先添加的,后来有人发现很多安装程序被命名为各种 "blahinst"(其中 "blah" 为不同值),于是又添加了 "inst",但未能删除冗余的 "install" 条目。
如果程序名称中未匹配到任何词,Windows 95 还会检查可执行文件路径是否包含 "Setup" 一词。
在上述两种情况下,文件检查会延迟到下次启动,因为有些安装程序会意识到文件正在使用中无法替换,于是使用 `ExitWindowsExec` 退出 Windows 回到 MS-DOS,运行一个批处理文件,然后重新启动 Windows。我们必须等到 Windows 重启才能捕获批处理文件错误修改的文件。
作为额外福利,Windows 95 会在通过 INF 文件安装多媒体驱动程序后进行实时文件检查。我猜多媒体团队发现很多驱动程序在其 INF 文件中覆盖系统 DLL,因此他们要求事后进行清理。
### 分类
### 主题
## 作者
Raymond Chen
Raymond 参与 Windows 的演进已有 30 多年。2003 年,他创建了一个名为 "The Old New Thing" 的网站,其受欢迎程度远超他最疯狂的想象,这一发展至今仍让他感到不安。该网站后来催生了一本书,巧合的是书名也是《The Old New Thing》(Addison Wesley 2007)。他偶尔出现在 Windows Dev Docs Twitter 账号上,讲述一些毫无实用信息的故事。
相似文章
我们如何确定 CcNamespace.dll 是一组过早卸载的 DLL 中的主谋?
Raymond Chen 解释了他是如何通过分析调试器的已卸载 DLL 列表,并注意命名模式和顺序,从而确定 CcNamespace.dll 是一串过早卸载的 DLL 中的关键 DLL。
关于滥用Windows窗口类额外字节的兼容性说明
Raymond Chen 讨论了一个历史性的 Windows 兼容性问题,其中一些 16 位程序滥用窗口类额外字节来存储私有数据,以及微软如何在保持向后兼容性的同时,对 32 位和 64 位程序堵住了这个漏洞。
Mark-of-the-Web 与安装程序固定至站点
解释Windows中的Mark-of-the-Web(MoTW)机制如何被用来使安装程序根据其下载来源网站表现出不同行为,利用NTFS备用数据流。
quake.exe 如何获得其 TCP/IP 协议栈
本文详细介绍了 id Software 如何利用 Windows 95 DPMI 服务器和 TCP/IP 协议栈,使 Quake 的可执行文件能够在 DOS 和 Windows 95 上运行,从而实现更好的多人联网游戏体验。
WinQuake 存在的原因及其工作原理
深入探讨创建 WinQuake(Quake 的 Windows 原生版本)的历史原因,以及它如何在 Windows 95 和 NT 上实现接近 DOS 版本的性能。