帮助中心

当前位置:首页 > 帮助中心 > 0PE 菜单分析(2)

0PE 菜单分析(2)

日期:2011-06-14 | 时间:23:51
 

MENU.GZ 中的菜单内容 
 
  此菜单接着 MENU.0PE 继续启动。

    看完整个 0PE 专用菜单,才知道,整个菜单只是根据用户不同的选择,将相应的 WinPE 所需文件包读入 DOS 所在的虚拟磁盘中,然后由 DOS 来处理这些文件,构建 WinPE 启动所需要的环境。

 

;0PE menu by Pseudo 2009.6.6
; 1、本地优先、解开的优先。有利于减少网络流量和内存占用。
;    根据首次找到的/0PE/BUFXP.GZ(BUF2K3.GZ)确定初始目录。先本地,后PXE服务器(PXE启动时);
;    先找解开的文件,后找/0PE/0PE.ISO,将其仿真为光盘并在其内找。
; 2、初始目录优先(先入为主)。初始目录优先有利于各组件版本一致,并减少搜索代价。
;    找其它文件次序:初始目录,本地盘(含仿真光盘),PXE服务器(PXE启动时)。
; 3、根驱动优先。根驱动一般是为本机定制的驱动。
;    如果存在磁盘驱动/OEM_SRS.ZIP,则不再找其它磁盘驱动,即使选了相应菜单。
; 由于初始目录优先,混合启动时,本地(包括0PE.ISO里)若有BUFXP.GZ(BUF2K3.GZ),则倾向于使用本地文件,缺文件才找PXE服务器上的。
; 本地若无BUFXP.GZ(BUF2K3.GZ),则倾向于使用PXE服务器上的文件,缺文件才从本地找。

 

; 设置 Debug 状态
read 0x60110 || debug off

; 将 Debug 状态传递到 Dos 启动过程中
read 0x60110 && write --offset=480 (hd7,0)/BAT/_ENV.BAT set DEBUGON=1\r\n

; 根据选择的菜单项,设置启动类别(XP,2003,DOS,用户自定义菜单)
write --offset=50 (hd7,0)/BAT/_ENV.BAT set SYS.VER=XP\r\n
checkrange 5:7 read 0x60068 && write --offset=50 (hd7,0)/BAT/_ENV.BAT set SYS.VER=2003\r\n
checkrange 8 read 0x60068 && write --offset=50 (hd7,0)/BAT/_ENV.BAT set SYS.VER=DOS\r\n
checkrange 4 read 0x60068 && write --offset=150 (hd7,0)/BAT/_ENV.BAT set MENU.USR=1\r\n

; 0x602A0 之前好象都未使用,怎么能在这里做判断呢?传递环境变量到 DOS:set BTM=ISO
read 0x602A0 && write (hd7,0)/BAT/_ENV.BAT set BTM=ISO\r\n

; 如果是 PXE 启动,传递环境变量到 DOS:set BTM=PXE
read 0x60064 && write (hd7,0)/BAT/_ENV.BAT set BTM=PXE\r\n

; 如果是 PXE 启动,则在 DOS 启动时加载 undi_drv.exe
read 0x60064 && write (hd7,0)/config.sys device=bin\\undi_drv.exe\r\n

; 如果是 PXE 启动,则将 PXE 的“客户端IP”,“服务端IP”,“网关IP” 写入 PXE_XIP.COM 中。
; PXE_XIP.COM 可能是 Pseudo 写的一个小程序
read 0x60064 && dd if=(md) of=(hd7,0)/BIN/PXE_XIP.COM bs=1 count=12 skip=0x8284 seek=0x166

; 流程控制变量
write 0x60234 0

 

default 0
timeout 0

; 隐藏菜单
hiddenmenu

 

; 菜单 [0] 流程控制
title

; [1] 0x60234 初始值就为 0,所以首先进入菜单 1 执行
checkrange 0 read 0x60234 && fallback 1

; [2]-[3]KERNEL.ZIP 可能返回 3 或者 出错后进入GRUB的命令行
checkrange 1 read 0x60234 && fallback 2

