|
感谢CHENALL,没有他就没有本方法的实现!
CHENALL 为本人定制了一个GRLDR,可以显示和存储分区的offset值,而且可以实现字符替换功能,再也不用手动一个一个的去BCD中找SIGNATURE和分区的OFFSET值了。
注意这个GRLDR是最新版的,什么功能都有,不要理会错了。
===
直接启动WIN7的想法是raycar0在我的《定制NT6.X启动/安装目录》一贴中提出来的,想法非常的好,不依赖硬盘上的启动文件,直接启动硬盘上的WIN7。当时我已经明确的指出,只要我们修改了BCD文件中的磁盘签名(disk signature)和启动分区的偏移(offset),就可以从任何盘启动WIN7。
也正是基于这样一个原理,通过使用grub4dos的dd和replace命令,实现了我们的目标。
一个已安装系统的BCD文件记录了WINDOWS所安装在的磁盘以及哪个分区上,不同电脑的BCD文件是不能通用的,如果想通用,必须解决两个问题,一是代表磁盘的磁盘签名,另外一个是所安装分区的地址偏移。
在BCD文件中,凡是指定PARTITION=X:的项,都记录了磁盘签名。本人统计了一下,一个标准的WIN7,其BCD文件中涉及的签名和OFFSET之处达11处之多,为了完全与硬盘启动WIN7的过程一样,我们需要把这些签名全部修正。
OK,我们开始动手了:
这里我们举的例子是通过grldr加载一个img,再启动里面的bootmgr。下面要建立这个img文件。
建立一个720K的iimg文件,根目录放入bootmgr,建立boot目录,里面放入一个标准的BCD文件。假设名字为openwin7.img。
下面,就是关键内容了,我们需要修改这个img中的BCD文件的磁盘签名,使其与WIN7所在的磁盘签名一致。
假设img文件位于UD中。menu菜单是这样的:
title open win7 directly
map --mem (ud)/openwin7.img (fd0)
find --set-root --ignore-cd --ignore-floppies /windows/system32/winload.exe
map () (hd30)
map --hook
write 0x60004 0
write 0x60000 0
dd if=(hd30)+1 of=(md) bs=1 count=4 skip=0x1b8 seek=0x60000
map (hd30) (hd30) && map --hook
cat --length=0 ()-1
dd if=(md) of=(md) bs=1 count=8 skip=0x8290 seek=0x60008
cat --locate=\xD0\x3F\x06\0 --replace=*0x60000 (fd0)/boot/bcd
cat --locate=\0\x7E\0\0 --replace=*0x60008 (fd0)/boot/bcd
chainloader (fd0)/bootmgr
注意:对于BIOS激活或正版系统,这样操作是没有问题的,对于软激活的系统,可就不是这个样子了,直接引导bootmgr会提示您为"盗版受害者"。
怎么办?把WIN7启动分区根目录的grldr放到img中,先修改BCD文件,再chainloader (fd0)/grldr就行了。
另外,如果不使用本方法直接启动硬盘WIN7,假设WIN7只是没有了BOOTMGR文件,CHENALL提供了简单的指令:chainloader --edx=0080 (fd0)/bootmgr。
当然,如果你的WIN7没有问题,那么你直接find --set-root再chainloader就可以了。
[ 本帖最后由 victor888 于 2009-11-20 15:44 编辑 ] |
|