无忧启动论坛

标题: 对P大的16MB的0PE菜单的请教 [打印本页]

作者: thomas0769    时间: 2010-10-6 09:19
标题: 对P大的16MB的0PE菜单的请教
下了P大的16M的pe ghost的 0PE,发现功能强大,激起了好奇之心,想了解一下其原理,(下载地址http://u.115.com/file/f44198ef2a
GhostPE(2010-09-16)16MB.7z (ghost32专用PE,兼可输入式PE启动器、通用F6模块。),P大的菜单调用很复杂,无柰刚上手Grub4dos几个月,才学浅疏,在这里把自已理解表示出来,希望各位大大能指正。

下载的ISO内部主目录结构
grldr                (grub4dos引导文件)
SRS
    -FREQUENT       (驱动目录)
    -CHKPCI.TXT
    -CHKPCIDB.GZ
BOOT
    -GRUB               
        -MENU.0PE   (菜单)
    -IMGS
        -PLPBT.BIN  (USB驱动)
    -SYSLINUX
        -SYSLINUX.CFG
0PE
    -GHOSTPE.WIM
    -0PE.GZ         (0PE主文件)
    -XP
       -CMDPE.GZ    (PE)

做成U启后,启动进入主菜单,部份内容如下:
debug off
default 1
timeout 9
checkrange 0x21 read 0x8280 && pxe detect NotExist        ---判断内存0x8280的值是否H21,也就是判断是否PXE启动,是的话就pxe detect 并且不搜索PXE服务器的文件,加快启动速度
cat --length=0 ()/BOOT/MENU.0PE || find --set-root /BOOT/MENU.0PE  ---是否存在/BOOT/MENU.0PE 这个文件,不存在就搜索
rootnoverify ()   ---这里不是很明白什么意思,好象不用也行(!!!请指教!!!)
gfxmenu ()/MESSAGE   ---加载图像菜单

title [0] 尝试加载USB2.0模块-----------Load USB2.0 Module
kernel ()/BOOT/PLPBT.BIN hiddenusb

title [1] Ghost32专用PE-----------------CMDPE for GHOST32
#这行表示绕过0PE第一菜单界面,直接调用其菜单项
write 0x60300 0x60300   ---这里非常不明白,虽然字面上的解释是把0x60300写入内存0x60300地址的内容里,不明的的是为什么0x60300能写,0x90000能不能写?还有多少内存块能写?为什么这里写了0x60300这个值就能直接调用其菜单项?(!!!请指教!!!)
#这行指定调用0PE第14菜单项([E] 进入GHOST32专用CMDPE)
write 0x60100 14  ---这里理解为相当于 内存变量,把14这个值存入内存0x60100中,下个菜单可以读出来
configfile ()/BOOT/MENU.0PE  ---加载另一个菜单文件


MENU.0PE 内容如下
terminal console
debug off
#checkrange 0x21 read 0x8280 && pxe detect NotExist
write 0x60064 0
write 0x6006C 0
write 0x60130 0
checkrange 0x21 read 0x8280 && write 0x60064 1

default 0
timeout 0
#0
title
pause --wait=0 0PE by Pseudo    ---这里pause --wait=0  是不让用户选择菜单,只能执行这个菜单项
read 0x60064 || cat --length=0 /0PE/0PE.GZ && fallback --go 2 ! write 0x60000 0
read 0x60064 || cat --length=0 /0PE/0PE.ISO && fallback --go 1 ! write 0x60000 0
find --set-root /0PE/0PE.GZ && fallback --go 2 ! write 0x60000 0
find --set-root /0PE/0PE.ISO && fallback --go 1 ! write 0x60000 0
read 0x60064 && rootnoverify (pd)
write 0x82A4 1
cat --length=0 /0PE/0PE.GZ && fallback --go 2 ! write 0x60000 0
write 0x82A4 0
cat --length=0 /0PE/0PE.ISO && fallback --go 1 ! write 0x60000 0
pause Error:/0PE/0PE.GZ and /0PE/0PE.ISO not found!

#1
title
pause --wait=0 Device of 0PE.ISO:
debug on
root || pause --wait=0 :(:(:(:(:(:(
debug off
pause --wait=0 Loading /0PE/0PE.ISO...
write 0x60000 0
read 0x60064 && write 0x60000 1
read 0x60000 || checkrange 0x23 read 0x82A0 && write 0x60000 1
read 0x60000 || checkrange 0x12 parttype && write 0x60000 1
read 0x60000 || map /0PE/0PE.ISO (hd32) || write 0x60000 1
read 0x60000 && map --mem /0PE/0PE.ISO (0xff)
map --hook
read 0x60000 && rootnoverify (0xff)
read 0x60000 || rootnoverify (hd32) && pause --wait=0 mapped /0PE/0PE.ISO to (hd32) without --mem.
fallback 2 && kernel

#2
title
write 0x82A4 0
dd if=(md) of=(md) bs=1 count=8 skip=0x829c seek=0x60130
pause --wait=0
read 0x60064 && pxe || pause --wait=0
pause --wait=0 Device of 0PE.GZ:
debug on
root || pause --wait=0 :(:(:(:(:(:(
debug off
checkrange 0xC0 read 0x8280 && write 0x6006C 1
read 0x6006C && cdrom --stop
pause --wait=0 Loading /0PE/0PE.GZ...   ---这里pause --wait=0 相当于DOS下批处理的Echo命令,作用是在屏幕上显示"Loading /0PE/0PE.GZ..."这名话
map --mem ()/0PE/0PE.GZ (hd)
map --hook
read 0x6006C && cdrom --init      ---个人理解 :如果 内存0x6006C的值是1,则初始化CDROM
read 0x6006C && map --hook
write --offset=200 (hd-1,0)/BAT/_ENV.BAT set PEISO=/0PE/0PE.ISO\r\n   ---这里的set是DOS下环境变量还是Grub下的?不是很理解,还有“\r\n”是什么意思?(!!!请指教!!!)
cat --length=0 ()/BOOT/GRUB/GRUB.0PE && (hd-1,0)/BIN/FAT copy ()/BOOT/GRUB/GRUB.0PE (hd-1,0)/GRUBNEW.EXE || pause --wait=0
pause --wait=0 && configfile (hd-1,0)/BAT/M1.LST   ---加载M1.lst菜单文件了

这个菜单大致上理解为 判断用户采用的是ISO加载,还是解开ISO加载0PE,如果是ISO加载则跳转到#1 title ,已解开的话就跳转到#2 title


下面的菜单调用更眼花了,但是又想不到更好的方法。先向各位大请教以上问题

[ 本帖最后由 thomas0769 于 2010-10-6 09:27 编辑 ]
作者: renchmin    时间: 2010-10-6 09:24
楼主的理解的不错的啊,慢慢体会吧。
作者: pseudo    时间: 2010-10-6 11:32
楼主理解正确。

程式菜单最早出现于0PE。它使用复杂、高级的grub4dos的命令,把菜单当做程序来写,实现复杂强大的功能。

程式菜单之所以复杂,很大程度上是因为grub4dos本身缺乏编程的基本机制,不得不挖掘出许多费解的等价方式,拐弯抹角地达到目的。
例如
以前没有echo命令,发现pause --wait=0相当于echo的作用也不容易呢。
以前没有变量,传递、保留信息不容易。
没有分支、循环机制。所以才有fallback 2 && kernel、fallback force等费解的写法。

现在grub4dos及其外部命令改观多了,程式菜单也越来越好读了,使用程式菜单的也逐渐增多。


1.rootnoverify ()  不用也行
2.
write 0x60300 0x60300
write 0x60100 14
是0PE规定的接头暗号,用户只需照抄不需理解。其中14这个数用户可以改变。
处理时,0PE查看内存0x60300处数据,如果正巧是0x60300,不多不少,只能解释为用户执行过write 0x60300 0x60300了。
表明用户不喜欢看到0PE原始菜单,那就不显示0PE第一菜单界面吧。
那么,不显示菜单怎么知道用户究竟想调用哪个菜单项呢?这要看内存0x60100处,此处的数值(例如14)约定用来表示第几菜单项。
注意,该处平时也有某个数值,但只有在0x60300处值为0x60300的前提下该数值才表示第几菜单项。

参数化菜单早在grub4dos外部命令的变量出现之前就有了。详见

程式菜单应用技术举例:参数化菜单功能调用



现在有了变量,传递信息变得更方便更可读。但使用变量得附带外部命令文件,目录结构不够清爽。
3.  
write --offset=200 (hd-1,0)/BAT/_ENV.BAT set PEISO=/0PE/0PE.ISO\r\n
是往_ENV.BAT文件写入设置环境变量的dos命令,动态生成_ENV.BAT文件内容。\r\n是回车换行。
作者: thomas0769    时间: 2010-10-6 11:46
标题: 回复 #3 pseudo 的帖子
谢P大 百忙之中抽空指教, 本人只对MASM,Delphi了解些皮毛,对GRUB,系统启动机制是一白二清,这几天想做个兼容性强大些的U启PE,才临时抱佛脚上论坛。多谢各位大大指教。
作者: hhh333    时间: 2010-10-6 11:50
标题: 回复 #1 thomas0769 的帖子
P大,如果过段时间不看菜单,我想有的地方你自己可能也会看不懂。
我想,对于费解的地方,加上详细的注解,不光是方便别人学习,也是给自己方便。有段时间没弄PE,以前有些心得或技巧没有记下来,等到要重新弄的时候想不起来,觉得特别郁闷
作者: ones    时间: 2010-10-6 12:13
如果对编程没基础的话,理解这个菜单真的很困难,而且随时都会不小心修改错误或漏改某些地方
作者: lsbzhe    时间: 2010-10-6 15:54
希望高手能来帮助一下!!
作者: venus951    时间: 2010-11-22 16:40
fallback 22
kernel

这什么意思?
作者: pseudo    时间: 2010-11-22 17:34
原帖由 venus951 于 2010-11-22 16:40 发表
fallback 22
kernel

这什么意思?

这是早期程式菜单的关键技术之一。
用以达到转入第22个(从0算起)title菜单项处理的目的。

一般编程语言都有个goto跳转命令,早期grub4dos没有。

当时我发现grub4dos的fallback命令具有在后面的语句执行有错时,转到fallback后面的序号数字对应的菜单项的能力。
于是我在fallback语句后面写一个不带参数的kernel命令(不带参数显然是错误的kernel命令用法),人为制造错误,那么fallback就会转到我想要的菜单项了。
除了kernel,历史上还发明过fallback Force、fallback F等写法。
总之,
fallback 22
kernel
两行合起来,相当于goto 22的效果。

另外,为什么用到那么多个不显示的title菜单项呢?
因为一方面早期grub4dos没有if...then分支执行语句批能力。0PE把一个分支要执行的内容写成一个title菜单项,间接达到目的。
另一方面,早期grub4dos没有嵌套的and(&&)、or(||)条件组合能力,只能先分支到一个title菜单项,再在那里往下分支到新的title菜单项。

应该说,当初0PE发明程式菜单用法时,是充分发掘了grub4dos既有的可怜的编程能力,拐弯抹角地实现了强大的、复杂的功能,充满技巧。
但现在,随着grub4dos及其外部命令的飞速发展,现在已经可以用接近DOS批处理的语法来写grub4dos菜单了,0PE以前的菜单慢慢只有历史意义了。

现在这两句的功能可以直接写成一句
fallback --go 22
或借助外部命令写成
GOTO 22
作者: pseudo    时间: 2010-11-22 17:43
普通用户要DIY零PE的菜单,可以参考#1989楼:
http://bbs.wuyou.net/viewthread. ... page=199#pid2091313
用不着程式菜单技术。

大家没事不要折腾程式菜单。
0PE里复杂的程式菜单是为了实现强大功能,以及追求完美理念才弄那么复杂的。

例如,0PE最早实现U盘(USB-CDROM、USB-HDD、USB-ZIP、UD内外)、光盘、硬盘启动,pxe启动的统一,iso解开、不解开部署的统一。至今许多pe还分ud版、非ud版、网启版等等。
统一与否,也许各有利弊,这里不评价优劣,但无疑用一个菜单统一处理多种启动情形,这个菜单自然要复杂些吧。

[ 本帖最后由 pseudo 于 2010-11-23 12:37 编辑 ]
作者: kingsz1    时间: 2010-11-23 06:34
标题: 学习中
这里提到的 "P大的16M的pe ghost的 0PE" 现在可以在哪里下载? 1楼给出的115网盘地址过期了. 我需要一个最小的PE,仅需支持 SATA, 和启动就直接进入 ghost 即可。
作者: sht123960585    时间: 2010-12-19 14:09
这个可以在最新的0PE里面提取出来,在发行说明里有,慢慢研究,学习嘛,亲自动手

http://u.115.com/file/f487ef2cd9#




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