Windows 机密:发展历史 — 长期探索历程

加入我们的 Windows 机密专栏作家行列,让我们共同体验名称带有“System”的所有目录的曲折历程吧!

Raymond Chen

过去,在还是 16 位 Windows 时,只有一个名为 C:\Windows\System 的目录。 随后就变得越来越复杂。

在引入 Win32 之后,又增加了另一个名为 C:\Windows\System32 的系统目录。 增加的这个目录用于容纳 32 位系统文件, 而 16 位系统文件仍然位于旧系统目录中。 除了 Windows 95 之外,其他系统中的 32 位和 16 位系统文件都在相同的目录中,即保留其旧名称 C:\Windows\System。 我们将不再赘述 Windows 95。

批处理文件从 C:\Windows\System32 中运行程序,预期随之运行的程序将与本机操作系统匹配。 虽然这些预期不是很明确,但是可根据活动的性质确定。 如果 System32 目录中都是 32 位程序,则运行 C:\Windows\System32\REG.EXE 程序以重新设置系统注册表设置的批处理文件将运行 32 位版本的 REG.EXE,这意味着系统将更新 32 位模拟版本的注册表,而不是更新真正的 64 位版本。 其他类型的脚本编写文件(如 REG 文件)也存在相同的问题。

此外,还有大量现有的 32 位程序对 System32 路径采用了硬编码,而不是调用 GetSystemDirectory 函数。 当针对 64 位 Windows 重新编译这些程序时,这些程序仍会尝试访问 System32 目录,希望找到 64 位文件(因为此程序现在正在进行 64 位编译)。 写入到配置文件或注册表的路径需要对 32 位和 64 位进程都有意义,还需要根据执行询问任务的程序的“位数”引用相应的目录。

还是一头雾水?

为了将其与容易混淆的情况区分开,Windows 团队决定 System32 目录在 64 位系统中存放 64 位文件,而在 32 位系统中存放 32 位文件。 32 只是名称的一部分而已,并不具有任何意义。 这类似于 DVD 仅仅是一个名称,而没有任何实际含义,或许多大公司将其名称正式更改为一串字母,这些字母曾经代表过某些具体含义,而如今只是一个名称而已,例如 HSBC、KFC、BP 和 KPMG。

面向 32 位进程的文件系统重定向增加了这已令人困惑的过程的复杂性。 当 32 位进程访问 64 位系统中的 C:\Windows\System32 目录时,其操作将重定向到 C:\Windows\SysWOW64 目录,您可以在该目录下找到 32 位系统 DLL。

因此,您应该将 System32 视为“与正在运行的应用程序具有相同位数的系统 DLL”目录的有些奇怪的名称。 在更真实的世界中,与这种类型类似的情况应该称为 SysExec 目录,因为其中包含与执行环境相匹配的文件。

别急,还有一些内容需要讨论

如果您想从 32 位进程访问实际的 64 位系统目录,该怎么办? 文件系统重定向将尝试访问 C:\Windows\System32 目录,并将其重定向到 C:\Windows\SysWOW64 目录。 您可以以编程方式使用这些采用繁琐名称(如 Wow64­Disable­Wow64­Fs­Redirection)的函数,但这些函数可能对所有操作都禁用了重定向,直到对其重新启用重定向功能。 如果您执行的操作比打开单个文件复杂,这可能会出现问题。 执行复杂操作可能会导致访问多个文件,还可能导致创建工作线程。

名字带有“System”的各个目录的曲折历程,现在介绍完了。 如果还是不很明白,只需记住目录的意义很少与其名称相匹配即可。

Raymond Chen

Raymond Chen * 的网站“The Old New Thing”及同名著作(Addison-Wesley,2007)讲述了 Windows 的发展史、Win32 编程和其他有趣的内容。*

相关内容