无忧启动论坛

标题: 用grub4dos+ntboot不能启动存放在gpt分区中的原生VHD系统的替代方法 [打印本页]

作者: qj_tzy    时间: 2014-8-14 08:50
标题: 用grub4dos+ntboot不能启动存放在gpt分区中的原生VHD系统的替代方法
本帖最后由 qj_tzy 于 2014-8-15 21:34 编辑

       经我试验,用grub4dos+ntboot按ntboot nt6=(hdx,y)/vhdos/win7.vhd或win8.vhdx方式,不能启动存放在gpt分区中的win7/win8原生VHD系统,会提示读取BCD出错。
      
       于是制作了boot_winnt6.ima包,在已知(hdx,y)/vhdos/win7.vhd或win8.vhdx的盘符(hdx,y)、所在目录/vhdos/、VHD文件名win7.vhd或win8.vhdx的情况下,用bootice生成的一个启动固定盘符、固定目录、固定VHD文件的BCD,手工替换了boot_winnt6.ima包内boot目录下的BCD,用grub4dos启动boot_winnt6.ima,就启动了存放在gpt分区中的vhd系统。但此法不具有灵活性。


       对任一(hdx,y)/vhdos/win7.vhd或win8.vhdx,须用grub4dos生成相应的bcd,在将boot_winnt6.ima包装入内存后,替换其boot目录下的BCD即可。但我不知如何进行,因我真的没读懂ntboot中是如何实现这一点的,若哪位网友能帮我写出一段这样的GRUB4DOS代码就好了。若如此,非常感谢!

解决办法:chenall 大在9楼发布的ntboot已成功解决这一问题,非常感谢C大!
作者: chenall    时间: 2014-8-14 18:44
本帖最后由 chenall 于 2014-8-15 15:16 编辑

试试这个NTBOOT批处理.直接下载解压,替换NTBOOT根目录下的NTBOOT文件.


有GPT分区的可以测试一下,看能不能正常启动.增加了对GTP分区的处理.

作者: qj_tzy    时间: 2014-8-14 22:26
chenall 发表于 2014-8-14 18:44
试试这个NTBOOT批处理.直接下载解压,替换NTBOOT根目录下的NTBOOT文件.

谢谢!我作了测试,反馈如下:

启动时,出现0xc000000e的出错代码,提示“引导配置数据存储中存在无效的对象”。

经我测试,以bios方式启动时,若用gpt分区的bootmgr读取bcd时,多次出错上述出错提示。
我还作了测试,若将上述vhd文件拷入mbr分区硬盘中,VHD文件内的bcd不作任何修改也启动正常。

另:您上传这个ntboot仅6KB, 而527104427 发布ntboot_2014.8.12的ntboot为19kb,这是否仅是精减功能?
作者: 527104427    时间: 2014-8-14 23:09
本帖最后由 527104427 于 2014-8-14 23:11 编辑
qj_tzy 发表于 2014-8-14 22:26
谢谢!我作了测试,反馈如下:

启动时,出现0xc000000e的出错代码,提示“引导配置数据存储中存在无效 ...


c大发布的是官方权威版本。gzip压缩。

本人发布的是diy作品,没压缩。会引进一些错误,严格来说,仅限本人使用。


作者: chenall    时间: 2014-8-15 09:06
本帖最后由 chenall 于 2014-8-15 15:16 编辑

再试试这个,看行不行,

我没有GPT分区,没有办法测试.
作者: qj_tzy    时间: 2014-8-15 09:16
chenall 发表于 2014-8-15 09:06
再试试这个,看行不行,

我没有GPT分区,没有办法测试.

谢谢,我在办公室无测试条件,待回家测试后反馈!
作者: qj_tzy    时间: 2014-8-15 13:17
chenall 发表于 2014-8-15 09:06
再试试这个,看行不行,

我没有GPT分区,没有办法测试.

我已回家作了测试,问题仍然与3楼相同。

按理说,ntboot将(hdx,y)/dir/nt6.vhd这一信息,在内存中生成bcd,再用ntboot中自带的bootmgr调用之,应该能正常启动,因没用vhd中的bootmgr来读取vhd中boot目录下的bcd。但一旦将vhd文件存放在gpt分区中启动就出错,而将之拷到mbr硬盘中,其内的bcd不作修改就能正常启动。我真没明白是怎么回事。
作者: 2011902    时间: 2014-8-15 14:12
MBR分区和GPT分区有很多差别,GPT没有活动主分区一说.请在GPT下,从新制作VHD的引导.
作者: chenall    时间: 2014-8-15 15:18
再来一个,还不行的话,只能等我抽空搭建坏境测试了.

我只有测试了在QEMU中测试启动GPT分区中的WIM文件成功

NTBOOT.rar

5.42 KB, 下载次数: 499, 下载积分: 无忧币 -2


作者: zsjyzx    时间: 2014-8-15 21:12
好消息,成了!!!!
===============================
再来一个,还不行的话,只能等我抽空搭建坏境测试了.

我只有测试了在QEMU中测试启动GPT分区中的WIM文件成功

NTBOOT.rar
5.42 KB, 下载次数: 6

===============
可以启动了.

作者: qj_tzy    时间: 2014-8-15 21:19
chenall 发表于 2014-8-15 15:18
再来一个,还不行的话,只能等我抽空搭建坏境测试了.

我只有测试了在QEMU中测试启动GPT分区中的WIM文件成 ...

我也测试了,已用您在9楼的ntboot成功启动了存放在gpt分区的vhd系统,非常感谢!
作者: qj_tzy    时间: 2014-8-15 23:03
本帖最后由 qj_tzy 于 2014-8-15 23:04 编辑
chenall 发表于 2014-8-15 15:18
再来一个,还不行的话,只能等我抽空搭建坏境测试了.

我只有测试了在QEMU中测试启动GPT分区中的WIM文件成 ...


再次反馈:

1.用9楼的ntboot用ntboot nt6=(hdx,y)方式,成功启动了安装在gpt分区中的win7_x32、win7_x64及win8_x64系统。
2. 用ntboot vboot=(hdx,y)/winxp.vhd方式,成功启动了存放在gpt分区中的winxp.vhd系统。
3. 用ntboot nt5=(hdx,y)方式,启动了安装在(hd0,6)分区中的winxp系统,但过了滚动条后,不能进入系统桌面。而用xorboot搜索存放在esp分区中根目录下的ntldr(含boot.ini等文件)成功启动(hd0,6)分区中的winxp系统。

