Windows 机密文件系统 Paradox

Raymond Chen

如果查看一下硬盘驱动器, 您很可能会注意到大量操作系统文件位于启动驱动器的根目录。如果更进一步查看那些文件,您可能会注意到一个主题:boot.ini、NTLDR 和 NTDETECT.COM 是关键启动文件,而 hiberfil.sys 是休眠文件。这些是启动操作系统(对于 hiberfil.sys,为从休眠状态恢复)的前几个关键阶段将涉及到所有文件,而且它们必须进入启动驱动器的根目录。为什么不能将它们移动到其他位置呢?

我的同事 Adrian Oney 解释道:为了从磁盘中读取启动文件,您需要安装文件系统驱动程序,但文件系统驱动程序位于磁盘中,而且必须加载了文件系统驱动程序才能读取磁盘。噢不,自相矛盾!

通过为关键启动文件构建小型文件系统驱动程序可打破该恶性循环。此小型驱动程序仅能够查找根目录中的文件并将它们加载到内存中。这些文件反过来却可以使操作系统开始运行,此时真正的文件系统驱动程序才能够接管并查找位于更加独特位置(比如,子目录)的文件。

  

休眠将采用类似的模式。使操作系统处于休眠状态意味着将内存中的全部内容转储到休眠文件中;从休眠状态中恢复需要将该文件提取到内存中并装作什么也没发生过。同样,它也是一个先有鸡还是先有蛋的问题:要加载休眠文件,您需要文件系统驱动程序,但是文件系统驱动程序位于休眠文件中。如果将休眠文件保留在启动驱动器的根目录中,则可使用小型文件系统驱动程序。

曾使用过 MS-DOS® 早期版本的用户非常了解操作系统启动文件的这种位置限制。旧的 SYS 命令使令人厌烦的旧软盘成为奇迹般的可启动软盘。但是,如果在已拥有数据的软盘上运行旧的 SYS 命令,转换过程很可能会失败,因为 MS-DOS 的早期版本要求启动文件位于软盘的特定位置以便启动扇区能够找到它们。MS-DOS 的较新版本通过改进启动加载程序放松了这些要求,但即使是改进版本,系统文件仍必须位于根目录下。

一位客户问道:“我能将休眠文件移动到子目录中吗?”毕竟,文件的位置怎么会有影响?无论您将文件的 ACL 放在哪里,应该都是一样的。但是这些人想将它置于不同于启动驱动器的驱动器上,却被告知不可以。他们并不真正理解为何会有这种限制,因此尝试结束运行:嗯,如果至少能够将它移动到子目录中,我就能够创建一个目录并使该目录成为指向我真正想使休眠文件所处位置的交接点。哈哈 — 我重新定位了休眠文件!

当然,小型文件系统驱动程序并不了解装入点(因为装入点意味着与磁盘管理服务交流,但在系统启动时,计算机甚至还未加载操作系统),对一些了解如何将驱动器号映射回 ARC 路径的奇特、高级服务所知就更少了,而且即使您一定程度上运行该服务,仍必须查找其他硬盘驱动器的设备驱动程序并加载相应的文件系统驱动程序。

不久,就会有人询问将休眠文件置于 DFS 交接点上的方法,这只是时间问题。

Raymond Chen的网站“The Old New Thing”及其同名书籍(Addison-Wesley,2007)讨论了 Windows 的历史和 Win32 编程。他的 Web 2.0 名称是 Raymond,或者可能是 Chenster。

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