预计阅读本页时间:-
11.2.3 Windows注册表
名字空间的根在内核中维护。存储设备,如系统的卷,附属于名字空间中。因为名字空间会因为系统的每次启动重新构建,那么系统怎么知道系统配置的细节呢?答案就是Windows会挂载一种特殊的文件系统(为小文件做了优化)到名字空间。这个文件系统称作注册表(registry)。注册表被组织成了不同的卷,称作储巢(hive)。每个储巢保存在一个单独文件中(在启动卷的目录C:\Windows\system32\config\下)。当Windows系统启动时,一个叫做SYSTEM的特殊储巢被装入了内存,这是由同样的装载内核和其他启动文件(例如位于启动盘的驱动程序)的程序来完成。
Windows在系统储巢里面保存了大量的重要信息,包括驱动程序去驱使什么设备工作,什么软件进行初始化,以及什么变量来控制操作系统的操作等。这些信息甚至被启动程序自己用来决定哪些驱动程序是用于启动的驱动,哪些必须立即需要启动。这些驱动包括操作系统自身来识别文件系统和磁盘驱动的程序。
其他配置储巢用在系统启动后,描述系统安装的软件的信息,特别是用户和用户态下安装在系统上的COM(Component Object-Model)。本地用户的登录信息保存在SAM(安全访问管理器)中。网络用户的信息保存在lsass服务中,和网络服务器文件夹一起,用户可以通过上述两种配置拥有一个访问网络的用户名和密码。Windows Vista的储巢列表在图11-11中显示。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

在引入注册表之前,Windows的配置信息保存在大量的.ini文件里,分散在硬盘的各个地方。注册表则把这些文件集中存储,使得这些文件可以在系统启动的过程中引用。这对Windows热插拔功能是很重要的。但是,随着Windows的发展,注册表已经变得无序。有些关于配置的信息的协议定义得很差,而且很多应用程序采取了特殊的方法。许多用户、应用程序以及所有驱动程序在运行时具有私有权限,而且经常直接更改注册表的系统参数——有时候会妨碍其他程序导致系统不稳定。
注册表是位于数据库和文件系统之间的一个交叉点,但是和每一个都不像。有整本描写注册表的书(Born,1998;Hipson,2000;Ivens 1998)。有很多公司开发了特殊的软件去管理复杂的注册表。
regedit能够以图形窗口的方式来浏览注册表,这个工具允许你查看其中的文件夹(称作键)和数据项(称作值)。微软的新PowerShell脚本语言对于遍历注册表的键和值是非常有用的,它把这些键和值以类似目录的方式来看待。Procmon是一个比较有趣的工具,可以从微软工具网站:www.microsoft.com/technet/sysinternals中找到它。
Procmon监视系统中所有对注册表的访问。有时,一些程序可能会重复访问同一个键达数万次之多。
正如名字所显示的那样,注册表编辑器允许用户对注册表进行编辑,但是一旦你这么做就必须非常小心。它很容易造成系统无法引导或损坏应用软件的安装,因此没有一些专业技巧就不要去修改它。微软承诺会在以后发布时清理注册表,但现在它仍是庞杂的一堆——比UNIX保留的配置信息复杂得多。
微软Windows Vista已经引入了一个基于事务管理的内核,用来支持对跨越文件系统和注册表操作的事务进行协调。微软计划在未来使用该功能以避免由于软件非完全正确安装而在系统目录和注册表储巢中留下当时局部状态信息所造成的元数据讹用问题。
Win32程序员通过函数调用可以很方便地访问注册表,包括创建、删除键、查询键值等。如图11-12所示。

当系统关闭时,大部分的注册表信息被存储在硬盘储巢中。因为极其严格的完整性要求使得需要纠正系统功能,自动实现备份,将元数据冲写入硬盘以防止在发生系统崩溃时所造成的损坏。注册表损坏需要重新安装系统上的所有软件。