0PE内置菜单解读(NB版) NB版0PE内置菜单解读

NB版0PE内置菜单解读
http://bbs.wuyou.com/forum.php?mod=viewthread&tid=206070&page=1
#先设置一个显示菜单变量showmenu为1,默认显示菜单
if not exist showmenu set showmenu=1

terminal console
debug off

#0x8278地址处存放版本信息;grub4dos中常使用:-1表示“至无穷大”。此处若版本低于20120201则屏显警告信息并重启
checkrange 20120201:-1 read 0x8278 || clear && pause Need grub4dos-0.4.5c-2012-02-01 or above. && reboot

#无论之前加载何种字体,都先卸载
font

#启动盘为HD存放地址,初始化
write 0x60368 0

#检测0x8280地址中为0x80,则启动设备为硬盘,对0x60368写入1
checkrange 0x80 read 0x8280 && write 0x60368 1

#如启动设备号位1-3为hd0,则启动设备为硬盘,对0x60368写入1
if "%?_BOOT:~1,3%"=="hd0" write 0x60368 1

#如找到UD分区并且0x82b9低8位为0x80,则启动设备为硬盘,对对0x60368写入1
find --devices=u && checkrange 0x80 calc *0x82B9&0xff && write 0x60368 1

#显示提示信息。
#echo -e为转义用法,后面的\n转义为换行符,\t转义为水平制表符
echo -e \n\nPress a key within 3 seconds:
echo -e \n\t<Enter>--Show/Hide Menu\n\t<Esc>--Grub4Dos Commandline\n\t<Space>--Load 0PE.ISO into memory entirely\n

#对按键初始化,先清除keyt变量

set keyt=

#3秒内按下键,则保存0x4cb00地址中的键码至变量keyt中
pause --wait=3 && set /A keyt=*0x4CB00

#若不存在变量keyt,则进入命令行
if not exist keyt commandline
[quote]原帖由 zxw 于 2012-2-15 08:39 发表
不按键 ,赋给keyt的值为 1 .
按ESC键 返回 不改变keyt的值
这里有验证: http://bbs.wuyou.net/viewthread.php?tid=206070&page=3#pid2385309


#关闭调试信息
debug off

#对mapmem变量(用于map后是否加--mem参数)初始化,先清除mapmem变量。

set mapmem=

#若按键为空格,则为选择将0PE.ISO整体map到内存中,设置mapmem为1。/i参数忽略大小写。
if /i "%keyt%"=="0x20" set mapmem=1

#初始化ready变量,先将其清除
set ready=

#可改0PE.ISO的路径、名字,用变量PEISO保存。 默认为/0PE.ISO(在后面设定如/0PE.ISO不存在,则查找/0PE/0PE.ISO。)
if not exist PEISO set PEISO=/0PE.ISO

#可改SRS路径。变量SRS0PE记录SRS路径
if not exist SRS0PE set SRS0PE=/SRS/

#call Fn.0 0 0x8217输出之前最后菜单的盘号路径文件名,加上后面的管道命令,即把最后菜单完整的盘号路径文件名保存到menu0PE变量中
call Fn.0 0 0x8217 | set /u menu0pe=

#如果为grub网启,且之前最后的菜单扩展名不为0PE,则执行pxe detect,但不设置启动文件。
checkrange 0x21 read 0x8280 && if not "%menu0pe:~-4%"==".0PE" pxe detect NotExist

#清除变量menu0PE
set menu0pe=

#启动状态初始化。 0x60064记录网启状态;0x6006c记录;0x60130记录0x828c处的当前根分区号;某状态下该地址设置为1。
write 0x60064 0
write 0x6006C 0
write 0x60130 0

#如为pd启动,对0x60064地址写入1
checkrange 0x21 read 0x8280 && write 0x60064 1

#0x413地址处两字节(16位)存放XX内存大小,如小于524KB,则map --int15nolow=1,并显示低内存警告信息。
checkrange 524:-1 calc *0x413 & 0xffff || map --int15nolow=1 && pause Warnning: less memory

#设置不加速的变量noacc,首先清除之
set noacc=