作者: chenall    时间: 2014-8-16 08:18
qj_tzy 发表于 2014-8-15 23:03
再次反馈:

1.用9楼的ntboot用ntboot nt6=(hdx,y)方式,成功启动了安装在gpt分区中的win7_x32、win7 ...

启动XP系统,不能进入桌面,具体是到哪一步?

这个改动并没有针对NT5进行任何的修正.只是针对NT6.
作者: qj_tzy    时间: 2014-8-16 09:07
chenall 发表于 2014-8-16 08:18
启动XP系统,不能进入桌面,具体是到哪一步?

这个改动并没有针对NT5进行任何的修正.只是针对NT6.

卡在带"windows XP"字样和徽标的界面,而始终不出现“欢迎使用”的界面。

作者: qj_tzy    时间: 2014-8-16 09:34
chenall 发表于 2014-8-16 08:18
启动XP系统,不能进入桌面,具体是到哪一步?

这个改动并没有针对NT5进行任何的修正.只是针对NT6.

先说一声不好意思!

今天,我用xorboot搜索存放在esp分区中根目录下的ntldr,也出现同样的问题,才想起为安装win7_x32,已把winxp克隆到了另一gpt分区了,而未进行注册表盘符清理,所以出现了这样的问题。
我作了注册表盘符清理后,用ntboot nt5=(hdx,y)方式,成功启动了安装在gpt分区中的winxp系统了。

再次表示感谢!
作者: wanghh    时间: 2014-8-17 09:02
用了这个不能激活了...
作者: wanghh    时间: 2014-8-17 09:02
原来是这样的
!BAT
debug off
checkrange 20111212:-1 read 0x8278 || call :error Not supported grub4dos version!
set NTBOOT=%~f0
setlocal
set ISO_TYPE=
set ISO_INST=
set NTPATH=
echo
echo NTBOOT by chenall 2013-07-22,$[0101]http://chenall.net
goto %~1 || goto :NTBOOT_HELP

:FIRADISK.E820
:WINVBLK.E820
:VBOOT.E820
:PE1.E820
if "%~1"=="" && exit
call Fn.15 "%~1" "0" && set /a e820=%~1 && call if /i "%e820^%"=="0" && exit
checkrange 0:-1 calc %e820% || exit
map --e820cycles=%~1 && map --rehook
exit

:e820
shift 1
set e820=%~1
if not exist e820 && goto :NTBOOT_HELP
call Fn.15 "%~1" "0" && set /a e820=%~1 && call if /i "%e820^%"=="0" && goto :NTBOOT_HELP
checkrange 0:-1 calc %e820% || goto :NTBOOT_HELP
map --e820cycles=%e820% && map --rehook && shift 1
set e820= && goto %~1 || goto :NTBOOT_HELP

:menu
echo %~f0 > (md)0x20000+1
cat %NTBOOT%.MOD/setf0 > (md)0x20002+1 || echo -n
configfile %NTBOOT%.LST/MENU.LST
exit

::检测下一个文件。在使用call :CHECK_FILE %FILE1% %FILE2% 之类的情况下会用到
:CHECK_NEXT_FILE
set tmp=%~2
if not exist tmp && goto :input_file
shift
if "%~0"=="%~1" && goto :CHECK_NEXT_FILE
::检查/查找文件
:CHECK_FILE
echo -e Checking file $[0107]%~1 ...
set file=%~1
set tmp=%~pnx1
cat --length=0 %~f1 > nul && root %~d1 > nul ! cat --length=0 %~pnx1 > nul && echo -n ! find --set-root cat --length=0 %~pnx1 > nul || goto :CHECK_NEXT_FILE
goto :eof

:input_file
::获取用户输入的文件,
echo
echo File not found or not support: $[0105]%file%
echo
echo -e Please enter a new path to the file: $[0104]%~x1
set file=
set /p:5 file=NTBOOT>
if not exist file goto :exit
echo -n > (md)0x28150+28
echo %file% > (md)0x28150+28
cat (md)0x28150+28 | set tmp=
if not exist tmp && goto :input_file
set tmp=%~x1
set tmp=%tmp:~0,3%
call Fn.11 "%file%" "%tmp%" || goto :input_file
echo
command %NTBOOT%.CMD/EMPPATH file="%file%"
call :CHECK_FILE %file%
exit

:NT5
:NT6
:PE1
::检测需要的模块
insmod %NTBOOT%.MOD/NTBOOT.MOD || call :error Missing module NTBOOT.MOD...
::映射NTBOOT启动镜像
set /u file=NTBOOT.%~1
map --mem %NTBOOT%.MOD/%file% (rd) || call :error Missing module %file%...

:NTBOOT_START
::设置默认WINDOWS路径
if not exist WinDir set WinDir=WINDOWS
set boot_cfg=
shift
set file=%~1
set tmp=/%WinDir%
::如果没有加参数或参数是一个磁盘分区
if not exist file && goto %~0.HDD
if "%~d1"=="%~1" && goto %~0.HDD
::以上是NT5或NT6硬盘启动
if /i "%~0"=="pe1" && set PDIR=WXPE && goto :PE1_BOOT
command %NTBOOT%.CMD/EMPPATH file="%file%"
call :CHECK_FILE %file%
::转到对应的启动类别,比如NT5.IMG_BOOT,NT6.WIM_BOOT,NT6.VHD_BOOT
goto %~0%~x1_BOOT

:NT5.HDD
echo -e Searching NT5.X on Hard Disk(/%WinDir%)
if exist file && root %~1 ! find --set-root --devices=h /%WinDir%/system32/ntoskrnl.exe cat --locate=\0\x35\0\x2E /%WinDir%/system32/version.dll
goto :NT5_BOOT
:NT6.HDD
echo -e Searching NT6.X on Hard Disk(/%WinDir%)
if exist file && root %~1 ! find --set-root --devices=h /%WinDir%/system32/winload.exe
goto :NT6_BOOT

