移动可引导Windows 7(或Vista)分区时需要更新什么?


9

当我将Windows上的可引导NTFS分区移动到另一个块偏移时,需要进行哪些更新才能使其再次可引导?

背景: 我计划编写一个执行必要操作的程序,这就是为什么我不寻求从Windows DVD引导如何使用Microsoft工具的指南的原因。相反,我需要自己修改这些内容,以便为普通PC用户编写一个解决方案,使普通PC用户在将Windows系统移动到更大的硬盘时更加轻松。

特别是,这是我尝试的方法:

我有一个带有多个分区的磁盘,其中一个是上面装有Windows的NTFS分区,并且该磁盘使用普通的旧MBR块0进行分区布局(不超过4个分区)。

现在,我格式化并分区一个更大的新磁盘。我在那里为NTFS分区腾出空间,并将内容从旧磁盘的NTFS Windows分区复制到其中。然后我将分区设为“活动”。

但是,当我尝试从该磁盘启动时,我立即收到“读取错误”消息,并且启动停止,确切的文本是:

  A disk read error occurred
  Press Ctrl+Alt+Del to restart

我验证了两个磁盘在块0中具有相同的引导扇区代码。

在我看来,可能还需要更新其他内容。我猜想某个地方有一个我需要更新的绝对块引用,可能指向下一级加载程序或NT内核。

更新:我发现这篇文章深入了我想知道的内容。但是,它说要修改boot.ini,但是我在这里安装了Windows 7,这些东西似乎已经改变了:没有boot.ini,而是一个名为GUI的系统卷信息文件夹以及其他与我的问题有关的数据。要继续挖掘...

更新2:由于starman的网站看起来很糟糕,但是信息量很大,因此我能够弄清楚第一步:NTFS引导扇区具有用于“隐藏”扇区的字段。该字段必须包含引导扇区的扇区号。这解决了“读取错误”消息。但是,现在,我收到“ BOOTMGR丢失”错误。看起来还有另一个地方必须调整块号,但是我在代码清单中找不到与此有关的任何内容。

我确实找到了很多帮助站点,这些站点建议使用Windows工具来解决此“ BOOTMGR丢失”问题,但是似乎没人知道幕后的情况。有点像建议在出现问题时重新安装Windows。至少,这些修补程序似乎有效,主要涉及Bcdedit和Bootrec工具。现在,谁知道他们在移动分区方面的工作,尤其是后者呢?

更新3:经过大量的反复试验后,我现在相信解决方案位于BCD-Template注册表文件中,该文件通常位于\ Windows \ System32 \ config中。如果使用“ bcdboot”命令对此进行了更新,则Windows将从中启动。我现在正在弄清楚该注册表包含与上述问题有关的哪些信息。欢迎使用任何指向此注册表内容的指针。

更新4:结果是,虽然BCD-Template文件被重写并具有与其前任不同的二进制内容,但其中的值不会更改。因此,它必须是bcdboot.exe编写的其他内容。我以前已经检查过它是否更改了分区的前32个引导块,但是它们似乎保持不变。Parititon地图也不会更改。那么,bcdboot除了BCD注册表之外还修改了什么?关于如何追踪的任何提示?是否有低级工具向我显示程序写入的文件?

更新5:答案似乎是:c:\ Boot \ BCD也已更改,这似乎是引导管理器过程的关键文件。我待会再调查...

更新6:安装Windows 7时最初创建了两个分区,这似乎是一个重要的细节:一个204800扇区的小分区,似乎是一个引导分区,然后是包含Windows系统的实际的大分区(驱动器C :)。当我尝试将安装转移到更大的新磁盘上时,我将相同的两个分区保留在新驱动器上,尽管它们以不同的偏移量结束了。仅此一项就导致了“ BOOTMGR丢失”消息。从那时起,我仅在Windows分区上使用了bcdboot.exe,该分区已添加该分区上的\ Boot \ BCD文件。该文件(和文件夹)最初确实仅存在于较小的分区中。因此,在我的情况下,这个问题可能会更加复杂,因为一个分区(引导捆绑程序)被称为另一个分区(一个包含操作系统的分区),而其他人可能只需要处理一个包含两个分区的分区,也许在那里更简单。

更新7:找到了更多详细信息:\ Boot \ BCD文件记录了MBR的序列号。如果该数字不匹配,则系统将无法启动。接下来,我将测试其中是否还存储有绝对块引用。


只是想知道,您确定隐藏的系统分区已正确移动吗?
哥伦布

您是指哪个隐藏分区?我刚刚添加了更新#6,它讨论了额外的启动分区,是的,我也确实做了这一点。MBR和Windows分区的开始之间还有另一个“隐藏”区域,但这不应该有任何关系-只是数据的一小部分(在我的情况下:我正在移动的HFS +分区)在这里进行Boot Camp安装)。所涉及的唯一事情应该是:分区图(MBR加GUID方案分区图),以及两个涉及的Windows分区(小型启动器和C:分区)。我当然正确地更新了所有内容。:)
SuperTempel 2010年

最重要的是\BCD\Boot,最重要的东西肯定存储在其中,通常,您可以使用bcdedit.exe而不是对其进行编辑bcdboot。是的,用于引导引导的单独分区(仅当使用全盘加密功能时才需要,因为解密代码随后必须存储在主Windows分区之外,因此需要)来控制引导过程(如果存在)。
Ben Voigt 2010年

@Ben:是的,我了解bcdedit-但据我所知,我不想编辑任何内容,因为我不想在将分区移动到新磁盘之前更改其任何选项。 。我要更新的是任何固定的块号和磁盘ID引用,如果可能的话,不使用任何Windows可执行文件。
SuperTempel 2010年

1
不是编程问题。这是有关Windows引导程序的领域知识。
没有人2010年

Answers:


1

更简单的方法?

将Windows Vista或Windows 7安装光盘放入光盘驱动器中,然后启动计算机。
当提示您按一个键。
选择一种语言,一种时间,一种货币,一种键盘或一种输入法,然后单击下一步。
单击修复计算机。
单击您要修复的操作系统,然后单击“下一步”。
在“系统恢复选项”对话框中,单击“命令提示符”。
键入Bootrec.exe,然后按Enter。

Bootrec.exe选项
Bootrec.exe工具支持以下选项。使用适合您情况的选项。

注意如果重建BCD不能解决启动问题,则可以导出和删除BCD,然后再次运行此选项。这样,您可以确保完全重建了BCD。

为此,请在Windows RE命令提示符下键入以下命令:
bcdedit / export C:\ BCD_Backup
c:
cd boot
attrib bcd -s -h -r
ren c:\ boot \ bcd bcd.old
bootrec / RebuildBcd

或/ FixMbr或/ FixBoot或/ ScanOs或/ RebuildBcd,具体取决于情况。

请参阅:Support.Microsoft.com了解更多详细信息。


1
感谢您尝试提供帮助,但正如您所指出的,您所说的只是标准知识。我特别需要“正在做什么”信息来用自己的书面程序来完成此任务,而不是通过使用Microsoft的软件来完成此任务,对于普通用户而言,这仍然很难处理。我希望能够为具有Boot Camp安装的Mac用户提供解决方案,以防他需要将其移动到另一个磁盘上。这样做的副作用是,它的其他功能也将对其他Windows用户有所帮助。
SuperTempel

如果我想这样做...我会在磁盘安装前后添加dd,然后在两者之间进行二进制比较。祝好运。
2011年

我再次领先于你。看,我是iBored的作者,所以我知道该怎么做,并相信我,我已经尝试过。不过,新格式对我来说太神秘了,这就是为什么我在这里问这个问题。
SuperTempel 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.