#如网启,则不加速。否则,如不能在启动设备上找到/BOOT/GRUB/USB_ACC.0PE且虚拟的光盘(224)不存在/BOOT/GRUB/USB_ACC.0PE,也设置不加速。
read 0x60064 && set noacc=1 ! if not exist (bd)/BOOT/GRUB/USB_ACC.0PE if not exist (224)/BOOT/GRUB/USB_ACC.0PE set noacc=1

#设置变量curdev,用以保存当前根驱动器
set curdev=%@root%

#如不存在noacc变量(即需要加速),如果启动设备存在加速器,则从启动设备运行加速器
if not exist noacc if exist (bd)/BOOT/GRUB/USB_ACC.0PE (bd)/BOOT/GRUB/USB_ACC.0PE --time-out-disable:0

#如不存在noacc变量(即需要加速),而光驱(224)存在加速器,则从启动设备运行加速器
if not exist noacc if not exist (bd)/BOOT/GRUB/USB_ACC.0PE (224)/BOOT/GRUB/USB_ACC.0PE --time-out-disable:0

#为防止加速器改变当前设备,重新使当前设备恢复到运行加速器前的状态
rootnoverify %curdev%


#预处理结束,默认直接从#0处菜单执行
default 0
timeout 0

#0
title
echo
echo 0PE by Pseudo

#如网启,跳到#5执行;非网启时均从#4执行
read 0x60064 || goto 4
goto 5

#1
#本菜单项对存在0PE.ISO(或者/0PE/0PE.ISO)的情况处理

title
#接着跳到下面的#3
goto 3

#2
#本菜单项对存在NB内核的情况处理,即能找到/0PE/0PENB.LZMA的情况

title
#先清除不加速状态
set noacc=

#将0x829c地址(当前根分区号,使用4字节双字保存)的8字节保存到0x60130地址处。(注:4字节就够了)
dd if=(md) of=(md) bs=1 count=8 skip=0x829c seek=0x60130
echo

#如网启,执行pxe命令;非网启屏显不换行
read 0x60064 && pxe || echo -n

#屏显
echo Loading /0PE/0PENB.LZMA from %@root%...

#把当前设备下的/0PE/0PENB.LZMA映射为最后硬盘
map --mem ()/0PE/0PENB.LZMA (hd)
map --hook

#将PEISO=“前述完整的盘号路径文件名”写入刚才映射出最后硬盘0分区的/BAT/_ENT.BAT文件中,从第200字节擦写,最后加上回车及结束标志
write --offset=200 (hd-1,0)/BAT/_ENV.BAT set PEISO=%PEISO%\r\n

#查找前述最后硬盘(hd-1,0)/BAT/_ENV.BAT中所有的字符/,将其全部替换为字符\
#此举将/BAT/_ENT.BAT批处理文件中涉及到的grub4dos格式盘号路径文件名,转换为dos/windows可识别处理的格式

cat --locate=/ --replace=\\ (hd-1,0)/BAT/_ENV.BAT

#设置burgcd变量,用以处理ud启动出现(fd0,0)时龟速加载的情况。首先清除此变量
set burgcd=

#若映射出(224)光盘中存在/0PE/0PENB.LZMA文件,则搜索0PE.ISO,找到了就清除burgcd,没找到则维持burgcd=1(即判定为ud的(fd0,0)状态,需要使用burgcd来加速)
if exist (224)/0PE/0PENB.LZMA set burgcd=1 && find --set-root %PEISO% && map %PEISO% (0xff) && map --hook && set burgcd= ! echo -n

#此时若发现存在burgcd,先设置软驱数为1,再将(fd0,0)中的0PE.ISO map为(255),并清除burgcd变量。如不成功,说明没在(fd0,0)找到0PE.ISO,屏显警告。
if exist burgcd map --floppies=1 && map (fd0,0)%PEISO% (0xff) && map --hook && echo %PEISO% is in (fd0,0) && set burgcd= ! if exist burgcd pause --wait=5 %PEISO% not found.

#如果存在0PE.ISO,但没有发现被映射为(255),则设置ready变量为1,并执行#3菜单(无论如何,发现了都要map为(255)才行)
if exist ()%PEISO% if not exist (0xff)+1 set ready=1 && goto 3
goto 7