:ISO_INST64
set ISO_TYPE=amd64
:ISO_INST
shift 1
::以下命令用于生成一个空白的软盘(fd0)
::echo > (md)0x200+2
::write --offset=0xb (md)0x200+3 \x00\x02\x01\x01\x00\x01\x70\x00\x10\x00\xfd\x01\x00\x08\x00\x01
::write 0x401FE 0xAA55
::write 0x40200 0xfffffe
::map --mem (md)0x200+2 (fd0)
map --status=0 || map --mem %NTBOOT%.IMG/EMPTY.IMG (0) && map --rehook
::转换到大写
set /u boot=%~1.IMG
set boot=%NTBOOT%.IMG/%boot%
::自动加载对应驱动的软盘镜像到(fd1)
map --mem %boot% (fd1) || call :Error Missing Module %boot%...
::如果用户指定了floppy的话将会由用户指定的镜像代替
set boot=cdrom
set ISO_INST=%~1
goto :%~1

::::AUTO_CONFIG::自动参数配置接口::::::::::::::::::::::::::::::::::::::::::::::::
::可以自动配置FIRADISK或VBOOT的启动参数,扩展后也可以设置其它参数。
::调用方法: call :AUTO_CONFIG VBOOT|FIRADISK [options...]
::其中options根据配置类型的不同而不同,但有一个参数是相同的boot
::注:除了boot和opt参数外其它的参数都应该是 type=FILE,例如cdrom=/cd/xp.iso或harddisk=(hd0,0)/test.img之类的
:AUTO_CONFIG
set ISO_INST=%~1
:AUTO_CONFIG_LOOP
shift
shift
::
::两个shift之后.%~0就是之前的%~2,%~1就是之前的%~3
::例子: call :AUTO_CONFIG VBOOT harddisk=/test/test.vhd
::没有shift之前%~0是:AUTO_CONFIG,两次shift就去掉了前面的两个参数,变成了harddisk.
::
if "%~1"=="" && exit
::如果参数是boot,则设置boot参数。
if /i "%~0"=="boot" && set boot=%~1 && goto :AUTO_CONFIG_LOOP
::如果参数是opt/addons,不调用文件查找检测功能
set file=%~1
if /i "%~0"=="opt" || if /i "%~0"=="addons" || if /i "%~0"=="e820" || call :AUTO_CONFIG_FILE
if /i "%~x1"==".iso" && call Fn.11 "%~n1" "64" && set ISO_TYPE=amd64 && echo -e %ISO_INST%: ISO_TYPE = amd64
::根据不同参数调用不同的函数,像FIRADISK.HARDDISK
echo -e %ISO_INST%: %~0=%file%
call :%ISO_INST%.%~0 %file%
::下一个参数
goto :AUTO_CONFIG_LOOP
:AUTO_CONFIG_FILE
command %NTBOOT%.CMD/EMPPATH file="%file%"
call :CHECK_FILE %file%
goto :eof

:WINVBLK
call :AUTO_CONFIG %*
goto :WINVBLK_BOOT

:WINVBLK.CDROM
map %~1 (0xCD) || map --mem %~1 (0xCD)
exit
:WINVBLK.FLOPPY
map --mem %~1 (fd0)
exit
:WINVBLK.HARDDISK
map %~1 (hd0) || map --heads=255 --sectors-per-track=63 %~1 (hd0)
map (hd0) (hd)
map --harddrives=1
exit

:FIRADISK.@HARDDISK
:WINVBLK.@HARDDISK
map --mem --heads=0 --sectors-per-track=0 %~1 (hd0)
map (hd0) (hd)
map --harddrives=1
exit
:FIRADISK.@CDROM
:WINVBLK.@CDROM
map --mem %~1 (0xCD)
exit

:FIRADISK.#HARDDISK
:WINVBLK.#HARDDISK
map --mem --top --heads=0 --sectors-per-track=0 %~1 (hd0)
map (hd0) (hd)
map --harddrives=1
exit
:FIRADISK.#CDROM
:WINVBLK.#CDROM
map --mem --top %~1 (0xCD)
exit


:FIRADISK
::使用内存地址0x40000开始处的10个扇区存放FIRADISK参数。
::echo -n > (md)0x210+1
set fira.opt=
call :AUTO_CONFIG %*
::如果内存地址0x40020的数值非0,则说明有写入了参数.
::read 0x40020 && map --mem (md)0x200+16 (99)
::echo -e \" >> (md)0x210+1
map --hook
if not exist fira.opt && goto :FIRADISK_BOOT
cat --locate=###### --number=1 (fd1)/%ISO_TYPE%/TXTSETUP.OEM > nul || call :error firadisk.img file error..
set offset=%?%
write --offset=%offset% (fd1)/%ISO_TYPE%/TXTSETUP.OEM value=Parameters,StartOptions,REG_SZ,"%fira.opt%"\r\n
cat --skip=%offset% --locate=/ --replace=\\ (fd1)/%ISO_TYPE%/TXTSETUP.OEM
goto :FIRADISK_BOOT

:FIRADISK_BOOT
:WINVBLK_BOOT
map --rehook
::保证(fd1)的位置靠后.详情:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=203313
call :SwapFloppy || echo -n
if exist BOOT && %BOOT%
if /i "%boot%"=="cdrom" && chainloader (0xCD) && boot
if /i "%boot%"=="harddisk" && chainloader (hd0)+1 && boot
if /i "%boot%"=="floppy" && chainloader (fd0)+1 && boot
exit