; [4]-[5]OEM_SRS.ZIP 可能返回 4,5,6,7,8
checkrange 3 read 0x60234 && fallback 4

; [6]-[7]SRS1.ZIP 返回 8
checkrange 4 read 0x60234 && fallback 6

; [8]-[9]SRS2.ZIP 返回 8
checkrange 5 read 0x60234 && fallback 8

; [10]-[11]F6.ZIP 可能返回 8,7
checkrange 6 read 0x60234 && fallback 10

; [12]xp/03switch 可能返回 9,10
checkrange 8 read 0x60234 && fallback 12

; [13]-[14]xp-ext1 可能返回 11(需要 xpext2),12(不需要 xpext2)
checkrange 9 read 0x60234 && fallback 13

; [15]-[16]2k3-ext1 可能返回 13(需要 2k3ext2),14(不需要 2k3ext2)
checkrange 10 read 0x60234 && fallback 15

; [17]-[18]xp-EXT2.WIM 可能返回 15(需要 NET.WIM),16(不需要)
checkrange 11 read 0x60234 && fallback 17

; [19]-[20]2k3-EXT2.WIM 可能返回 17(需要 NET.WIM),18(不需要)
checkrange 13 read 0x60234 && fallback 19

; [21]-[22]xp-NET.WIM 可能返回 19(需要 DEF.CAB),20(不需要)
checkrange 15 read 0x60234 && fallback 21

; [23]-[24]2k3-NET.WIM 可能返回 21(需要 DEF.CAB),22(不需要)
checkrange 17 read 0x60234 && fallback 23

; [25]-[26]DEF.CAB 可能返回 23
checkrange 19,21 read 0x60234 && fallback 25

; [27]BOOT
checkrange 7,12,14,16,18,20,22,23 read 0x60234 && fallback 27
fallback Force

 

; 菜单 [1] 进入 MS-DOS,失败则返回流程控制菜单(然后进入下一个启动项)
title

fallback 0

; 如果用户选择的不是 MS-DOS 启动,则(通过菜单0后)跳转到 菜单2,处理 KERNEL.ZIP大白菜官网
checkrange 8 read 0x60068 || write 0x60234 1
checkrange 8 read 0x60068 || kernel

 

; 如果是 MS-DOS 启动,则将 (hd7, 0) 映射为软盘(fd0)
map --mem (hd7,0)+1 (fd0)

; 卸载 虚拟软盘 (fd1,fd2,fd3),虚拟设备 0x80 到 0xff。
map --unmap=1,2,3,0x80:0xff
map --rehook

; 设置 root 目录为 (fd0),并设置引导文件
rootnoverify (fd0) && chainloader /io.sys

; 开始启动
; boot

 

; 菜单 [2] 处理 KERNEL.ZIP,将 KERNEL.ZIP 装入内存 (rd),以便写入到 _KERNEL.ZIP 中
title


; 提示信息 Loading /0PE/KERNEL.ZIP...
pause --wait=0 Loading /0PE/KERNEL.ZIP...

fallback 3

 

; 找初始目录

; 复位 ErrorFlag
write 0x60000 1

; 恢复初始目录,并设置 root 为根目录
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()

; 装载 KERNEL.ZIP 到内存 (rd),(rd) 起始于 16M(0x8000 * 512) 处
map --mem=0x8000 /0PE/KERNEL.ZIP (rd) || write 0x60000 0

; 成功则跳转到 菜单3,继续处理 KERNEL.ZIP,失败则继续查找 KERNEL.ZIP
read 0x60000 && kernel

 

; 找所有磁盘

; 复位 ErrorFlag
write 0x60000 1

; 搜索所有磁盘的 KERNEL.ZIP 然后装载到内存 (rd)
find --set-root /0PE/KERNEL.ZIP || write 0x60000 0

; 成功则装载 KERNEL.ZIP 到内存 (rd),(rd) 起始于 16M(0x8000 * 512) 处
read 0x60000 && map --mem=0x8000 /0PE/KERNEL.ZIP (rd)

