You are on page 1of 17

Windows Vista BCD 的故事

Smallfrogs [MVP]
[smallfrogs@gmail.com, http://www.KZTechs.com]

修订:1.00,2006-7-1
注意:
1. 本文内容用于揭示 Windows Vista 下 BCD 的一些原理性的内容,作者拥有本文的全部版权。
2. 未经许可,严禁任何个人、组织将本文用于任何商业场所、各种平面媒体和各种商业网站上。违
者需要承担相应的法律责任。
3. 对于本文提供的内容,作者保留随时进行修订而不告知的权利。
4. 对于本文所列举软件、书籍的版权,均由软件持有者和书籍作者
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

序:

在下一代 Windows 操作系统 Windows Vista 里面,Microsoft 引入了很多新的特性,其中就包括新的引


导模式。
本文将分五个部分向您揭开 Windows Vista 引导程序中数据储存库 BCD 的秘密。

本文目录

序: .................................................................................................................................................................................... 1
一、 WINDOWS 引导方式的变迁............................................................................................................................. 2
二、 BCD 的解释 ...................................................................................................................................................... 3
三、 解密 BCD .......................................................................................................................................................... 5
四、 结论 ................................................................................................................................................................. 13
五、 后记 ................................................................................................................................................................. 14
参考资料 .......................................................................................................................................................................... 15

第 1 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

一、 Windows 引导方式的变迁

对于一台计算机来说,操作系统的启动是很关键的一个步骤,如果操作系统不能正常启动,那么计算
机只能算是一堆废铁。对于目前占据了大量桌面计算机市场领域的 Microsoft Windows 操作系统来说,其
能否正常的启动会影响所有使用 Microsoft Windows 操作系统的用户。众所周知,Windows 的引导方式前
前后后经历过多次的变动,基本上是每换一代 Windows 操作系统,Windows 的启动方式均要发生一次变动。
Windows Vista 作为第 6 代 Windows 操作系统的开路先锋,其启动方式再次发生了变动。
在 Windows Vista 里面,无论是早期的从纯 DOS 模式下引导还是现在 Windows 2000/XP/Server 2003
采用的 NTLDR + NTDETECT.COM 的引导方式,均被抛弃了。一种被称为 Boot Manager 的组件取代了
NTLDR + NTDETECT.COM 的引导方式,成为 Microsoft 在 Windows Vista 里面采用的 Windows 引导方式。
在 Windows Vista 里面,当你启动计算机的时候,首先是 BIOS 开始运行,BIOS 从启动设备里面读取
主引导扇区(MBR)的记录,然后把控制交给储存在 MBR 里面的启动代码,接着 Boot Manager 启动并从
Boot Configuration Data (BCD) 里面读取启动项目信息并把这些信息显示在屏幕上面,并等待用户选择。
当用户选择了一个启动项目以后,Boot Manager 根据用户的选择,从 BCD 里面获取相关的启动参数和配
置信息,然后开始系统的引导过程。
对于安装了 Windows Vista 的机器,Microsoft 将修改被激活的主分区的启动扇区(Windows 安装程序
将在磁盘的第一个扇区里面写入 MBR 内容),使用新的启动扇区内容替代原有的启动扇区的内容。经典的
错误提示信息:“NTLDR is missing”将被“Bootmgr is missing” 所取代。

关于 NTLDR 的解释,请参考故事系列文章《NTLDR 的故事》1一文。

1
《NTLDR 的故事》一文可以从 http://www.KZTechs.com 文章栏目里面免费下载到。
第 2 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

二、 BCD 的解释

前面提到,Windows Vista 里面新引入了一个启动组件:Boot Manager,Boot Manager 将负责 Windows


操作系统的初始化引导工作,与之相配的还有一个数据储存库:Boot Configuration Data,简称 BCD。
在 BCD 里面,含有 Windows 操作系统的启动参数配置信息以及控制如何启动 Windows Vista 以及
Windows Server® Code Name "Longhorn" 的所有信息。在采用 BCD 之前,这些信息是储存在 Boot.ini 文
件(基于 BIOS 操作系统)或者非易失性内存里面的(基于 EFI 的操作系统)。在 Windows Vista 里面,所
有这些信息将储存在 BCD 里面。
当安装完成 Boot Manager 以后,Windows 安装程序将把 BCD 数据存放到活动分区的根目录下一个
叫做 Boot 的目录里面,通常情况下是 C:\Boot 目录。在这个 Boot 目录里面,Windows 安装程序将创建
一个没有扩展名的、叫做 BCD 的文件(如图所示)。

这个 C:\Boot\BCD 文件就是整个 BCD 数据库。在 Windows Vista 运行的时候,这个文件是不能够被


删除或者改名的,这是因为系统一直占用它。如果你将这个文件删除,且你已经安装了 Boot Manager,那
么你的系统将出现不能够启动,因为 Boot Manger 无法找到合适的 BCD 数据文件供使用。
如果需要修改 BCD 数据内容,可以有以下一些方法使用:
1. 使用系统属性里面高级选项进行修改。在 Windows 2000/XP/Server 2003 里面,我们可以通过系统
属性里面的高级选项来修改启动方式。由于在 Windows Vista 里面,所有的启动信息均是保存在
BCD 数据库里面的,因此当使用系统属性里面高级选项对启动参数修改的时候,实际上修改的就
是 BCD 数据库内容。
2. 使用 Windows Vista 自带的专用的 BCD 修改工具:bcdedit.exe 进行修改。Bcdedit.exe 基本上涵

第 3 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)
盖了所有的 BCD 项目的操作内容,不仅仅是编辑、删除,而且可以创建,复制等。关于 bcdedit.exe
的使用方法,请参考 Windows Vista 帮助手册。
3. 使用 msconfig.exe。由于在 Windows Vista 里面,所有的启动信息均是保存在 BCD 数据库里面
的,因此当使用 msconfig.exe 对 Windows Vista 启动参数进行修改的时候,实际上修改的就是 BCD
数据库内容,因此,也可以使用 msconfig.exe 对 BCD 数据库进行修改和配置。
4. 使用第三方工具进行修改。通过使用 Windows Vista 提供的 BCD WMI 接口,也可以对 BCD 数
据库进行修改和配置。
以上四点是 Microsoft 推荐的修改方法,除此之外,还有一种比较暴力的、需要对 BCD 有相当熟悉的
人才能够运用自如的方法并没有被提及,因为这种方法过于危险,因此不建议使用。除非碰到了不得不为
之的情况。
在后面的解密一章里面,我将带领大家认识 C:\Boot\BCD 到底是一个什么样的文件,以及如何对这个
文件进行操作。

