| ` 
 
 
 
 试着解读 0PE 的专用菜单文件 MENU.0PE 
 
 
 这个菜单文件是从 〇peZip扩展版二合一090620.ISO 的 grldr 中提取出来的,根据自己的理解加了一些注释(理解不一定正确),还有很多看不懂的地方,希望 Pseudo 大侠指点迷津,也希望大家多发表自己的看法,让大家更深入的了解 0PE。
 
 看了一下 Grub4Dos 的 Readme 文件,知道了 Grub4Dos 的一些高级用法,把注释补充完整了,如有错误,恳请指正。
 
 关于 Grub4Dos 的高级用法,可以参考这个帖子,里面有很详细的说明:
 http://bbs.znpc.net/viewthread.php?tid=5587&extra=page%3D2&page=1
 
 
 
 
 ------------------------------------------------------------
 
 ; 注:字符串/0PE/0PE.ISO定位0PE.ISO.菜单<4KB
 
 ; 设置屏幕颜色
 color white/blue blue/yellow light-red/blue 10
 
 ; pseudo 大侠发明的写法,指定一个不存在的配置文件“NoExist”
 ; 让 PXE 启动时不去搜索 PXE 服务器上的其他配置文件,加快启动速度。
 pxe detect NotExist
 
 ; 关闭 Debug
 debug off
 
 ; 取内存做变量使用,6000:0000开始的 1K 空间作为用户自己的变量区
 
 ; 存放出错标记 | ErrorFlag
 write 0x60000 0
 
 ; 存放 PXE 启动标记 | PXEBoot
 write 0x60064 0
 
 ; 存放选中的菜单项序号 | MenuNum
 write 0x60068 0
 
 ; 存放 Debug 状态 | DebugFlag
 write 0x60110 0
 
 ; 保存当前根分区号 | RootDriveID
 write 0x60130 0
 
 ; 保存当前根驱动器 | RootDrive
 write 0x60134 0
 
 ; 这个好象未使用
 write 0x602A0 0
 
 ; 标记是 XP 还是 2003 | SysVer
 write 0x60300 0
 
 ; 这里大概是判断 Grub4Dos 版本是否匹配(read 返回值 0 为假,非 0 为真)
 cat --locate-align=1 (md)+1,1 || write 0x60000 1
 read 0x60000 && Error:GRUB4DOS Version Mismatched! Press any key to reboot...
 read 0x60000 && reboot
 
 ; 判断是否是 PXE 启动
 checkrange 0x21 read 0x8280 && write 0x60064 1
 
 ; 默认第一个菜单
 default 1
 ; 超时时间 5 秒
 timeout 5
 
 
 
 ; 菜单0
 title                      0PE for Windows XP/2003    by Pseudo 2009.6.20
 ; 空菜单
 clear
 
 
 
 ; 菜单1
 title                 [1] For XP, with SRS1.ZIP.\n   Main S&R&S Drivers Library.
 ; 设置菜单选择标记
 write 0x60068 1
 ; 通过错误语句跳转到菜单 10
 fallback 10
 kernel
 
 
 
 ; 菜单2
 title                 [2] For XP, with SRS2.ZIP.\n   Secondary S&R&S Drivers Library.
 ; 设置菜单选择标记
 write 0x60068 2
 ; 通过错误语句跳转到菜单 10
 fallback 10
 kernel
 
 
 
 ; 菜单3
 title                 [3] For XP, with F6.ZIP.\n   OEM S&R&S Drivers Floppy Disk Emulation (press F6/autodetect).
 ; 设置菜单选择标记
 write 0x60068 3
 ; 通过错误语句跳转到菜单 10
 fallback 10
 kernel
 
 
 
 ; 空菜单,夹在其它菜单中间,则无效,放在第一个菜单之前,则会让 TimeOut 失效。
 ; 疑为作者笔误
 title
 
 
 
 ; 菜单4
 title                 [4] User Menu with F6.ZIP.\n   OEM S&R&S Drivers Floppy Disk Emulation (press F6/autodetect).
 ; 设置菜单选择标记
 write 0x60068 4
 ; 通过错误语句跳转到菜单 10
 fallback 10
 kernel
 
 
 
 ; 菜单5
 title                 [5] For 2K3, with SRS1.ZIP.\n   Main S&R&S Drivers Library.
 ; 设置菜单选择标记
 write 0x60068 5
 ; 通过错误语句跳转到菜单 10
 fallback 10
 kernel
 
 
 
 ; 菜单6
 title                 [6] For 2K3, with SRS2.ZIP.\n   Secondary S&R&S Drivers Library.
 ; 设置菜单选择标记
 write 0x60068 6
 ; 通过错误语句跳转到菜单 10
 fallback 10
 kernel
 
 
 
 ; 菜单7
 title                 [7] For 2K3, with F6.ZIP.\n   OEM S&R&S Drivers Floppy Disk Emulation (press F6/autodetect).
 ; 设置菜单选择标记
 write 0x60068 7
 ; 通过错误语句跳转到菜单 10
 fallback 10
 kernel
 
 
 
 ; 菜单8
 title                 [8] MS DOS 7.1
 ; 设置菜单选择标记
 write 0x60068 8
 ; 通过错误语句跳转到菜单 10
 fallback 10
 kernel
 
 
 
 ; 菜单9
 title                 [9] Grub4Dos Debug On/Off.\nTurn on/off debug status.
 ; 清屏
 clear
 ; 关闭 Debug
 debug off
 
 
 ; 如果 DebugFlag 为 0,则设置 DebugFlag 2
 read 0x60110 || write 0x60110 2
 ; 如果 DebugFlag 为 1,则设置 DebugFlag 0
 checkrange 1 read 0x60110 && write 0x60110 0
 ; 如果 DebugFlag 为非 0(比如为 2),则设置 DebugFlag 1
 read 0x60110 && write 0x60110 1
 
 ; 根据 DebugFlag,设置提示信息
 read 0x60110 || pause Debug is now off...
 read 0x60110 && pause Debug is now on...
 ; 根据 DebugFlag,设置 Debug 状态
 read 0x60110 || debug off
 read 0x60110 && debug on
 ; 添加 Kernel 命令,使菜单生效,否则菜单不可选
 kernel || clear
 
 
 
 ; 菜单10,处理选择的系统类型 SysVer
 title
 
 ; 提示 root 位置,用于调试脚本
 pause --wait=0 Boot drive:
 debug on
 root
 debug off
 
 ; 恢复 Debug  状态
 read 0x60110 && debug on
 
 ; 判断选择的菜单是否是 2003 系统 ( 菜单 5-7 )
 checkrange 5:7 read 0x60068 && write 0x60300 1
 
 ; 如果不是 2003 系统,将跳转到 菜单 11
 fallback 11
 ; 如果是 2003 系统,将跳转到菜单 12
 read 0x60300 && fallback 12
 ; 开始跳转
 fallback F
 
 
 
 ; 菜单11,处理 XP 系统,SysVer = 0
 title
 
 
 ;
 fallback 14
 
 ; 复位 ErrorFlag
 write 0x60000 1
 
 ; 如果未找到 root 下面的 /0PE/BUFXP.GZ 则设置 ErrorFlag 为 0
 ls /0PE/BUFXP.GZ || write 0x60000 0
 
 ; 如果是 PXE 启动,则设置 ErrorFlag 为 0
 read 0x60064 && write 0x60000 0
 
 ; 如果 ErrorFlag 不为 0,则跳转到菜单 14
 read 0x60000 && kernel
 
 ; 复位 ErrorFlag
 write 0x60000 1
 
 ; 查找所有盘的 /0PE/BUFXP.GZ 文件,找不到则设置 ErrorFlag 为 0
 find --set-root /0PE/BUFXP.GZ || write 0x60000 0
 
 ; 如果 ErrorFlag 不为 0 ,则跳转到菜单 14
 read 0x60000 && kernel
 
 
 ;
 fallback 13
 
 ; 复位 ErrorFlag
 write 0x60000 1
 
 ; 如果未找到 root 下面的 /0PE/0PE.ISO 则设置 ErrorFlag 为 0
 ls /0PE/0PE.ISO || write 0x60000 0
 
 ; 如果是 PXE 启动,则设置 ErrorFlag 为 0
 read 0x60064 && write 0x60000 0
 
 ; 如果 ErrorFlag 不为 0,则跳转到菜单 13
 read 0x60000 && kernel
 
 ; 复位 ErrorFlag
 write 0x60000 1
 
 ; 查找所有盘的 /0PE/0PE.ISO 文件,找不到则设置 ErrorFlag 为 0
 find --set-root /0PE/0PE.ISO || write 0x60000 0
 
 ; 如果 ErrorFlag 不为 0,则跳转到菜单 13
 read 0x60000 && kernel
 
 
 ; 如果是 PXE 启动,则设置 root 为 PXE 服务器
 read 0x60064 && rootnoverify (pd)
 
 ; 设置标志:不自动解压 gzip 格式的文件
 write 0x82A4 1
 
 
 ;
 fallback 14
 ; 如果 PXE 中存在 /0PE/BUFXP.GZ (判断文件大小是否为 0)则跳转到 菜单14
 cat --length=0 /0PE/BUFXP.GZ && kernel
 
 ; 设置标志:自动解压 gzip 格式的文件
 write 0x82A4 0
 
 
 ;
 fallback 13
 
 ; 如果 PXE 中存在 /0PE/0PE.ISO 则跳转到 菜单13
 cat --length=0 /0PE/0PE.ISO && kernel
 
 ; 判断选择的是否是用户自定义菜单,如果是,则设置 SysVer 为 1
 checkrange 4 read 0x60068 && write 0x60300 1
 
 
 ;
 fallback 12
 
 ; 如果是是用户自定义菜单,则跳转到菜单 12 继续处理
 read 0x60300 && kernel
 
 ; 提示未找到 /0PE/BUFXP.GZ 和 /0PE/0PE.ISO
 pause Error:/0PE/BUFXP.GZ and /0PE/0PE.ISO not found!
 
 
 
 ; 菜单12,处理 2003 系统,SysVer = 1,过程同 XP 系统
 title
 
 ;
 fallback 14
 
 ; 复位 ErrorFlag
 write 0x60000 1
 
 ; 如果未找到 root 下面的 /0PE/BUF2K3.GZ 则设置 ErrorFlag 为 0
 ls /0PE/BUF2K3.GZ || write 0x60000 0
 
 ; 如果是 PXE 启动,则设置 ErrorFlag 为 0
 read 0x60064 && write 0x60000 0
 
 ; 如果 ErrorFlag 不为 0,则跳转到菜单 14
 read 0x60000 && kernel
 
 ; 复位 ErrorFlag
 write 0x60000 1
 
 ; 查找所有盘的 /0PE/BUF2K3.GZ 文件,找不到则设置 ErrorFlag 为 0
 find --set-root /0PE/BUF2K3.GZ || write 0x60000 0
 
 ; 如果 ErrorFlag 不为 0,则跳转到菜单 14
 read 0x60000 && kernel
 
 
 ;
 fallback 13
 
 ; 复位 ErrorFlag
 write 0x60000 1
 
 ; 如果未找到 root 下面的 /0PE/0PE.ISO 则设置 ErrorFlag 为 0
 ls /0PE/0PE.ISO || write 0x60000 0
 
 ; 如果是 PXE 启动,则设置 ErrorFlag 为 0
 read 0x60064 && write 0x60000 0
 
 ; 如果 ErrorFlag 不为 0,则跳转到菜单 13
 read 0x60000 && kernel
 
 ; 复位 ErrorFlag
 write 0x60000 1
 
 ; 查找所有盘的 /0PE/0PE.ISO 文件,找不到则设置 ErrorFlag 为 0
 find --set-root /0PE/0PE.ISO || write 0x60000 0
 
 ; 如果 ErrorFlag 不为 0,则跳转到菜单 13
 read 0x60000 && kernel
 
 ; 如果是 PXE 启动,则设置 root 为 PXE 服务器
 read 0x60064 && rootnoverify (pd)
 
 ; 设置标志:不自动解压 gzip 格式的文件
 write 0x82A4 1
 
 
 ;
 fallback 14
 
 ; 如果 PXE 中存在 /0PE/BUF2K3.GZ 则跳转到菜单 14
 cat --length=0 /0PE/BUF2K3.GZ && kernel
 
 ; 设置标志:自动解压 gzip 格式的文件
 write 0x82A4 0
 
 
 ;
 fallback 13
 
 ; 如果 PXE 中存在 /0PE/0PE.ISO 则跳转到菜单 13
 cat --length=0 /0PE/0PE.ISO && kernel
 
 ; 提示未找到 /0PE/BUF2K3.GZ 和 /0PE/0PE.ISO
 pause Error:/0PE/BUF2K3.GZ and /0PE/0PE.ISO not found!
 
 
 
 ; 菜单13,装载 0PE.ISO,然后跳转到 菜单14 继续启动
 title
 
 ; 提示 root 位置,用于调试脚本
 pause --wait=0 Current drive of 0PE.ISO:
 debug on
 root
 debug off
 
 ; 恢复 Debug  状态
 read 0x60110 && debug on
 
 ; 提示 装载0PE.ISO
 pause --wait=0 Loading /0PE/0PE.ISO...
 
 ; 磁盘装载 0PE.ISO,如果不成功,则内存装载 0PE.ISO
 map /0PE/0PE.ISO (0xff) || map --mem /0PE/0PE.ISO (0xff)
 
 ; 激活 map 的结果
 map --hook
 
 ; 设置 root 为 0PE.ISO 的装载位置
 rootnoverify (0xff)
 
 ; 跳转到 菜单14 继续处理
 fallback 14 && kernel
 
 
 
 ; 菜单14,启动系统
 title
 
 ; 设置标志:自动解压 gzip 格式的文件
 write 0x82A4 0
 
 ; 保存当前根分区号,和当前根所在驱动器
 dd if=(md) of=(md) bs=1 count=8 skip=0x829c seek=0x60130
 
 ; 提示 root 位置,用于调试脚本
 pause --wait=0 Current drive of BUF*.GZ:
 debug on
 root
 debug off
 
 ; 恢复 Debug  状态
 read 0x60110 && debug on
 
 ; 根据 SysVer 提示并装载 XP 系统 Buf 到 (hd7)
 read 0x60300 || pause --wait=0 Loading /0PE/BUFXP.GZ...
 read 0x60300 || map --mem ()/0PE/BUFXP.GZ (hd7)
 
 ; 根据 SysVer 提示并装载 2003 系统 Buf 到 (hd7)
 read 0x60300 && pause --wait=0 Loading /0PE/BUF2K3.GZ...
 read 0x60300 && map --mem ()/0PE/BUF2K3.GZ (hd7)
 
 ; 激活 map 结果
 map --hook
 
 ; 向 (hd7,0)/BAT/_ENV.BAT 中写入 set PEISO=/0PE/0PE.ISO\r\n,并继续从(hd7,0)/BAT/MENU.GZ 中的菜单启动
 write --offset=200 (hd7,0)/BAT/_ENV.BAT set PEISO=/0PE/0PE.ISO\r\n && configfile (hd7,0)/BAT/MENU.GZ
 
 
 ------------------------------------------------------------
 
 
 
 `
 
 [ 本帖最后由 stevenldj 于 2009-9-2 16:59 编辑 ]
 |