; 成功则跳转到 菜单3,继续处理 KERNEL.ZIP,失败则继续查找 KERNEL.ZIP
read 0x60000 && kernel

 

; 找 PXE

; 复位 ErrorFlag
write 0x60000 1

; 如果是 PXE 启动,则设置 root 为 PXE 服务器
read 0x60064 && rootnoverify (pd)

; 装载 KERNEL.ZIP 到内存 (rd),(rd) 起始于 16M(0x8000 * 512) 处
map --mem=0x8000 /0PE/KERNEL.ZIP (rd) || write 0x60000 0

; 成功则跳转到 菜单3,继续处理 KERNEL.ZIP
read 0x60000 && kernel

; 失败则进入 GRUB 命令行模式
pause Error: File /0PE/KERNEL.ZIP not found!!! && commandline

 

; 菜单 [3] 将 KERNEL.ZIP 写入 _KERNEL.ZIP,以便 DOS 处理
title


; 获取 (rd) 的大小并写入 _KERNEL.ZIP 的文件头中(_KERNEL.ZIP 原本为 3M 全0文件)
cat --length=0 (rd)+1 && dd if=(md) of=(hd7,0)/BUF/_KERNEL.ZIP bs=1 count=4 skip=0x8290

; 将 (rd) 的内容写入 _KERNEL.ZIP 的剩余空间中
dd if=(rd)+1 of=(hd7,0)/BUF/_KERNEL.ZIP bs=1 seek=4

; 提示 KERNEL.ZIP 准备完毕
pause --wait=0 KERNEL.ZIP is ready.

; (通过菜单0后)跳转到 菜单4,继续处理 OEM_SRS.ZIP
fallback 0
write 0x60234 3 && kernel

 

; 菜单 [4] 处理 OEM_SRS.ZIP,将 OEM_SRS.ZIP 装入内存 (rd),以便写入到 _SRS.ZIP 中
title


; 提示信息 Loading /OEM_SRS.ZIP...
pause --wait=0 Loading /OEM_SRS.ZIP...


; 如果选择了与 F6.ZIP 相关的启动项,则载入 1M 大小的 _srs.zip 到 (fd2) 中
checkrange 3,4,7 read 0x60068 && map --mem (hd7,0)/F6.GZ (fd2)

; 如果未选择与 F6.ZIP 相关的启动项,则载入 3M 大小的 _srs.zip 到 (fd2) 中
checkrange 3,4,7 read 0x60068 || map --mem (hd7,0)/A.GZ (fd2)
map --hook

fallback 5


; 找初始目录

; 复位 ErrorFlag
write 0x60000 1

; 恢复初始目录,并设置 root 为根目录
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()

; 装载 OEM_SRS.ZIP 到内存 (rd),(rd) 起始于 16M(0x8000 * 512) 处
map --mem=0x8000 /OEM_SRS.ZIP (rd) || write 0x60000 0

; 成功则跳转到 菜单5,继续处理 KERNEL.ZIP,失败则继续查找 OEM_SRS.ZIP
read 0x60000 && kernel

 

; 找本地磁盘

; 复位 ErrorFlag
write 0x60000 1

; 搜索所有磁盘的 KERNEL.ZIP 然后装载到内存 (rd),忽略软盘和光盘
find --set-root --ignore-floppies --ignore-cd /OEM_SRS.ZIP || write 0x60000 0

; 成功则装载 OEM_SRS.ZIP 到内存 (rd),(rd) 起始于 16M(0x8000 * 512) 处
read 0x60000 && map --mem=0x8000 /OEM_SRS.ZIP (rd)

; 成功则跳转到 菜单5,继续处理 OEM_SRS.ZIP,失败则继续查找 OEM_SRS.ZIP
read 0x60000 && kernel


; 找PXE

; 复位 ErrorFlag
write 0x60000 1

; 如果是 PXE 启动,则设置 root 为 PXE 服务器
read 0x60064 && rootnoverify (pd)