第 4 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

三、 解密 BCD

[警告:本章内容所示的操作具有相当高的危险性,不建议模范操作。]

如前面所述,BCD 数据库文件是储存在 C:\Boot\BCD 文件里面的,这个文件有什么特别的呢?


我们知道,Windows 2000/XP/Server 2003 的引导信息配置文件是一个 INI 文件,而 INI 文件是以纯文
本方式存放的,使用任何的文本编辑器均可以编辑它。方便的操作也会给系统安全带来一些隐患,任何计
算机病毒或者恶意程序均可以改写 Boot.ini 文件,让用户的系统启动的时候变得不太一样。好在目前没有
听说过这种计算机病毒的大规模流行。这一点在 Windows Vista 里面得到了一点小小的改变,也许这种改
变是和安全无关的,但是这一点小小的改变就足以提高了非法修改启动引导方式的难度,这是因为在
Windows Vista 里面,启动信息不再以纯文本的方式存放,而是储存在一个有格式的文件里面,这个文件就
是前面所述的 BCD。
要对 BCD 进行解密,就必须研究它的文件格式,使用任何的 16 进制编辑工具打开 C:\Boot\BCD 文件,
在 00-03 字节处,会看到一个非常明显的标志字符串:regf(如图所示)。

熟悉 Windows 注册表的用户都知道,在 Windows 2000/XP/Server 2003 里面,任何注册表键(无论是


子键还是根键)均可以导出成为一个 hive 文件,另外 Windows API 函数 RegSaveKey() 以及 RegSaveKeyEx()
函数也可以通过软件开发的方式将注册表导出为一个 hive 文件。如果研究过 Windows 注册表的 hive 文件
就会知道,导出来的 hive 文件的前 4 个字节一定是“regf”。Windows Vista 的 BCD 文件,本质上就是一
个注册表的 hive 文件,因此我们可以使用注册表编辑器直接对它进行修改,而绕过 BCDEdit.exe 或其他工

