|
下了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 编辑 ] |
|