从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”所取代。

    对于VISTA和Windows 2008,默认情况下BCD数据库在放在c:\boot\bcd中;但在windows 7和Windows 2008 r2中系统分区被隐藏起来(安装时系统会划分200M的系统分区,用来存放引导文件),需通过“磁盘管理”(Diskmgmt.msc),对系统分区执行“更改驱动器号和路径”,分配盘符,才能访问。





一、BCD数据库文件的内容



    BCD 文件,本质上就是一个注册表的 hive 文件,因此可以使用注册表编辑器直接对它进行修改。





   



    关于 BCD文件,我们需要关注的内容只有 Objects 下的内容,在 Objects下,有很多以 CLSID命名的
子键,每一个子键均有其特殊的含义。



    展开每一个 CLSID 键,一般都会有 2 个字键:Description 和 Elements。在 Elements 键下方,会有树木不等的子键存在,每一个子键都代表不同的含义。有一些是显示的内容,有一些是指向一些特殊的程序或目录用于 Windows Vista  的启动,剩下的一些和 Windows Vista  的启动参数有关。
  例如: 
    12000004 键下的 Element 字符串内容就是用于设定在 Boot Manager  的启动菜单上显示内容的。
    12000005  键用于指定 Boot Manager的语言。如果安装了的简体中文版本,那么这里的内容一定是 zh-CN,如果你想使用英文版的 Boot Manager,那么只需要修改为 en-US 即可。不过前提是需要在 \Boot  目录下有一个 en-US 的目录,而且里面有相应的 en-US语言的资源文件。



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



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



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



    42000002 节点用于设置从休眠模式唤醒时由哪个程序完成休眠状态/正常状态的转化。在Windows     如果安装了早期的采用 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。



    {9dea862c-5cdd-4e70-acc1-f32b344d4795}是一个专用于代表 Windows Boot Manager 的CLSID。



在{9dea862c-5cdd-4e70-acc1-f32b344d4795}键下面,有一个叫做 24000001 的子键,这个键用于指定将要显示在 Windows Boot Manager 上的操作系统启动菜单的 CLISD 编号。24000001 子键的Element 键是一个 REG_MULTI_SZ 类型的注册表键值,这表示可以写入多个内容。



{b2721d73-1db4-4c62-bf78-c548a880142d}是Windows 内存诊断项目的注册表键值





注意要用修改注册表键值,必须首先修改权限。





二、编辑BCD数据库的方法



1、使用系统属性里面高级选项进行修改



2、bcdedit.exe进行修改



3、msconfig.exe



4、使用第三方工具进行修改(如VistaBootPRO)



三、Bcdedit.exe的操作方法



使用 Windows 7 VHD启动计算机和在VHD文件上安装Windows 7或Windows 2008 R2也曾介绍过这个命令行工具。



1、显示BCD数据库的内容



Bcdedit





或Bcdedit /v,完整显示数据库的内容,此时数据库有些参数的值显示为该值的GUID。在上图启动管理器inhert为gobalsettings,用Bcdedit /v显示时,它的值变成了它的GUID。





注意,当在数据库增加一启动菜单项,系统会随机产生一个GUID。但系统中有些GUID是固定的。如下



标识

 ID

GUID

Windows Boot Manager

{bootmgr}

9dea862c-5cdd-4e70-acc1f32b344d4795

Firmware Boot Manager

{fwbootmgr}

a5a30fa2-3d06-4e9f-b5f4a01df9d1fcba

Windows Memory Tester

{memdiag}

b2721d73-1db4-4c62-bf78c548a880142d

Windows Resume Application

No alias

147aa509-0358-4473-b83bd950dda00615

Legacy Windows Loader

{ntldr}

466f5a88-0af2-4f769038095b170dc21c

Current boot entry

{current}

fa926493-6f1c-4193-a41458f0b2456d1e



 



BCDEdit ID

GUID

Description

{badmemory}

5189b25c-5558-4bf2-bca4-289b11bd29e2

Global RAM defect list that can be inherited by any boot application.

{bootloadersettings}

6efb52bf-1766-41db-a6b3-0ee5eff72bd7

Global settings that should be inherited by all Windows boot loader applications.

{dbgsettings}

4636856e-540f-4170-a130-a84776f4c654

Global debugger settings that can be inherited by any boot application.

{emssettings}

0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9

Global Emergency Management Services settings that can be inherited by any boot application.

{globalsettings}

7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e

Global settings that should be inherited by all boot applications.

{resumeloadersettings}

1afa9c49-16ab-4a5c-901b-212802da9460

Global settings that should be inherited by all resume applications.



 



2、/export /import



导出/导入BCD数据库



可以利用导出/导入对BCD数据库进行备份和还原。



Bcdedit /export c:\bcd.bak(导出BCD数据库的内容到c:\bcd.bak文件中)



Bcdedit /import c:\bcd.bak(导入c:\bcd.bak文件的内容到Bcd数据库中)



3、/createstore



新建空的启动配置数据存储



bcdedit /createstore <filename>



创建的存储不是系统存储。



Bcdedit /createstore C:\DATA\BCD



4、/store



指定要使用的存储。
bcdedit /store <filename>



此选项不能与 /createstore、/import 和 /export 命令一起使用。



示例:



bcdedit /store c:\RemoteInstall\Boot\x86\default.bcd /set {bootmgr} timeout 10
将c:\RemoteInstall\Boot\x86\default.bcd存储中启动管理器选择默认项以前等待的时间设置10秒
5、/copy



创建指定启动项的副本