第 5 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)
具。前提是你需要对 BCD 文件的文件结构非常熟悉。
下面将详细的介绍一些常用的 BCD 文件里面对应的注册表项目的含义:
在 Windows Vista 里 面 , 运 行 regedit.exe , 打 开 注 册 表 编 辑 器 。 然 后 定 位 到
HKEY_LOCAL_MACHINE\BCD00000000 键,把这个键展开以后,就可以看到完整的 BCD 文件的内容。
这是因为 Windows Vista 已经把 BCD 文件加载到系统的 HKEY_LOCAL_MACHINE 根键下面了。
下图是一个展开以后的 BCD 文件的内容。

关于 BCD 文件,我们需要关注的内容只有 Objects 下的内容,在 Objects 下,有很多以 CLSID 命名的


子键,每一个子键均有其特殊的含义,对于 Windows 启动来说,启动项目的子键总是成对出现的。如上图
所示,{50c73d4c-e6b3-11da-bc73-d30cdb1ce216}和{50c73d4d-e6b3-11da-bc73-d30cdb1ce216}就是一对。唯
一的差别只在于第一个段的最后一个字符不同,其余的内容完全相同。Windows Vista 的 Boot Manager 将
根据 CLSID 来识别不同的启动项目。
展开每一个 CLSID 键,一般都会有 2 个字键:Description 和 Elements。在 Elements 键下方,会有树
木不等的子键存在,每一个子键都代表不同的含义。有一些是显示的内容,有一些是指向一些特殊的程序
或目录用于 Windows Vista 的启动,剩下的一些和 Windows Vista 的启动参数有关。
例如:
z 12000004 键下的 Element 字符串内容就是用于设定在 Boot Manager 的启动菜单上显示内容的。
如下图所示,我已经将 Windows Vista 安装以后默认的启动菜单上的 Microsoft Windows 字样修改
为 Microsoft Windows Vista Beta 2 X86 EN。这样在系统启动的时候,就可以很明确的知道安装的
Windows Vista 是什么版本了。

第 6 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

z 12000005 键用于指定 Boot Manager 的语言,如果安装了 Windows Vista 的简体中文版本,那么


这里的内容一定是 zh-CN,如果你想使用英文版的 Boot Manager,那么只需要修改为 en-US 即
可。不过前提是需要在 C:\Boot 目录下有一个 en-US 的目录,而且里面有相应的 en-US 语言的资
源文件。

第 7 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

z 42000002 键用于指定 Windows Vista 的引导程序。在 Windows Vista 里面,引导程序已经改为


winload.exe。

z 而 22000002 节点用于指定 Windows Vista 安装以后的系统目录的名字,默认是 Windows 目录。

第 8 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

z 如果休眠模式,那么 22000002 节点用于指向休眠文件的文件名,默认是 hiberfil.sys 文件。

z 42000002 节点用于设置从休眠模式唤醒时由哪个程序完成休眠状态Æ正常状态的转化。在
Windows Vista 里面,这个程序叫做 winresume.exe。

第 9 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

z 如果安装了早期的采用 NTLDR 引导的操作系统,如 Windows 2000/XP/Server 2003,那么 Boot


