(感谢victor888 )http://bbs.wuyou.net/forum.php?mod=viewthread&tid=152716&highlight= 定制NT6.X系统启动/安装目录 本贴原名叫:有没有玩破解的人--WIN7相关 ==== 本人写此贴的初衷主要是想在硬盘/USB盘上定制安装WIN7系统,摆脱WIN7根目录的众多文件夹,经过无数的失败,终于达到了自己的目的。 在开始这前,要感谢chenall, fujianabc和老九等人的讨论,尤其感谢chenall在关键时候帮助破解了难题。 进入正题 大家都知道,VISTA及以上系统其光盘结构为: QUOTE: autorun.inf setup.exe bootmgr <boot> <efi> <sources> <support> <upgrade> 其中: setup.exe是在WIN下进行安装WIN7的程序 autorn.inf是光盘自动运行文件,插入光盘会通过它运行setup.exe <boot>文件夹,最重要,含有启动NT6以上系统的启动配置文件BCD(相当于XP的boot.ini),挂载WIM的BOOT.SDI、内存检测和字体等工具 <efi>文件夹,EFI主板启动支持 <support>和<upgrade>就不用说了,是支持和升级相关文件夹。 <sources>,最重要,含有PE文件boot.wim和install.wim,以及在WIN下启动setup所需的文件。 我现在想做的就是把这些文件统计整理到一个文件中进行安装,这里假设我们将所有文件都弄到BOOT文件夹中,操作步骤如下: 1. 更改boot.wim文件的路径 这需要编辑BCD文件,我们使用bcdedit.exe(XP下也可以运行) 先运行: bcdedit /store BCD文件路径 /enum all /v QUOTE: Windows 启动管理器 -------------------- 标识符 {9dea862c-5cdd-4e70-acc1-f32b344d4795} description Windows Boot Manager locale en-US inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e} default {7619dcc9-fafe-11d9-b411-000476eba25f} displayorder {7619dcc9-fafe-11d9-b411-000476eba25f} toolsdisplayorder {b2721d73-1db4-4c62-bf78-c548a880142d} timeout 30 Windows 启动加载器 ------------------- 标识符 {7619dcc9-fafe-11d9-b411-000476eba25f} device ramdisk=[boot]\sources\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f} path \windows\system32\boot\winload.exe description Windows Setup locale en-US inherit {6efb52bf-1766-41db-a6b3-0ee5eff72bd7} osdevice ramdisk=[boot]\sources\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f} systemroot \windows detecthal Yes winpe Yes ems Yes Windows 内存测试程序 --------------------- 标识符 {b2721d73-1db4-4c62-bf78-c548a880142d} device boot path \boot\memtest.exe description Windows Memory Diagnostic locale en-US inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e} EMS 设置 ------------ 标识符 {0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9} bootems Yes 调试器设置 ----------------- 标识符 {4636856e-540f-4170-a130-a84776f4c654} debugtype Serial debugport 1 baudrate 115200 全局设置 --------------- 标识符 {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e} inherit {4636856e-540f-4170-a130-a84776f4c654} {0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9} 启动加载器设置 -------------------- 标识符 {6efb52bf-1766-41db-a6b3-0ee5eff72bd7} inherit {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e} {7ff607e0-4395-11db-b0de-0800200c9a66} 虚拟机监控程序设置 ------------------- 标识符 {7ff607e0-4395-11db-b0de-0800200c9a66} description Hypervisor Settings hypervisordebugtype Serial hypervisordebugport 1 hypervisorbaudrate 115200 设备选项 -------------- 标识符 {7619dcc8-fafe-11d9-b411-000476eba25f} ramdisksdidevice boot ramdisksdipath \boot\boot.sdi 这里我们要改变boot.wim的路径,运行如下命令, bcdedit /store BCD文件路径 /set {default} device ramdisk=[boot]\boot\sources\boot.wim,{7619dcc8-fafe-11d9-b411-000476eba25f} 同上,将上述的device改成osdevice,再运行一次。 因为我们改变了SOURCES目录的路径,因此还要让PE能找到install.wim文件,要进行下述第2步操作 2.修改startnet.cmd文件 这个文件位于boot.wim第2个映像的windows\system32目录下。 PE启动时会在X:\SOURCES目录下寻找setup.exe文件来进行安装, 如果SOURCES目录没有SETUP.EXE,那么winpeshl.exe会执行system32目录下的winpeshl.ini所指定的文件。如果winpeshl.ini没有指定程序或没有此文件,那么winpeshl.exe将会执行system32目录下的startnet.cmd文件,默认PE下存在此文件,会加载网络配置。我们解决这个boot.wim,可以使用imagex也可以使用sources目录的dism.exe。把这个文件内容变成: QUOTE: @echo off for %%a in (c d e f g h i j k l m n o p q r s t u v w y z) do (if exist %%a:\boot\sources\install.wim x:\sources\winsetup.exe /installfrom:%%a:\boot\sources\install.wim) exit 当然,要把setup.exe重命名为winsetup.exe 看到了吧,这个setup.exe可以有参数installfrom,有了它,我们就可以指定wim文件的位置了。 修改完毕:imgaex /unmount /commit 挂载的目录 使用grldr启动系统,chainloder /boot/bootmgr来实现启动或安装系统。 合盘 比如把VISTA、WIN7和2008 R2全部放到一个盘来安装,这些盘目录结构都一致,我们该怎么办呢? 当然我样可以通过配置BCD文件来指定boot.wim的位置,也可以将sources目录换成其它名字,可是这样非常的不爽,原因在于我们要通过BCD菜单来选单,没有直接bootmgr启动进入安装直接,我们该如何操作呢? 加注:有关合盘,可以参考微软的方法:Cross-Platform Deployment http://technet.microsoft.com/en-us/library/cc721953(WS.10).aspx 我们可以通过不同的BCD文件来实现直接启动不同的系统。 一切的入手点在于bootmgr这个文件,它是启动管理器,类似于XP的NTLDR,所不同的是这个文件即有CHECKSUM校验,又有数字签名验证,要修改它,必须解决这两个问题 国外的高手解决了checksum问题(http://www.boot-land.net/forums/index.php?showtopic=8043,6楼) 我们必须用VISTA SP0的BOOTMGR,用起文本编辑器打开,在0xe28处将7403更改为EB1A这样就去除了checksum校验。 在0x54b68处找到B.O.O.T.\.B.C.D,我们可以将BCD换成我们要的名字,例如VISTA使用BCD,WIN7使用7CD,2008使用8CD等。将这个bootmgr改名为你所需要的就可以了。 这样够了吗?不够,没有解决数字签名的问题,对于这个数字签名,国内有N人写了一篇文章(http://bbs.driverdevelop.com/htm_data/16/0711/106925.html),这篇文件解决了checksum和数字签名,可惜我“水平太潜”,用IDA如何也没有找到他所说的那几个函数,当然也无法修改。 用得着那么复杂的操作吗?用不着,国外的高手同样解决了数字签名问题,而且非常非常的签单,但他们只想到的是PXE启动PE,即用于bootmgr.exe启动过程,经过我试验,这个方法同样对bootmgr有效: 打开BCD文件,运行:bcdedit /store BCD文件 /set {bootmgr} nointegritychecks yes OK,数字签名问题搞定。 说到这里,你可能要问,为什么不把bootmgr中的boot也给改名了?是的,我也尝试过,可是就是不成功,bootmgr里面所有出现boot的地方都改了,可是就是无法启动。 同样,如果你厉害,可以把sources目录的setup.exe或winsetup.dll也给改了,让它不用通过installfrom参数一指定WIM文件,可以直接启动安装。这个setup.exe没有checksum也没有数字签名,IDA打开,有PDB表,修改应该容易些。我尝试着改winsetup.dll失败了。可能你感兴趣,会IDA,那么说不定你会成功。 说到这里,你可能感到不爽,把SOURCES目录放到BOOT里,有什么用啊?目录结构与原来还不一致了,别急,下面告诉你一个比较好的方案: 把WIN7.ISO里面的install.wim放到U盘,参照微软的这篇文章HOW WIN PE WORKS(http://technet.microsoft.com/en-us/library/cc721977(WS.10).aspx),不修改startnet.cmd文件,添加一个winpeshl.ini文件,其内容为启动同目录下的setup.cmd文件,后者的内容同上述第2步的startnet.cmd,winpeshl.ini文件的内容为: QUOTE: [launchapps] x:\windows\system32\setup.cmd 另外,还要把sources目录的setup.exe更名为winsetup.exe。把修改后的boot.wim放入ISO中,直接 QUOTE: map ISO文件 (hd32) chainloader (hd32) boot 启动即可,这样我们可以随意把ISO和install.wim文件放到想放的位置。 还有没有更灵活的方法了?有的,chenall最终破解了将BOOT.WIM放到与BOOTMGR不在同一介质安装方法,同时经过测试,我俩还研究明白了BCD对畸形目录的写法。 OK, 现在假设把BOOT.WIM和INSTATLL.WIM同到到U盘的一个根目录下面,我们可以只留一个WIN7 ISO去除这两个文件的ISO,则我们必须修改BCD文件,因为这里的BOOT.WIM已经与ISO不在同一盘上了: 一切的问题根本在这个BCD文件,如果从与BOOTMGR非同一分区或介质上以RAMDISK启动BOOT.WIM,那么我们需要设定这个BOOT.WIM文件的路径的,光盘BCD目录默认其在SOURCES目录,且启动盘为BOOT,这个BOOT名字是很特殊的设备,是从光盘的BCD里发现的。为此,CHENALL专门写了一篇文章“单击打开:【分享】小技巧,两条命令解决WIN7安装后改MBR启动失败问题”,这是一个重要发现,将硬盘BCD文件启动区设置为BOOT后,MBR怎样改都不会出错。这样的问题最早PT在时空论坛遇到过(单击打开:修复 win 7 引导的一些经验),最后是FUJIANABC给出的解决办法,对比这个办法,还是CHENALL的简单、一劳永逸。 以上是我说的一个插曲,下面我继续说,如何从BCD入手去解决问题,在上面PT的贴子里已经提到了BCD文件是记录MBR和分区信息的,这非常的重要,我当初这所以失败,就是因为只考虑了盘符,不知道还有MBR的问题。解决方法就是先启动WIN系统,比如在PE下,假设你的U盘盘符为C:,那么,你就设置device和osdevice的rmadisk=[C:]\XX,U盘符是什么这里就设置什么,只这样做还不够,还必须改BOOT.SDI的盘符和路径,将ramdisksdidevice设置为=U盘的盘符,好了,你现在能正确启动BOOT.WIM,因为这时BCDEDIT在BCD文件中记录了磁盘的DISK SIGNATURE和分区的起始偏移,盘符只是个代码,BCD里记录的DISK SIGNATURE和OFFSET值才最终决定你是从什么盘什么分区指定DEVICE和OSDEVICE的。另外请参考本人在PE区发的“注册表与盘符”一文,会对DISK SIGNATURE和OFFSET有深入的了解。 对于畸形目录,有一个发现,比如本人的U盘为NTFS系统,dir显示畸形目录名为dat.,我当初在BCD中指定路径时都是使用的dat~1来代替,结果就是不成功,在CHENALL的提醒下,直接使用dat.做为路径名称就成功了。 本人目前的U盘就是把所有的WIN7相关的文件都放入了畸形目录,但没有使用去除了两个WIM文件的ISO,因为感觉体积还是大,就只保留了BOOTMGR和BOOT目录以及下面的BCD和MEMTEST文件,其余的都不要,做了一个1.4M的IMG,启动进直接将其MAP成FD0,再CHAINLOADER (FD0)/BOOTMGR就可以了。 全文完 20091103 [ 本帖最后由 victor888 于 2010-2-11 12:39 编辑 ] |
欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) | Powered by Discuz! X3.3 |