::软盘重排
:SwapFloppy
map --status=0 || map --status=1 || exit
setlocal
::A盘FIRADISK/WINVBLOCK,无B盘。
map --status=1 |; cat --length=0 (0)/txtsetup.oem || exit ! cat --length=0 (0)/firadisk.inf && exit ! cat --length=0 (0)/winvblk.inf && exit
::A盘空,B盘SRS。
map --status=1 |; map (0)+1 (1) && map --mem %NTBOOT%.IMG/EMPTY.IMG (0) && map --rehook ! exit
::A盘SRS,无B盘。
map --status=0 |; cat --length=0 (1)/txtsetup.oem && map (1)+1 (0) && map --unmap=1 && map --rehook && exit ! exit
::A盘SRS,B盘FIRADISK/WINVBLOCK。
map --status=1 || exit
ls (1)/ > nul || map --unmap=1 && map --rehook && exit
cat --length=0 (1)/firadisk.inf |; cat --length=0 (0)/firadisk.inf && map (0) (1) && map (1) (0) && map --rehook ! echo -n
cat --length=0 (1)/winvblk.inf |; cat --length=0 (0)/winvblk.inf && map (0) (1) && map (1) (0) && map --rehook ! echo -n
::B盘firadisk安装系统,A盘仿真内存的起始地址一定要高出B盘,否则会提示插入A盘
::B盘winvblok安装系统,A盘仿真内存的起始地址一定要低于B盘,否则会提示插入A盘
::http://bbs.wuyou.net/forum.php?m ... p;extra=&page=1
map --status=1 || exit
set /a addr1=%?% > nul
map --status=0 || exit
set /a addr0=%?% > nul
if %addr0%>=%addr1% && set fdn=0 ! set fdn=1
if %fdn%==0 && cat --length=0 (1)/firadisk.inf && exit ! if %fdn%==1 && cat --length=0 (1)/winvblk.inf && exit
map (%fdn%)+1 (rd) && map --mem (rd)+1 (%fdn%) && map --rehook ! echo -n
endlocal
exit

::FIRADISK 参数自动设置,可设置CDROM,FLOPPY,HARDDISK等参数
:FIRADISK.CDROM
::优先使用直接映射,失败再尝试内存映射。
set fira.opt=cdrom,vmem=find:%~pnx1;%fira.opt%
map %~1 (0xCD) || map --mem %~1 (0xCD)
exit
:FIRADISK.FLOPPY
map --mem %~1 (fd0)
exit
:FIRADISK.HARDDISK
map %~1 (hd0) || map --heads=255 --sectors-per-track=63 %~1 (hd0)
map (hd0) (hd)
set fira.opt=disk,vmem=find:%~pnx1;%fira.opt%
exit
:FIRADISK.OPT
set fira.opt=%~1;%fira.opt%
exit
::以上是FIRADISK 参数自动设置

:VBOOT
if not exist (0xfd)/vbootldr && map --mem %NTBOOT%.MOD/VBOOT.ISO (0xfd) || call :Error Missing Module VBOOT...
map --hook && echo VBOOT module loaded successfully.
echo -n vboot  > (0xfd)/vboot/grub/grub.cfg
if exist ISO_INST goto :VBOOT_INST
shift
::::::::::非ISO_INST是默认启动磁盘为harddisk::::::::::::::::::::
::::::::::调用AUTO_CONFIG来配置VBOOT的启动参数:::::::::::::::::
set boot=harddisk
call :AUTO_CONFIG vboot harddisk=%*
goto :VBOOT_BOOT
::使用VBOOT来安装系统,先映射VBOOT.IMG
:VBOOT_INST
call :AUTO_CONFIG %*
goto :VBOOT_BOOT

::::以下内容为VBOOT的启动参数自动配置:::::::不了解请不要改变,否则会启动失败::::::::
:VBOOT.CDROM
:VBOOT.HARDDISK
:VBOOT.FLOPPY
::VBOOT.TAKE_SNAPSHOT //
uuid ()
::VBOOT比较笨,必须小写。。
set /l UUID=%?%
set /l tmp=%~x0
echo -e -n %tmp:~1%=(UUID=%UUID%)"%~pnx1"  >> (0xfd)/vboot/grub/grub.cfg
exit
:VBOOT.OPT
echo -e -n %~1  >> (0xfd)/vboot/grub/grub.cfg
exit
::::以上内容为VBOOT的启动参数自动配置:::::::

:VBOOT_BOOT
echo -e boot=%boot%\nboot >> (0xfd)/vboot/grub/grub.cfg
if exist BOOT && %BOOT%
::map --unmap=11
::map --rehook
::call :SwapFloppy
kernel (0xfd)/vbootldr
boot
exit 90

:NT6.VHDX_BOOT
:NT6.VHD_BOOT
::固定用法,本软盘对应的BCD文件专用.下同
set boot_cfg=:BCD_CFG_VHD#WIM b VHD
goto :NT6_BOOT

:NT6.WIM_BOOT
set boot_cfg=:BCD_CFG_VHD#WIM a WIM
goto :NT6_BOOT

:NT5.IMG_BOOT
set boot_cfg=:NT5_RAM_CFG
goto :NT5_BOOT

::GET_ARC_PATH,把一个路径转换为ARC格式表示
:GET_ARC_PATH
checkrange 0:1 read 0x82a0 && goto :FD_ARC
::checkrange 0x9E:0xFF read 0x82a0 && goto :CD_ARC
:HD_ARC
DISKID ret=0x60000 || goto :CD_ARC
set /a R=*0x60000>>24&0xFF
set /a P=*0x60000>>16&0xFF
echo multi(0)disk(0)rdisk(%R%)partition(%P%)%tmp% > (md)0x3000+4
:SET_ARC_PATH
::替换GRUB4DOS路径的/为WINDOWS路径\
cat --locate=/ --replace=\\ (md)0x3000+4
::设置变量ARC_PATH
cat (md)0x3000+4 | set ARC_PATH=
goto :eof

:FD_ARC
set /a R=*0x82A0&0xFF
echo multi(0)disk(0)fdisk(%R%)%tmp% > (md)0x3000+4
::如果是(fdx,y)的形式,映射成(fdx)
checkrange 0xFFFFFF00 read 0x829b || map +1 ()
goto :SET_ARC_PATH

:CD_ARC
set /a R=*0x82A0&0xFF
echo multi(0)disk(0)cdrom(%R%)%tmp% > (md)0x3000+4
goto :SET_ARC_PATH

:NATIVE_CFG
echo cd ?:%~pnx1 > (rd)/NATIVE.CFG
cat --locate=/ --replace=\\ --length=256 (rd)/NATIVE.CFG
exit