; 装载 OEM_SRS.ZIP 到内存 (rd),(rd) 起始于 16M(0x8000 * 512) 处
map --mem=0x8000 /OEM_SRS.ZIP (rd) || write 0x60000 0

; 成功则跳转到 菜单3,继续处理 OEM_SRS.ZIP
read 0x60000 && kernel

; 失败则提示 OEM_SRS.ZIP not found.
pause --wait=0 OEM_SRS.ZIP not found.

; 如果选择了与 SRS1.ZIP 相关的菜单项目,则(通过菜单0)跳转到 菜单6 处理 SRS1.ZIP
checkrange 1,5 read 0x60068 && write 0x60234 4

; 如果选择了与 SRS2.ZIP 相关的菜单项目,则(通过菜单0)跳转到 菜单8 处理 SRS2.ZIP
checkrange 2,6 read 0x60068 && write 0x60234 5

; 如果选择了与 F6.ZIP 相关的菜单项目,则(通过菜单0)跳转到 菜单10 处理 F6.ZIP
checkrange 3,4,7 read 0x60068 && write 0x60234 6

; 开始跳转
fallback 0 && kernel

 

; 菜单 [5] 将 OEM_SRS.ZIP 写入 _SRS.ZIP,以便 DOS 处理
title


; 传递环境变量到 DOS:set OEMF6=TRUE
write --offset=450 (hd7,0)/BAT/_ENV.BAT set OEMF6=TRUE\r\n

; 获取 (rd) 的大小并写入 _SRS.ZIP 的文件头中(_SRS.ZIP 原本为 1.4M 全0文件,或 3M 全0文件)
cat --length=0 (rd)+1 && dd if=(md) of=(fd2)/_SRS.ZIP bs=1 count=4 skip=0x8290

; 将 (rd) 的内容写入 _SRS.ZIP 的剩余空间中
dd if=(rd)+1 of=(fd2)/_SRS.ZIP bs=1 seek=4

; 提示 OEM_SRS.ZIP 准备完毕
pause --wait=0 OEM_SRS.ZIP is ready.

; 如果选择的是“用户自定义菜单”,则(通过菜单0)跳转到 菜单27 直接启动
; 否则跳转到 菜单12 根据所选择的不同系统,继续处理 EXT1.GZ
write 0x60234 8
checkrange 4 read 0x60068 && write 0x60234 7

; 开始跳转
fallback 0 && kernel

 

; 菜单 [6] 处理 SRS1.ZIP,将 SRS1.ZIP 装入内存 (rd),以便写入到 _SRS.ZIP 中
title


; 提示信息 Loading /0PE/SRS/SRS1.ZIP...
pause --wait=0 Loading /0PE/SRS/SRS1.ZIP...

fallback 7