#3
title
#屏显载入ISO的完整盘号路径文件名

echo Loading %@root%%PEISO%...

#(bd)为(pd),且()驱动器(当前根驱动器)还是(pd),则设置需要--mem参数
read 0x60064 && checkrange 0x21 read 0x82A0 && set mapmem=1

#如果当前根驱动器为(cd),也需要--mem参数。 (注:个人感觉应该直接设置mapmem=--mem,不需要map时设置mapmem= ,这样map %mapmem% %PEISO% (0xff)即可)
if "%@root%"=="(cd)" set mapmem=1

#下面两句,(pd)及(cd)启动要--mem参数,其它情况直接map。
if not exist mapmem echo Direct map %PEISO% && map %PEISO% (0xff) || set mapmem=1 && echo Warnning: Fail to direct map %PEISO%, try to map with --mem.
if exist mapmem echo Map %PEISO% with --mem && map --mem %PEISO% (0xff) || pause Error: Fail to map --mem %PEISO% (0xff). && reboot
map --hook

#ready=1标志着可以去主菜单了,否则回到 #2重来
if not exist ready rootnoverify (0xff) && goto 2
goto 7

#4
title

#先找解开的内核。判断如存在0PE的NB内核,是则去#2
if exist (bd)/0PE/0PENB.LZMA rootnoverify (bd) && goto 2

#找不到(bd)/0PE/0PENB.LZMA无所谓,能有(bd)/0PE.ISO也照样玩活,找到后回 #1
if exist (bd)%PEISO% && rootnoverify (bd) && goto 1

#上面两个都没找到,只好找(bd)/0PE/0PE.ISO,找到了也回#1
if exist (bd)/0PE/0PE.ISO set PEISO=/0PE/0PE.ISO && rootnoverify (bd) && goto 1

#有时候可能启动设备与当前根驱动器不一致,可能当前驱动器上存在这几个玩意,照上面三句执行
if exist /0PE/0PENB.LZMA goto 2
if exist %PEISO% goto 1
if exist /0PE/0PE.ISO set PEISO=/0PE/0PE.ISO && goto 1

#也许会有放到(hd0)/的情况,包括经过各种转换交换映射过来的情况 (这个不清楚什么时候遇到的)
if exist (hd0)/0PE/0PENB.LZMA rootnoverify (hd0) && goto 2

#非网启的,到#5去搜索吧
read 0x60064 || goto 5

#网启很无奈,啥也没找到,到#6去屏显出错信息
goto 6

#5
#/0PE/0PENB.LZMA、/0PE.ISO、/0PE/0PE.ISO全都找不到时,只好搜索了
title
#下面3项在UD设备、hd设备上找
find --devices=uh --set-root /0PE/0PENB.LZMA && goto 2 ! echo -n
find --devices=uh --set-root %PEISO% && goto 1 ! echo -n
find --devices=uh --set-root /0PE/0PE.ISO && set PEISO=/0PE/0PE.ISO && goto 1 ! echo -n

#还是找不到,看看光驱、(pd)、及软驱中有没有这三个文件
#如果有虚拟出的光驱(255),设为根驱动器

if exist (0xff)+1 rootnoverify (0xff)

#在光驱、(pd)、及软驱上搜索这三个文件
find --devices=cfp --set-root /0PE/0PENB.LZMA && goto 2 ! echo -n
find --devices=cfp --set-root %PEISO% && goto 1 ! echo -n
find --devices=cfp --set-root /0PE/0PE.ISO && set PEISO=/0PE/0PE.ISO && goto 1 ! echo -n

#网启的话,回到#4再试试运气
read 0x60064 && goto 4
goto 6

#6
title
#**!三个文件一个也没找到,你都部署到哪里去了?
pause Error:/0PE/0PENB.LZMA, %PEISO% and /0PE/0PE.ISO not found!

#7
title
#清除mapmem及PEISO变量
set mapmem=
set PEISO=

清除ready变量,并转到最后硬盘(hd-1,0)上/BAT/M1.LST主菜单
set ready= && configfile (hd-1,0)/BAT/M1.LST
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值