:PE1_BOOT
######以下三行是提供给NATIVE核心的PE使用的######################
echo -e @echo off\r\ncd ?:%~p1\r\ncd ?:%~pnx1 > (rd)/NATIVE.CFG
################################################################
cat --locate=/ --replace=\\ --length=256 (rd)/NATIVE.CFG
if /i "%file%"=="%~x1" && set file=/boot/imgs/boot%~1
:PE1.OPTIONS
if /i "%~2"=="PDIR" && set PDIR=%~3
if /i "%~2"=="OPTIONS" && set option=%~3
if /i "%~2"=="NTPATH" && set NTPATH=%~3
if /i "%~2"=="Addons" && call :Addons %~3 pe
if /i "%~2"=="e820" && call :PE1.E820 %~3
shift 2
shift 2
if not "%~2"=="" goto :PE1.OPTIONS
command %NTBOOT%.CMD/EMPPATH file="%file%"
call :CHECK_FILE %file% %file:~0,-1%_
if not exist NTPATH && set NTPATH=%tmp%
call :NATIVE_CFG %NTPATH%
::如果是ISO格式就添加一个参数/rdexportascd
if /i "%tmp:~-3,2%"=="is" && set option=/rdexportascd %option%
if /i "%tmp:~-3%"=="wim" && set option=%option% /rdimageoffset=8192 /rdimagelength=3161088
call :GET_ARC_PATH
echo -e [SetupData]\r\nBootDevice="ramdisk(0)" > (rd)/BOOT.INI
echo BootPath=\%PDIR%\SYSTEM32\  >> (rd)/BOOT.INI
echo OsLoadOptions="/minint /fastdetect %option% /rdpath=%ARC_PATH%" >> (rd)/BOOT.INI
::消除多余的空字符,否则会启动失败
cat --locate=\0 --replace=; (rd)/BOOT.INI
::修改默认路径
if /i not %PDIR%=="I386" && write --offset=0x2A4FB (rd)/SETUPLDR.BIN %PDIR%
::修改默认WINNT.SIF文件名
write --offset=0x2a432 (rd)/SETUPLDR.BIN BOOT.INI\0
if /i "%DEBUG%"=="on" && cat (rd)/BOOT.INI && checkrange 0x11b pause --test-key && goto :exit
if exist BOOT && %BOOT%
map --mem (rd)+1 (0xfd)
::map --unmap=11
map --rehook
call :SwapFloppy || echo -n
chainloader (0xfd)/SETUPLDR.BIN
boot
exit

:BCD_CFG_VHD#WIM
::本软盘BCD对应的特定语句,修改默认启动项
write --offset=0x343C (rd)/BOOT/BCD %~1
write --offset=0x35DC (rd)/BOOT/BCD %~1
::未公开功能。把变量的值ASCII字符串使用UNICODE编码放到内存0x40000位置。编码方式\xH1\0\XH2\0.....
WENV get tmp=0x40000
::替换路径字符中的/为\
cat --locate=\\x2F --replace=\\x5C (md)0x200+3
::本软盘BCD对应的特定语句,修改文件路径
cat --locate=\\%~2_ --number=2 (rd)/BOOT/BCD | call :BCD_CFG_PATH=
exit

:BCD_CFG_PATH
WENV call write --offset=0x%~1 (rd)/BOOT/BCD *0x40000$
WENV call write --offset=0x%~2 (rd)/BOOT/BCD *0x40000$
exit

:NT5_RAM_CFG
set default=ramdisk(0)/%WinDir%
echo %default%="ramdisk" #fastdetect #noguiboot %opt% #rdpath=%ARC_PATH% >> (rd)/BOOT.INI
exit

:NT5_HDD_CFG
set default=%ARC_PATH%
echo %default%="NT5" #fastdetect %opt% #NoExecute=AlwaysOff #PAE  >> (rd)/BOOT.INI
exit

:NT5_BOOT
set /a cur_drv=*0x82A0&0x7F
set /a cur_pri=*0x829C>>16&0xFFFF
clear
echo
echo -e $[0105]  Will Boot NT5.X From $[0102](hd%cur_drv%,%cur_pri%)$[0106]%tmp%
echo
echo -e $[0101]  Press $[1103]Esc$[0101] to quit!
checkrange 0x11b pause --wait=3 --test-key && goto :exit
call :GET_ARC_PATH
shift 1
set opt=%*
echo [operating systems] > (rd)/BOOT.INI
if exist boot_cfg && call %boot_cfg% ! call :NT5_HDD_CFG
echo [boot loader] >> (rd)/BOOT.INI
echo timeout=0 >> (rd)/BOOT.INI
echo default=%default% >> (rd)/BOOT.INI
::替换GRUB4DOS格式路径的\为/
cat --locate=/ --replace=\\ (rd)/BOOT.INI
::替换参数,前面写入的参数中的/都是使用#代替的。
cat --locate=# --replace=/ (rd)/BOOT.INI
::消除空字符(替换为;)
cat --locate=\0 --replace=; (rd)/BOOT.INI
if /i "%DEBUG%"=="on" && cat (rd)/BOOT.INI && checkrange 0x11b pause --test-key && goto :exit
if exist BOOT && %BOOT%
map --mem (rd)+1 (0xfd)
::map --unmap=11
map --rehook
chainloader (0xfd)/NTLDR
boot
exit

:NT6_NO_CONFIG
set /a offset=0x%~1+0x14
write --offset=%offset% (rd)/BOOT/BCD \0
exit

:BOOTMGR
set TMP_ROOT=%@root%
cat --length=0 %~1 > nul && root %~d1 > nul ! cat --length=0 %~pnx1 > nul && echo -n ! find --set-root cat --length=0 %~pnx1 > nul || exit
FAT del (rd)/BOOTMGR > nul || echo -n
FAT copy /o %@root%%%~pnx1 (rd)/BOOTMGR > nul || echo -n
root %TMP_ROOT% > nul
set TMP_ROOT=
exit

:NT6_BOOT
::附加参数
if /i "%~2"=="NODETECTHAL" && cat --locate=26000010 (rd)/BOOT/BCD | call :NT6_NO_CONFIG= && shift 2 && goto :NT6_BOOT
if /i "%~2"=="BOOTMGR" && call :BOOTMGR %~f3 && shift 2 && shift 2 && goto :NT6_BOOT
::shift 2
::if not "%~2"=="" goto :PE1.OPTIONS
::获取当前磁盘号
set /a cur_drv=*0x82A0&0x7F
set /a cur_pri=*0x829C>>16&0xFFFF
clear
echo
echo -e $[0105]  Will Boot NT6.X From $[0102](hd%cur_drv%,%cur_pri%)$[0106]%tmp%
echo
echo -e $[0101]  Press $[1103]Esc$[0101] to quit!
checkrange 0x11b pause --wait=3 --test-key && goto :exit
if exist boot_cfg && call %boot_cfg%