; 找初始目录
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/SRS/SRS1.ZIP (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/SRS/SRS1.ZIP || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/SRS/SRS1.ZIP (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/SRS/SRS1.ZIP (rd) || write 0x60000 0
read 0x60000 && kernel

; 失败则(通过菜单0)跳转到菜单12,根据所选择的不同系统,继续处理 EXT1.GZ
pause --wait=0 SRS1.ZIP not found.
write 0x60234 8
fallback 0 && kernel

 

; 菜单 [7] 将 SRS1.ZIP 写入 _SRS.ZIP,以便 DOS 处理
title
write --offset=400 (hd7,0)/BAT/_ENV.BAT set scsiImg=TRUE\r\n

; (_SRS.ZIP 原本为 3M 全0文件)
cat --length=0 (rd)+1 && dd if=(md) of=(fd2)/_SRS.ZIP bs=1 count=4 skip=0x8290
dd if=(rd)+1 of=(fd2)/_SRS.ZIP bs=1 seek=4
pause --wait=0 SRS1.ZIP is ready.

; (通过菜单0)跳转到 菜单12 根据所选择的不同系统,继续处理 EXT1.GZ
write 0x60234 8
fallback 0 && kernel

 

; 菜单 [8] 处理 SRS2.ZIP,将 SRS2.ZIP 装入内存 (rd),以便写入到 _SRS.ZIP 中大白菜官网
title
pause --wait=0 Loading /0PE/SRS/SRS2.ZIP...
fallback 9

; 初始目录有
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/SRS/SRS2.ZIP (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/SRS/SRS2.ZIP || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/SRS/SRS2.ZIP (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/SRS/SRS2.ZIP (rd) || write 0x60000 0
read 0x60000 && kernel

; 失败则(通过菜单0)跳转到菜单12,根据所选择的不同系统,继续处理 EXT1.GZ
pause --wait=0 SRS2.ZIP not found.
write 0x60234 8
fallback 0 && kernel

 

; 菜单 [9] 将 SRS2.ZIP 写入 _SRS.ZIP,以便 DOS 处理
title
write --offset=400 (hd7,0)/BAT/_ENV.BAT set scsiImg=TRUE\r\n

; (_SRS.ZIP 原本为 3M 全0文件)
cat --length=0 (rd)+1 && dd if=(md) of=(fd2)/_SRS.ZIP bs=1 count=4 skip=0x8290
dd if=(rd)+1 of=(fd2)/_SRS.ZIP bs=1 seek=4

; (通过菜单0)跳转到 菜单12 根据所选择的不同系统,继续处理 EXT1.GZ
pause --wait=0 SRS2.ZIP is ready.
write 0x60234 8
fallback 0 && kernel

 

; 菜单 [10] 处理 F6.ZIP,将 F6.ZIP 装入内存 (rd),以便写入到 _SRS.ZIP 中
title
pause --wait=0 Loading /0PE/SRS/F6.ZIP...
fallback 11

; 初始目录有
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/SRS/F6.ZIP (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/SRS/F6.ZIP || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/SRS/F6.ZIP (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/SRS/F6.ZIP (rd) || write 0x60000 0
read 0x60000 && kernel

; 如果选择的是“用户自定义菜单”,则(通过菜单0)跳转到 菜单27 直接启动
; 否则跳转到 菜单12 根据所选择的不同系统,继续处理 EXT1.GZ
pause --wait=0 F6.ZIP not found.
write 0x60234 8
checkrange 4 read 0x60068 && write 0x60234 7
fallback 0 && kernel

 

; 菜单 [11] 将 F6.ZIP 写入 _SRS.ZIP,以便 DOS 处理
title
write --offset=450 (hd7,0)/BAT/_ENV.BAT set OEMF6=TRUE\r\n

; (_SRS.ZIP 原本为 1.4M 全0文件)
cat --length=0 (rd)+1 && dd if=(md) of=(fd2)/_SRS.ZIP bs=1 count=4 skip=0x8290
dd if=(rd)+1 of=(fd2)/_SRS.ZIP bs=1 seek=4

; 如果选择的是“用户自定义菜单”,则(通过菜单0)跳转到 菜单27 直接启动
; 否则跳转到 菜单12 根据所选择的不同系统,继续处理 EXT1.GZ
pause --wait=0 F6.ZIP is ready.
write 0x60234 8
checkrange 4 read 0x60068 && write 0x60234 7
fallback 0 && kernel

 

; 菜单 [12] 根据所选择的不同系统(XP/03),处理不同的 EXT1.GZ
title
write 0x60234 9
read 0x60300 && write 0x60234 10
fallback 0 && kernel

 

; 菜单 [13] 处理 XP 的 EXT1.GZ,将 XP 的 EXT1.GZ 装入内存 (rd),以便快速释放到虚拟软盘 (fd3)
title
pause --wait=0 Loading /0PE/XP/EXT1.GZ...

; 不自动解压 gzip 文件,将 EXT1.GZ 整个装入内存 (rd)
write 0x82A4 1
fallback 14

; 找初始目录
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/XP/EXT1.GZ (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/XP/EXT1.GZ || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/XP/EXT1.GZ (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/XP/EXT1.GZ (rd) || write 0x60000 0
read 0x60000 && kernel

; 失败则将 B.GZ 虚拟为 (fd3),B.GZ 为 3M 空磁盘映像
pause --wait=0 EXT1.GZ not found.
write 0x82A4 0
map --mem (hd7,0)/B.GZ (fd3)
map --hook

; 如果是 PXE 启动,或 ISO 启动,则继续处理 EXT2.WIM,否则直接启动
write 0x60234 12
read 0x60064 && write 0x60234 11
read 0x602A0 && write 0x60234 11
fallback 0 && kernel

 

; 菜单 [14] 将 EXT1.GZ 释放到虚拟软盘 (fd3)
title
write --offset=300 (hd7,0)/BAT/_ENV.BAT set EXT1=TRUE\r\n
write 0x82A4 0
map --mem (rd)+1 (fd3) && map --hook
pause --wait=0 EXT1.GZ is ready.

; 如果是 PXE 启动,或 ISO 启动,则继续处理 EXT2.WIM,否则直接启动
write 0x60234 12
read 0x60064 && write 0x60234 11
read 0x602A0 && write 0x60234 11
fallback 0 && kernel

 

; 菜单 [15] 处理 2003 的 EXT1.GZ,将 2003 的 EXT1.GZ 装入内存 (rd),以便快速释放到虚拟软盘 (fd3)
title
pause --wait=0 Loading /0PE/2003/EXT1.GZ...
write 0x82A4 1
fallback 16

; 初始目录有
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/2003/EXT1.GZ (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/2003/EXT1.GZ || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/2003/EXT1.GZ (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/2003/EXT1.GZ (rd) || write 0x60000 0
read 0x60000 && kernel

; 失败则将 B.GZ 虚拟为 (fd3),B.GZ 为 3M 空磁盘映像
pause --wait=0 EXT1.GZ not found.
write 0x82A4 0
map --mem (hd7,0)/B.GZ (fd3)
map --hook

; 如果是 PXE 启动,或 ISO 启动,则继续处理 EXT2.WIM,否则直接启动
write 0x60234 14
read 0x60064 && write 0x60234 13
read 0x602A0 && write 0x60234 13
fallback 0 && kernel

 

; 菜单 [16] 将 EXT1.GZ 释放到虚拟软盘 (fd3)
title
write --offset=300 (hd7,0)/BAT/_ENV.BAT set EXT1=TRUE\r\n
write 0x82A4 0
map --mem (rd)+1 (fd3) && map --hook

; 如果是 PXE 启动,或 ISO 启动,则继续处理 EXT2.WIM,否则直接启动
pause --wait=0 EXT1.GZ is ready.
write 0x60234 14
read 0x60064 && write 0x60234 13
read 0x602A0 && write 0x60234 13
fallback 0 && kernel

 

; 菜单 [17] 处理 XP 的 EXT2.WIM,将 XP 的 EXT2.WIM 装入内存 (rd),以便写入到 _EXT2.WIM 中
title
pause --wait=0 Loading /0PE/XP/EXT2.WIM...
fallback 18

; 初始目录有
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/XP/EXT2.WIM (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/XP/EXT2.WIM || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/XP/EXT2.WIM (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/XP/EXT2.WIM (rd) || write 0x60000 0
read 0x60000 && kernel

; 如果是 PXE 启动,或 ISO 启动,则继续处理 @0#NET_.WIM,否则直接启动
pause --wait=0 EXT2.WIM not found.
write 0x60234 16
read 0x60064 && write 0x60234 15
read 0x602A0 && write 0x60234 15
fallback 0 && kernel

 

; 菜单 [18] 将 XP 的 EXT2.WIM 写入 _EXT2.WIM,以便 DOS 处理
title
cat --length=0 (rd)+1 && dd if=(md) of=(hd7,0)/BUF/_EXT2.WIM bs=1 count=4 skip=0x8290
dd if=(rd)+1 of=(hd7,0)/BUF/_EXT2.WIM bs=1 seek=4
pause --wait=0 EXT2.WIM is ready.
write 0x60234 16
read 0x60064 && write 0x60234 15
read 0x602A0 && write 0x60234 15
fallback 0 && kernel

 

; 菜单 [19] 处理 2003 的 EXT2.WIM,将 2003 的 EXT2.WIM 装入内存 (rd),以便写入到 _EXT2.WIM 中
title
pause --wait=0 Loading /0PE/2003/EXT2.WIM...
fallback 20

; 初始目录有
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/2003/EXT2.WIM (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/2003/EXT2.WIM || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/2003/EXT2.WIM (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/2003/EXT2.WIM (rd) || write 0x60000 0
read 0x60000 && kernel

; 如果是 PXE 启动,或 ISO 启动,则继续处理 @0#NET_.WIM,否则直接启动
pause --wait=0 EXT2.WIM not found.
write 0x60234 18
read 0x60064 && write 0x60234 17
read 0x602A0 && write 0x60234 17
fallback 0 && kernel

 

; 菜单 [20] 将 2003 的 EXT2.WIM 写入 _EXT2.WIM,以便 DOS 处理
title
cat --length=0 (rd)+1 && dd if=(md) of=(hd7,0)/BUF/_EXT2.WIM bs=1 count=4 skip=0x8290
dd if=(rd)+1 of=(hd7,0)/BUF/_EXT2.WIM bs=1 seek=4

; 如果是 PXE 启动,或 ISO 启动,则继续处理 @0#NET_.WIM,否则直接启动
pause --wait=0 EXT2.WIM is ready.
write 0x60234 18
read 0x60064 && write 0x60234 17
read 0x602A0 && write 0x60234 17
fallback 0 && kernel

 

; 菜单 [21] 处理 @0#NET_.WIM,将 @0#NET_.WIM 装入内存 (rd),以便写入到 _NET.WIM 中
title
pause --wait=0 Loading /0PE/AUTORUNS/@0#NET_.WIM...
fallback 22

; 初始目录有
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/AUTORUNS/@0#NET_.WIM (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/AUTORUNS/@0#NET_.WIM || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/AUTORUNS/@0#NET_.WIM (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/AUTORUNS/@0#NET_.WIM (rd) || write 0x60000 0
read 0x60000 && kernel

; 如果是 PXE 启动,则继续处理 DEF.CAB,否则直接启动
pause --wait=0 @0#NET_.WIM not found.
write 0x60234 20
read 0x60064 && write 0x60234 19
fallback 0 && kernel

 

; 菜单 [22] 将 @0#NET_.WIM 写入 _NET.WIM,以便 DOS 处理
title
cat --length=0 (rd)+1 && dd if=(md) of=(hd7,0)/BUF/_NET.WIM bs=1 count=4 skip=0x8290
dd if=(rd)+1 of=(hd7,0)/BUF/_NET.WIM bs=1 seek=4

; 如果是 PXE 启动,则继续处理 DEF.CAB,否则直接启动
pause --wait=0 @0#NET_.WIM is ready.
write 0x60234 20
read 0x60064 && write 0x60234 19
fallback 0 && kernel

 

; 菜单 [23] 内容和 菜单21 一样,可共用
title
pause --wait=0 Loading /0PE/AUTORUNS/@0#NET_.WIM...
fallback 24

; 初始目录有
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/AUTORUNS/@0#NET_.WIM (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/AUTORUNS/@0#NET_.WIM || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/AUTORUNS/@0#NET_.WIM (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/AUTORUNS/@0#NET_.WIM (rd) || write 0x60000 0
read 0x60000 && kernel
pause --wait=0 @0#NET_.WIM not found.
write 0x60234 22
read 0x60064 && write 0x60234 21
fallback 0 && kernel

 

; 菜单 [24] 内容和 菜单22 一样,可共用
title
cat --length=0 (rd)+1 && dd if=(md) of=(hd7,0)/BUF/_NET.WIM bs=1 count=4 skip=0x8290
dd if=(rd)+1 of=(hd7,0)/BUF/_NET.WIM bs=1 seek=4
pause --wait=0 @0#NET_.WIM is ready.
write 0x60234 22
read 0x60064 && write 0x60234 21
fallback 0 && kernel

 

; 菜单 [25] 处理 DEF.CAB,将 DEF.CAB 装入内存 (rd),以便写入到 _DEF.CAB 中
title
pause --wait=0 Loading /0PE/NET/*...
fallback 26

; 初始目录有
write 0x60000 1
dd if=(md) of=(md) bs=1 count=8 skip=0x60130 seek=0x829c && root ()
map --mem=0x8000 /0PE/NET/DEF.CAB (rd) || write 0x60000 0
read 0x60000 && kernel

; 找本地
write 0x60000 1
find --set-root /0PE/NET/DEF.CAB || write 0x60000 0
read 0x60000 && map --mem=0x8000 /0PE/NET/DEF.CAB (rd)
read 0x60000 && kernel

; 找PXE
write 0x60000 1
read 0x60064 && rootnoverify (pd)
map --mem=0x8000 /0PE/NET/DEF.CAB (rd) || write 0x60000 0
read 0x60000 && kernel

; 失败则直接启动
pause --wait=0 DEF.CAB not found.
write 0x60234 23
fallback 0 && kernel

 

; 菜单 [26] Loading /0PE/NET/*...
title
cat --length=0 (rd)+1 && dd if=(md) of=(hd7,0)/BUF/_DEF.CAB bs=1 count=4 skip=0x8290
dd if=(rd)+1 of=(hd7,0)/BUF/_DEF.CAB bs=1 seek=4
pause --wait=0 DEF.CAB is ready.

; 将 NETID.TXT 的内容写入 _NETID.TXT
write 0x60000 1
map --mem=0x8000 /0PE/NET/NETID.TXT (rd) || write 0x60000 0
read 0x60000 && cat --length=0 (rd)+1
read 0x60000 && dd if=(md) of=(hd7,0)/BUF/_NETID.TXT bs=1 count=4 skip=0x8290
read 0x60000 && dd if=(rd)+1 of=(hd7,0)/BUF/_NETID.TXT bs=1 seek=4
read 0x60000 && pause --wait=0 NETID.TXT is ready.
read 0x60000 || pause --wait=0 NETID.TXT not found.

; 将 NETMAP.TXT 的内容写入 _NETMAP.TXT
write 0x60000 1
map --mem=0x8000 /0PE/NET/NETMAP.TXT (rd) || write 0x60000 0
read 0x60000 && cat --length=0 (rd)+1
read 0x60000 && dd if=(md) of=(hd7,0)/BUF/_NETMAP.TXT bs=1 count=4 skip=0x8290
read 0x60000 && dd if=(rd)+1 of=(hd7,0)/BUF/_NETMAP.TXT bs=1 seek=4
read 0x60000 && pause --wait=0 NETMAP.TXT is ready.
read 0x60000 || pause --wait=0 NETMAP.TXT not found.

; 开始启动
write 0x60234 23
fallback 0 && kernel

 

; 菜单 [27] 启动
title


; 转 (fd2) 为 (fd0)
; 此时 (fd0) 中存放的是 SRS 文件
map --mem (fd2)+1 (fd0)

; 如果选择了“用户自定义菜单”,则转 (fd3) 为 (fd1)
; 此时 (fd1) 中存放的是 EXT1.GZ 中的内容
checkrange 4 read 0x60068 || map --mem (fd3)+1 (fd1)

; 如果未选择“用户自定义菜单”,则设置 (fd1) 为 B.GZ 的内容
; 此时 (fd1) 为 3M 大小的空软盘映像
checkrange 4 read 0x60068 && map --mem (hd7,0)/B.GZ (fd1)

; 卸载 (fd2), (fd3), (0xA0)到(0xff)
map --unmap=2,3,0xA0:0xff
map --rehook


; 调整硬盘顺序,(hd7) 优先
errorcheck off
map (hd7) (hd0)
map (hd2) (hd3)
map (hd1) (hd2)
map (hd0) (hd1)
map --hook
errorcheck on


; 进入 DOS 环境,处理文件
rootnoverify (hd0,0) && chainloader /io.sys
; 开始启动
; boot

大白菜官网

(责任编辑:www.winbaicai.com)

大白菜超级U盘启动盘制作工具