Manager 将出现一个叫做{466f5a88-0af2-4f76-9038-095b170dc21c}的 CLSID,这个 CLSID 用于代
表采用 NTLDR 启动模式的操作系统的引导程序的名字。当用户从 Boot Manager 里面选择 Earlier
version of Windows 菜单项目以后,Boot Manager 将根据 12000002 节点指向的内容调用早期
Windows 操作系统的引导程序,默认为 NTLDR。

第 10 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)
z {9dea862c-5cdd-4e70-acc1-f32b344d4795}是一个专用于代表 Windows Boot Manager 的 CLSID。

第 11 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)
z 在{9dea862c-5cdd-4e70-acc1-f32b344d4795}键下面,有一个叫做 24000001 的子键,这个键用于指
定将要显示在 Windows Boot Manager 上的操作系统启动菜单的 CLISD 编号。24000001 子键的
Element 键是一个 REG_MULTI_SZ 类型的注册表键值,这表示可以写入多个内容。在我的系统上
面,这个键值数据有 3 项,这代表了我的系统至少安装了 3 个操作系统,而且安装了采用 NTLDR
引导的早期的 Windows 操作系统。

实际上,Element 键值反映的问题的确和真实的情况一致,我的确在我的机器上安装了 Windows


XP、Windows Vista Beta 2 X86 EN 和 Windows Vista Beta Build 5XXX 3 个操作系统。\
需 要 注 意 的 是 , Windows Vista 新 增 的 Windows Memory Diagnostic 项 目 的 并 不 属 于
{9dea862c-5cdd-4e70-acc1-f32b344d4795} 键 , 它 是 作 为 一 个 单 独 的 键
{b2721d73-1db4-4c62-bf78-c548a880142d}存在的。

最后需要说明的是,Windows Vista 对 BCD 键是采用了保护措施的。Windows Vista 默认设定,只允


许 SYSTEM 用户能够完全控制这个键,而 Administrators 组用户只有读取的权限,没有开枪写入的权限。
而其他类型的用户则根本没有查看的权限。
换句话说,要修改这个键,就需要手动调整注册表的安全描述符的内容了。调整注册表安全描述符的
方法很简单,只需要右键点击将要被修改的键,然后选择权限,然后点击添加按钮把自己的账户加入列表,
并打开写入权限即可,这里不再详细的描述。

[提示]只有在万不得已的情况下才能够使用注册表编辑器来直接修改 BCD 数据;其他情况下要对 BCD


进行修改,建议还是使用 Microsoft 提供的四种方法。毕竟直接通过注册表编辑器对 BCD 文件进行修改,
难度和风险太大!

第 12 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

四、 结论

本文从数据原储存格式的方便揭示了 BCD 数据格式的一些基本的信息, 并没有涵盖 BCD 的全部内容。


从上述描述可以看出,Windows Vista 里面带来的新动向、新东西实在太多了,要想一个人将 Windows Vista
完全掌握绝对是不可能的。作为第 6 代 Windows 操作系统,要学习、研究的地方实在太多了。

第 13 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

五、 后记

BCD 是一个非常复杂的话题,涉及到很多 Windows 比较深入的技术。要想讲清楚不是 10 多页能够完


成的。本文简单的描述了 Windows Vista BCD 的特性,希望能够帮助大家对 Windows Vista 有一个更好的
认识。
由于本人水平有限,如果发现有不正确的或有疏漏的地方,请指出;如果对本文有什么意见,也可以
告知我。我的 Email 是:smallfrogs@gmail.com,谢谢各位!

感谢您的阅读!
Smallfrogs
2006-7-1

第 14 页
Windows Vista BCD 的故事 Smallfrogs (http://www.KZTechs.com)

参考资料

Microsoft Corporation, Microsoft MSDN Library, http://msdn.microsoft.com/library/


Microsoft Corporation, Microsoft TechNet, http://technet.microsoft.com/
Microsoft Corporation, Microsoft Windows Vista 网站, http://www.microsoft.com/windowsvista/

第 15 页

You might also like