::获取MBR签名
dd if=(hd%cur_drv%)+1 of=(md) bs=1 count=4 skip=0x1b8 seek=0x60000
::获取当前分区偏移
cat --length=0 ()-1
dd if=(md) of=(md) bs=1 count=8 skip=0x8290 seek=0x60004
::修改MBR签名
cat --locate=\x53\xB7\x53\xB7 --replace=*0x60000 --hex=4 (rd)/BOOT/BCD
cat --locate=\0\x7E\0\0 --replace=*0x60004 --hex=8 (rd)/BOOT/BCD
if /i not "%WinDir%"=="windows" && call :CHG_NT6_WINDIR
if /i "%DEBUG%"=="on" && call :NT6_DEBUG
if exist BOOT && %BOOT%
map --mem (rd) (fd0)
::map --unmap=11
map --rehook
if exist ()/boot/slic.bin || find --set-root /boot/slic.bin || echo -n
if exist ()/boot/slic.bin && SLIC ()/boot/slic.bin
root (0)
chainloader (fd0)/BOOTMGR
boot
exit

:NT6_DEBUG
find --set-root --devices=h /ntboot_bcd || call :error DEBUG: Missing file /ntboot_bcd.
dd if=(rd)/BOOT/BCD of=()/ntboot_bcd
exit

:CHG_NT6_WINDIR
::以下都是测试,替换BCD里面WINDOWS目录,我自己也没有用过不知能否正常使用。
WENV get WinDir=0x60000
WENV call write --offset=0x3F76 (rd)/BOOT/BCD *0x60000$
set tmp=%WinDir%\system32\winload.exe
WENV get tmp=0x60000
WENV call write --offset=0x39A6 (rd)/BOOT/BCD *0x60000$
exit

:error
pause Error: %*
:exit
root %NTBOOT%
root ()
exit 1

:FIRADISK.Addons
:WINVBLK.Addons
:VBOOT.Addons
:Addons
setlocal
set addons=%*
call Fn.11 "(/" "%addons:~0,1%" || set addons=%NTBOOT%.MOD/%addons%
%addons% || echo -n
endlocal
exit

:NTBOOT_HELP
echo
echo Usage:
echo $[0102]        NTBOOT $[0107]NT5$[0105]|$[0107]NT6$[0105][=$[0107]root$[0105]|$[0107]file$[0105]]
echo
echo $[0102]        NTBOOT $[0105]PE1=file [PDIR=pdir] [OPTIONS=options] [ADDONS=cmd]
echo
echo $[0102]        NTBOOT $[0105]VBOOT=file [options...]
echo
echo $[0102]        NTBOOT $[0105]E820=N [options...]
echo
echo $[0102]        NTBOOT $[0107]ISO_INST$[0105]|$[0107]ISO_INST64$[0105]=[$[0107]firadisk$[0105]|$[0107]vboot$[0105]|$[0107]winvblk$[0105]] $[0106][options...]
echo $[0106]        options: [[@]CDROM=iso_file] [FLOPPY=srs_img] [[@]HARDDISK=hdd_img]
echo $[0106]                        [BOOT=cdrom|floppy|harddisk] [ADDONS=cmd] [...]
echo $[0106]                 "@" will map image to RAM(used for firadisk/winvblk only).
echo $[0106]                 "#" will map image to top of RAM(firadisk/winvblk only).
echo
pause > nul
exit 2
作者: qj_tzy    时间: 2014-8-17 09:36
wanghh 发表于 2014-8-17 09:02
原来是这样的
!BAT
debug off

您公布的这个是chenall在 2013-07-22发布的ntboot的源代码吗,还请作个说明,谢谢!
作者: minmax    时间: 2014-8-21 15:16
麻煩CHENALL把這段 整合回2014.08.12的版本
我測試 G4D MBR 的VHD 反而開不起來

作者: qj_tzy    时间: 2014-8-24 13:24
本帖最后由 qj_tzy 于 2014-8-24 13:36 编辑
chenall 发表于 2014-8-15 15:18
再来一个,还不行的话,只能等我抽空搭建坏境测试了.

我只有测试了在QEMU中测试启动GPT分区中的WIM文件成 ...


反馈一个BUG:

您在9楼发布的ntboot,用ntboot nt6=(hdx,y)/win8.1.vhd启动正常,而用ntboot nt6=(hdx,y)/win8.1.vhdx(存放在非gpt分区)不能启动,即似不支持vhdx的启动。若将ntboot改回527104427 发布的2014-8-12版,用ntboot nt6=(hdx,y)/win8.1.vhdx(存放在非gpt分区)启动正常。但后者不支持启动gpt分区的系统及其vhd系统。若如此,希望能修正。谢谢!
作者: chenall    时间: 2014-8-24 16:21
qj_tzy 发表于 2014-8-24 13:24
反馈一个BUG:

您在9楼发布的ntboot,用ntboot nt6=(hdx,y)/win8.1.vhd启动正常,而用ntboot nt6=(hd ...

不能启动具体是有什么错误?
作者: 2011902    时间: 2014-8-24 18:06
本帖最后由 2011902 于 2014-8-24 18:24 编辑

根本就不是问题,C神的NTBOOT只支持到VHD,五大接手更新NTBOOT才支持VHDX。
前两天C神应楼主的要求让NTBOOT支持GPT,五大没有跟进更新。你滴明白。



1.基于2013.07.22版修改,已将BOOTMGR替换为WIN8专业版

2.更新FIRADISK.IMG,装完系统第一次进桌面可调整盘符2013-06-23

3.解除只搜索硬盘的限制

4.增加启动VHDX

5.更新grub到2013.07.24

........................................................
.....................................................
.......................................................
作者: 2011902    时间: 2014-8-24 18:41
C神,仿真启动ISO到了WIN7PE,WIN8PE,进到PE里看不见仿真光驱了,外置的东西加载不了。XPPE,03PE一点问题都没有。坛里的PE我都试了很多,我是用NTBOOT加载ISO的。
作者: qj_tzy    时间: 2014-8-24 19:02
chenall 发表于 2014-8-24 16:21
不能启动具体是有什么错误?

20#的出错提示是:

NTBOOT by Chenall 2014-08-15,http://chenall.net/
checking File (hd1,1)/vhdos/win8.1.vhdx

作者: qj_tzy    时间: 2014-8-24 19:03
2011902 发表于 2014-8-24 18:06
根本就不是问题,C神的NTBOOT只支持到VHD,五大接手更新NTBOOT才支持VHDX。
前两天C神应楼主的要求让NTBOOT ...

谢谢指点,这个我不清楚!
作者: chenall    时间: 2014-8-24 20:13
qj_tzy 发表于 2014-8-24 19:02
20#的出错提示是:

NTBOOT by Chenall 2014-08-15,http://chenall.net/

我明天再抽空看一下。
作者: chenall    时间: 2014-8-24 22:59
chenall 发表于 2014-8-24 20:13
我明天再抽空看一下。

试一下这个.

修改内容.支持vhdx

新增参数NTLDR,可以指定启动文件(注这个NTLDR参数位置必须在NT5/NT6/PE1随后)
例子:如下例子,使用(hd0,0)上的NTLDR文件启动系统,
ntboot nt5=(hd0,0) NTLDR=(hd0,0)/NTLDR

用指定的bootmgr启动VHD系统.

ntboot nt6=/test.vhd NTLDR=(hd0,4)/boot/bootmgr

NTLDR参数同样支持自动定位查找

ntboot nt6=/test.vhd NTLDR=/test/bootmgr

NTBOOT.rar

1.59 MB, 下载次数: 298, 下载积分: 无忧币 -2


作者: 天使的魔翼    时间: 2014-8-28 18:03
chenall 发表于 2014-8-24 22:59
试一下这个.

修改内容.支持vhdx

报告测试结果:
     用了C大最新的NTBOOT后,电脑的固体硬盘未拆除,结果固体硬盘送修了。

再次说明一下环境,电脑里三块硬盘:两块固体,一块机械
固体:三星SSD 840 EVO mSATA(250GB)  三星SSD 840 PRO Series SATA III(256GB)
机械:希捷Desktop 1TB 7200转 8GB混合硬盘
VHD文件放在固体硬盘上,结果来回测试几次后,mSATA硬盘容量报零,送修了。
作者: qj_tzy    时间: 2014-8-29 07:57
chenall 发表于 2014-8-24 22:59
试一下这个.

修改内容.支持vhdx

不好意思,好几天没注意,您已经在此贴对ntboot进行了新修改,我下载进行了测试,已完全支持vhdx系统,同时支持gpt分区系统的启动,非常感谢! 只不过启动win7时的“正在启动windows"的提示更改为英文了。
作者: chenall    时间: 2014-8-29 08:23
天使的魔翼 发表于 2014-8-28 18:03
报告测试结果:
     用了C大最新的NTBOOT后,电脑的固体硬盘未拆除,结果固体硬盘送修了。

因为没有更详细的信息,无法确认是NTBOOT的问题,

另外NTBOOT也没有写硬盘的操作,理论上不存在破坏的问题.
作者: qj_tzy    时间: 2014-8-30 23:59
本帖最后由 qj_tzy 于 2014-8-31 09:15 编辑
chenall 发表于 2014-8-24 22:59
试一下这个.

修改内容.支持vhdx


反馈一下,不知这是否是该版ntboot的bug:

用map交换硬盘后,用chainloader +1能启动mbr分区格式第二硬盘上的系统,
但用ntboot(因必须用它)却不能启动gpt分区格式第二硬盘上的系统。

具体情况如下,在bios中选择mbr分区硬盘为启动盘,gpt分区硬盘为第二硬盘,启动gpt分区硬盘上的(hd1,x)分区的nt6系统:
map (hd1) (hd0)
map (hd0) (hd1)
map --hook
find --set-root --devices=h /boot/ntboot/ntboot
/boot/ntboot/ntboot nt6=(hd0,x)
boot



作者: qj_tzy    时间: 2014-8-31 21:52
本帖最后由 qj_tzy 于 2014-9-1 08:09 编辑
chenall 发表于 2014-8-24 22:59
试一下这个.

修改内容.支持vhdx


紧急求救:

用您在27楼发布的ntboot启动win7_x32/win8_x64及其存放在gpt分区中的vhd/vhdx系统,原来一切正常。今晚不知是何原因,未重装系统,用bootice查看gpt分区一切正常,但启动gpt分区中的win7_x32/win8_x64及其存放在gpt分区中的vhd/vhdx系统这四者中的任一者,均不能启动,均出现0xc000000e的错误提示,具体见下,在网上搜索未找到解决办法,诚请chenall等大师指点,该如何解决,谢谢!

1.启动gpt分区的win7_x32/win8_x64系统,错误提示为0xc000000e,A required device isn't connected or can't be accessed.
2.启动存放在gpt分区的原生vhd系统,错误提示为0xc000000e,There is an invalid object in the boot configuration data store.


作者: chenall    时间: 2014-9-1 08:39
qj_tzy 发表于 2014-8-31 21:52
紧急求救:

用您在27楼发布的ntboot启动win7_x32/win8_x64及其存放在gpt分区中的vhd/vhdx系统,原来 ...

不使用NTBOOT能启动不?

还你有启动之前有没有什么写盘的操作?

另外BOOTICE查看GPT分区,BOOTICE是没有管分区校验的,用系统的磁盘管理工具看一下.
作者: qj_tzy    时间: 2014-9-1 10:22
chenall 发表于 2014-9-1 08:39
不使用NTBOOT能启动不?

还你有启动之前有没有什么写盘的操作?

1.启动gpt分区的nt6系统及其vhd系统,必须使用经您修改的ntboot。在您修改ntboot前,用chainloader +1 或使用ntboot nt6=(hdx,y),或ntboot nt6=(hdx,y)/nt6.vhd是不能启动的。经我测试,用chainloader /ntldr 能启动该硬盘gpt分区的nt5.x,用ntboot vboot=(hdx,y))/nt5.vhd能启动存放在gpt分区的nt5.x的VHD系统。

2.我在启动以上系统之前,有写盘操作,就是用unhide (hdx,y)命令显现当前要启动的系统所在分区,用hide (hdx,y)命令隐藏其他windows系统所在的分区。