bcdedit /copy {current} /d "copy of current"
已将该项成功复制到 {fbc1dbf9-8bfe-11de-bb65-000c297cc8af}。



6、/delete



删除启动配置数据存储中的项。



bcdedit [/store <filename>] /delete <id> [/f] [/cleanup | /nocleanup]



    <filename>      指定要使用的存储。如果未指定此选项,则使用系统存储。
    <id>            指定要删除的启动项的标识符。



    /f              删除指定的项。如果没有此选项,则 Bcdedit 将无法删除任何具有已知标识符的项。



    /cleanup        删除指定的项,并从显示顺序中删除该项。并将从存储中删除任何其他涉及到所删除项的项目。删除 OS 加载器项时,如果任何其他 OS 加载器没有引用该项,还将删除从休眠中恢复的关联项。如果未指定 /nocleanup,则认为使用此选项。



    /nocleanup      删除指定的项,但不从显示顺序中删除该项。



示例:



  下列命令删除存储中指定的操作系统项,并从显示顺序中删除该项:



    bcdedit /delete {fbc1dbf9-8bfe-11de-bb65-000c297cc8af}



  下列命令删除存储中指定的操作系统项,并从显示顺序中删除该项:



    bcdedit /delete {fbc1dbf9-8bfe-11de-bb65-000c297cc8af} /cleanup



  下列命令删除存储中指定的操作系统项,但不从显示顺序中删除该项:



    bcdedit /delete {fbc1dbf9-8bfe-11de-bb65-000c297cc8af} /nocleanup



  下列命令删除存储中基于 NTLDR 的 OS 加载器项:



    bcdedit /delete {ntldr} /f



7、/set



设置引导配置数据存储中的项选项值。



   Bcdedit /set



   下列命令将应用程序设备设置到 C: 分区:



    bcdedit /set {default} device partition=C:



   下列命令将操作系统设备设置到 VHD 文件(C:\vdisks\vdisk01.vhd)



    bcdedit /set {cbd971bf-b7b8-4885-951a-fa03044f5d71} osdevice vhd=[C:]\vdisks\disk01.vhd



   下列命令将应用程序路径设置到 \windows\system32\winload.exe
    bcdedit /set {cbd971bf-b7b8-4885-951a-fa03044f5d71} path   \windows\system32\winload.exe



   下列命令将 NX 策略设置到 OptIn。



    bcdedit /set nx optin



   下列命令设置成以VGA启动



    bcdedit /set {cbd971bf-b7b8-4885-951a-fa03044f5d71} vga yes



   下列命令将{ntldr}启动描述设置为"启动Windows XP"



   bcdedit /set {ntldr} description "启动Windows XP"



 8、/deletue



   从启动配置数据存储的项中删除数据元素



   bcdedit /deletue {cbd971bf-b7b8-4885-951a-fa03044f5d71} vga



9、显示Windows 7和Windows 2008 r2隐藏的BCD项目()



   用BCDedit显示BCD数据库的内容,复制recoverysequence的GUID:{05ef5750-78da-11de-9f1a-fc76848d1136}(如前图)



   接着输入以下命令bcdedit /displayorder {05ef5750-78da-11de-9f1a-fc76848d1136} /addfirst



然后输入bcdedit /v会发现显示内容多了一项。重启Windows 7时就会在开机菜单中出现Ramdisk Options选项,这是Windows7集成的Windows Recovery Environment,该选项在系统修复/恢复是非常有用。




在bios 中windows boot manager windows boot manager wdc_运维


由于上图中的启动项目其实是调用C:\Recovery\05ef5750-78da-11de-9f1a-fc76848d11
36\Winre.wim文件,所以我们可以用一个更为强大系统恢复文件替换这个文件(如DaRT6.0, Diagnostics and Recovery Toolset的使用这一篇博文中介绍了DaRT6.0光盘的生成方法,我们可以将这个ISO文件中的sources\boot.wim复制为C:\Recovery\05ef5750-78da-11de-9f1a-fc76848d11
36\Winre.wim。),这样Windows Recovery Environment的功能会更为强大!!!

10、使用truncatememory排除损坏的内存单元


bcdedit /set {fbc1dbf9-8bfe-11de-bb65-000c297cc8af} truncatememory 536870912


设置{fbc1dbf9-8bfe-11de-bb65-000c297cc8af}以小于536870912内存来启动系统。这样可以用来测试内存出现故障的范围,同时可以用来进午软件测试。


11、快速添加系统菜单


  在一个多系统的环境,往往由于一些原因,会造成造成系统启动选择菜单不全或者有误,此时我们需要手动添加系统菜单项。 


假设Windows XP系统安装在C盘


  bcdedit /create {ntldr} /d "Microsoft Windows XP"


  bcdedit /set {ntldr} device partition=C:


  bcdedit /set {ntldr} path \ntldr


  bcdedit /displayorder {ntldr} /addfirst


 假设Windows 7安装在C盘

set id={cbd971bf-b7b8-4885-951a-fa03044f5d71} 
 
  

     bcdedit /create %id% /d "Windows 7" /application osloader 
 
  

     bcdedit /set %id% locale zh-cn 
   

     bcdedit /set %id% device partition=C: 
 
  

     bcdedit /set %id% osdevice partition=C: 
 
  

     bcdedit /set %id% path \Windows\system32\winload.exe 
 
  

     bcdedit /set %id% inherit {bootloadersettings} 
 
  

     bcdedit /set %id% systemroot \windows 
 
  

     bcdedit /set %id% nx OptOut 
 
  

     bcdedit /displayorder %id% /addfirst