当前位置:找DLL下载站系统新闻系统知识系统问题 → Windows Vista BCD 的故事

Windows Vista BCD 的故事

减小字体 增大字体 作者:张康宗(Smallfrogs)  来源:本站整理  发布时间:2007/1/10 17:11:29

序:

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

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

一、      Windows 引导方式的变迁

对于一台计算机来说,操作系统的启动是很关键的一个步骤,如果操作系统不能正常启动,那么计算机只能算是一堆废铁。对于目前占据了大量桌面计算机市场领域的Microsoft Windows操作系统来说,其能否正常的启动会影响所有使用Microsoft Windows操作系统的用户。众所周知,Windows 的引导方式前前后后经历过多次的变动,基本上是每换一代Windows操作系统,Windows的启动方式均要发生一次变动。Windows Vista 作为第6Windows操作系统的开路先锋,其启动方式再次发生了变动。

Windows Vista 里面,无论是早期的从纯DOS模式下引导还是现在Windows 2000/XP/Server 2003采用的ntldr+ntdetect.com 的引导方式,均被抛弃了。一种被称为Boot Manager的组件取代了ntldr+ntdetect.com 的引导方式,成为MicrosoftWindows 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 所取代。

二、      BCD的解释

前面提到,Windows Vista 里面新引入了一个启动组件:Boot ManagerBoot 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 基本上涵盖了所有的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有相当熟悉的人才能够运用自如的方法并没有被提及,因为这种方法过于危险,因此不建议使用。除非碰到了不得不为之的情况。

解密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或其他工具。前提是你需要对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个字键:DescriptionElements。在Elements键下方,会有树木不等的子键存在,每一个子键都代表不同的含义。有一些是显示的内容,有一些是指向一些特殊的程序或目录用于Windows Vista 的启动,剩下的一些和Windows Vista 的启动参数有关。

       例如:

  l         12000004键下的Element字符串内容就是用于设定在 Boot Manager 的启动菜单上显示内容的。如下图所示,我已经将Windows Vista
        装以后默认的启动菜单上的Microsoft Windows 字样修改为 Microsoft Windows Vista Beta 2 X86 EN
。这样在系统启动的时候,就可以
        很明确的知道安装的Windows Vista是什么版本了。

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

 

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

 

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

 

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

 

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

 

l         如果安装了早期的采用 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

 

l         {9dea862c-5cdd-4e70-acc1-f32b344d4795}是一个专用于代表 Windows Boot ManagerCLSID

 

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

 

实际上,Element键值反映的问题的确和真实的情况一致,我的确在我的机器上安装了Windows XPWindows 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文件进行修改,难度和风险太大!

结论

本文从数据原储存格式的方便揭示了BCD数据格式的一些基本的信息,并没有涵盖BCD的全部内容。从上述描述可以看出,Windows Vista 里面带来的新动向、新东西实在太多了,要想一个人将Windows Vista 完全掌握绝对是不可能的。作为第6Windows操作系统,要学习、研究的地方实在太多了。

 

后记

BCD 是一个非常复杂的话题,涉及到很多Windows比较深入的技术。要想讲清楚不是10多页能够完成的。本文简单的描述了Windows Vista BCD的特性,希望能够帮助大家对Windows Vista有一个更好的认识。

       由于本人水平有限,如果发现有不正确的或有疏漏的地方,请指出;如果对本文有什么意见,也可以告知我。我的Email是:[email protected],谢谢各位!

 

       感谢您的阅读!