3.另:今天早上,我在一台gpt分区的单硬盘电脑上,使用您发布的grub4dos 4.6a 2014-8-31启动时,出现“Begin PXE Scan...”的提示,足足等了近10分仲,都没能进入grub4dos菜单界面。用U盘启动换为grub4dos 4.5c 2014-8-22版的grldr后,无此提示,很快就进入了grub4dos菜单界面。现请教,使用grub4dos 4.6a 2014-8-31时,如何关闭PXE Scan。谢谢!

作者: chenall    时间: 2014-9-1 10:58
2.有写盘操作,有可能会导致数据错误,一般情况下不建议每次开机都进行写盘操作,特别是GPT分区,修改一下,就需要重新计算CRC校验,如果这个校验出错的话WINDOWS是识别不了的.

你可以用可以使用的系统进入,用系统的磁盘管理工具查看分区状态(但请不要进行任何操作).

可以用BOOICE显示隐藏一个分区(它应该会重新计算写入校验).

3.我还没有使用过0.4.6a的版本,你可以试试看旧版的0.4.6a版有没有问题.
作者: qj_tzy    时间: 2014-9-1 11:40
chenall 发表于 2014-9-1 10:58
2.有写盘操作,有可能会导致数据错误,一般情况下不建议每次开机都进行写盘操作,特别是GPT分区,修改一下,就需 ...

用U盘启动进入win7_pe的磁盘管理功能,查看一切正常,能读取各GPT分区中的数据。用bootice隐藏/显现操作也正常。
作者: chenall    时间: 2014-9-1 12:09
你GRUB4DOS换成0.4.5C版的试试.
作者: qj_tzy    时间: 2014-9-1 12:31
chenall 发表于 2014-9-1 12:09
你GRUB4DOS换成0.4.5C版的试试.

谢谢!待我晚上回家替换为GRUB4DOS0.4.5C测试后反馈。
作者: qj_tzy    时间: 2014-9-1 22:18
chenall 发表于 2014-9-1 12:09
你GRUB4DOS换成0.4.5C版的试试.

用grub4dos 0.45C-2014-8-22测试,出现与32楼相同的问题,且是同时出现的,又没对GPT分区硬盘重新分过区,不知是何原因。
作者: chenall    时间: 2014-9-1 22:43
你是用9楼的还是31楼的NTBOOT?

如果之前是正常的,更新之后出错,你可以先试试9楼的,如果用9楼的正常,那也许是31#的更新出现了问题.
作者: qj_tzy    时间: 2014-9-1 23:55
chenall 发表于 2014-9-1 22:43
你是用9楼的还是31楼的NTBOOT?

如果之前是正常的,更新之后出错,你可以先试试9楼的,如果用9楼的正常,那也 ...

我猜与两处更新的ntboot及2014-8-22、8-31分别更新grub4dos 0.45c、0.46a均无关系,因是同时出现不能启动的问题,于是我想应该与gpt分区有误有关,我就用DiskGenius检查分区表又无错误,就用DiskGenius“搜索已丢失分区”(分区实际未丢失)功能搜索保存分区后,问题得到解决,所有的安装在gpt分区中的win7/win8及存放在gpt分区中的win7/win8的VHD系统,都能启动了。

但此法有丢失数据的危险性,不知有更简单、更安全的方法没有?
作者: qj_tzy    时间: 2014-9-24 11:58
本帖最后由 qj_tzy 于 2014-9-24 11:59 编辑
chenall 发表于 2014-8-15 15:18
再来一个,还不行的话,只能等我抽空搭建坏境测试了.

我只有测试了在QEMU中测试启动GPT分区中的WIM文件成 ...


我用您发布的最新版ntboot,按ntboot nt6=(hdx,y)可以启动安装在gpt分区的win7/win8,但按相同方法启动安装在gpt分区的winvista_x32/win2008_x32,首次启动时均出现0xc000000f、A required device isn't connected or can't be accessed的出错提示。

若用grub4dos调用boot_winnt6.ima(内含win8的bootmgr、boot目录及BCD等相关文件,可以用之启动安装在gpt分区的win7/win8),启动安装在gpt分区的winvista_x32/win2008_x32,首次启动时均出现0xc000000e、An unexpected error has ccurred 的出错提示。

是否是因winvista_x32/win2008_x32该两个系统不带gpt分区的启动支持驱动造成的,还是其他原因,非常希望能得到您的指点,谢谢!

作者: crzwy    时间: 2016-8-23 21:49
不好意思,那个反对是我点的,不是我要反对,我一不小心点到了,真对不起大神
作者: qj_tzy    时间: 2016-8-24 09:32
crzwy 发表于 2016-8-23 21:49
不好意思,那个反对是我点的,不是我要反对,我一不小心点到了,真对不起大神

自己回复一下
winvista_x32/win2008_x32该两个VHD系统在gpt分区的启动问题已解决,
详见《我安装的bios+gpt、uefi+gpt双启模式多系统及菜单》
http://bbs.wuyou.net/forum.php?m ... &fromuid=349593
及《发布10个通用windows vhd(x)系统及部署方法》
http://bbs.wuyou.net/forum.php?m ... &fromuid=349593

作者: xyyit    时间: 2018-7-22 14:55
本帖最后由 xyyit 于 2018-7-22 14:56 编辑
qj_tzy 发表于 2016-8-24 09:32
自己回复一下
winvista_x32/win2008_x32该两个VHD系统在gpt分区的启动问题已解决,
详见《我安装的bios ...


经过这段时间的折腾,我发现我正在走你过去的道路了!我目前U盘(USB SSD,本地磁盘模式)必须为GPT分区表,U盘是装有Win10、Ubuntu Kylin、Phoenix OS,为什么不用Deepin?Deepin改动了内核,直接从内核引导换电脑使用容易丢失引导信息不能启动。如果不为GPT分区表,当遇到用uefi的电脑不能启动mbr磁盘上的Win10。目前为GPT分区表遇到uefi的电脑通过grub2→G4D→把mbr分区表的vhd载入RAM,vhd内有完整的bootmgr等文件→引导Win10启动。通过上述方法更改BCD还是不能启动gpt磁盘上的vhd系统,下载了你的启动菜单试试看咯。
作者: longyear    时间: 2021-9-13 19:22
新用户,有求于此附件,赚取一下积分
作者: 361269166    时间: 2024-10-10 19:17
学习一下




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3