0PE 菜單分析(2)
MENU.GZ 中的菜單內(nèi)容
此菜單接著 MENU.0PE 繼續(xù)啟動。
看完整個 0PE 專用菜單,才知道,整個菜單只是根據(jù)用戶不同的選擇,將相應的 WinPE 所需文件包讀入 DOS 所在的虛擬磁盤中,然后由 DOS 來處理這些文件,構(gòu)建 WinPE 啟動所需要的環(huán)境。
;0PE menu by Pseudo 2009.6.6
; 1、本地優(yōu)先、解開的優(yōu)先。有利于減少網(wǎng)絡流量和內(nèi)存占用。
; 根據(jù)首次找到的/0PE/BUFXP.GZ(BUF2K3.GZ)確定初始目錄。先本地,后PXE服務器(PXE啟動時);
; 先找解開的文件,后找/0PE/0PE.ISO,將其仿真為光盤并在其內(nèi)找。
; 2、初始目錄優(yōu)先(先入為主)。初始目錄優(yōu)先有利于各組件版本一致,并減少搜索代價。
; 找其它文件次序:初始目錄,本地盤(含仿真光盤),PXE服務器(PXE啟動時)。
; 3、根驅(qū)動優(yōu)先。根驅(qū)動一般是為本機定制的驅(qū)動。
; 如果存在磁盤驅(qū)動/OEM_SRS.ZIP,則不再找其它磁盤驅(qū)動,即使選了相應菜單。
; 由于初始目錄優(yōu)先,混合啟動時,本地(包括0PE.ISO里)若有BUFXP.GZ(BUF2K3.GZ),則傾向于使用本地文件,缺文件才找PXE服務器上的。
; 本地若無BUFXP.GZ(BUF2K3.GZ),則傾向于使用PXE服務器上的文件,缺文件才從本地找。
; 設置 Debug 狀態(tài)
read 0x60110 || debug off
; 將 Debug 狀態(tài)傳遞到 Dos 啟動過程中
read 0x60110 && write --offset=480 (hd7,0)/BAT/_ENV.BAT set DEBUGON=1\r\n
; 根據(jù)選擇的菜單項,設置啟動類別(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 之前好象都未使用,怎么能在這里做判斷呢?傳遞環(huán)境變量到 DOS:set BTM=ISO
read 0x602A0 && write (hd7,0)/BAT/_ENV.BAT set BTM=ISO\r\n
; 如果是 PXE 啟動,傳遞環(huán)境變量到 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”,“網(wǎng)關(guān)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 執(zhí)行
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后)跳轉(zhuǎn)到 菜單2,處理 KERNEL.ZIP大白菜官網(wǎng)
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 裝入內(nèi)存 (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 到內(nèi)存 (rd),(rd) 起始于 16M(0x8000 * 512) 處
map --mem=0x8000 /0PE/KERNEL.ZIP (rd) || write 0x60000 0
; 成功則跳轉(zhuǎn)到 菜單3,繼續(xù)處理 KERNEL.ZIP,失敗則繼續(xù)查找 KERNEL.ZIP
read 0x60000 && kernel
; 找所有磁盤
; 復位 ErrorFlag
write 0x60000 1
; 搜索所有磁盤的 KERNEL.ZIP 然后裝載到內(nèi)存 (rd)
find --set-root /0PE/KERNEL.ZIP || write 0x60000 0
; 成功則裝載 KERNEL.ZIP 到內(nèi)存 (rd),(rd) 起始于 16M(0x8000 * 512) 處
read 0x60000 && map --mem=0x8000 /0PE/KERNEL.ZIP (rd)
; 成功則跳轉(zhuǎn)到 菜單3,繼續(xù)處理 KERNEL.ZIP,失敗則繼續(xù)查找 KERNEL.ZIP
read 0x60000 && kernel
; 找 PXE
; 復位 ErrorFlag
write 0x60000 1
; 如果是 PXE 啟動,則設置 root 為 PXE 服務器
read 0x60064 && rootnoverify (pd)
; 裝載 KERNEL.ZIP 到內(nèi)存 (rd),(rd) 起始于 16M(0x8000 * 512) 處
map --mem=0x8000 /0PE/KERNEL.ZIP (rd) || write 0x60000 0
; 成功則跳轉(zhuǎn)到 菜單3,繼續(xù)處理 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) 的內(nèi)容寫入 _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后)跳轉(zhuǎn)到 菜單4,繼續(xù)處理 OEM_SRS.ZIP
fallback 0
write 0x60234 3 && kernel
; 菜單 [4] 處理 OEM_SRS.ZIP,將 OEM_SRS.ZIP 裝入內(nèi)存 (rd),以便寫入到 _SRS.ZIP 中
title
; 提示信息 Loading /OEM_SRS.ZIP...
pause --wait=0 Loading /OEM_SRS.ZIP...
; 如果選擇了與 F6.ZIP 相關(guān)的啟動項,則載入 1M 大小的 _srs.zip 到 (fd2) 中
checkrange 3,4,7 read 0x60068 && map --mem (hd7,0)/F6.GZ (fd2)
; 如果未選擇與 F6.ZIP 相關(guān)的啟動項,則載入 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 到內(nèi)存 (rd),(rd) 起始于 16M(0x8000 * 512) 處
map --mem=0x8000 /OEM_SRS.ZIP (rd) || write 0x60000 0
; 成功則跳轉(zhuǎn)到 菜單5,繼續(xù)處理 KERNEL.ZIP,失敗則繼續(xù)查找 OEM_SRS.ZIP
read 0x60000 && kernel
; 找本地磁盤
; 復位 ErrorFlag
write 0x60000 1
; 搜索所有磁盤的 KERNEL.ZIP 然后裝載到內(nèi)存 (rd),忽略軟盤和光盤
find --set-root --ignore-floppies --ignore-cd /OEM_SRS.ZIP || write 0x60000 0
; 成功則裝載 OEM_SRS.ZIP 到內(nèi)存 (rd),(rd) 起始于 16M(0x8000 * 512) 處
read 0x60000 && map --mem=0x8000 /OEM_SRS.ZIP (rd)
; 成功則跳轉(zhuǎn)到 菜單5,繼續(xù)處理 OEM_SRS.ZIP,失敗則繼續(xù)查找 OEM_SRS.ZIP
read 0x60000 && kernel
; 找PXE
; 復位 ErrorFlag
write 0x60000 1
; 如果是 PXE 啟動,則設置 root 為 PXE 服務器
read 0x60064 && rootnoverify (pd)
; 裝載 OEM_SRS.ZIP 到內(nèi)存 (rd),(rd) 起始于 16M(0x8000 * 512) 處
map --mem=0x8000 /OEM_SRS.ZIP (rd) || write 0x60000 0
; 成功則跳轉(zhuǎn)到 菜單3,繼續(xù)處理 OEM_SRS.ZIP
read 0x60000 && kernel
; 失敗則提示 OEM_SRS.ZIP not found.
pause --wait=0 OEM_SRS.ZIP not found.
; 如果選擇了與 SRS1.ZIP 相關(guān)的菜單項目,則(通過菜單0)跳轉(zhuǎn)到 菜單6 處理 SRS1.ZIP
checkrange 1,5 read 0x60068 && write 0x60234 4
; 如果選擇了與 SRS2.ZIP 相關(guān)的菜單項目,則(通過菜單0)跳轉(zhuǎn)到 菜單8 處理 SRS2.ZIP
checkrange 2,6 read 0x60068 && write 0x60234 5
; 如果選擇了與 F6.ZIP 相關(guān)的菜單項目,則(通過菜單0)跳轉(zhuǎn)到 菜單10 處理 F6.ZIP
checkrange 3,4,7 read 0x60068 && write 0x60234 6
; 開始跳轉(zhuǎn)
fallback 0 && kernel
; 菜單 [5] 將 OEM_SRS.ZIP 寫入 _SRS.ZIP,以便 DOS 處理
title
; 傳遞環(huán)境變量到 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) 的內(nèi)容寫入 _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)跳轉(zhuǎn)到 菜單27 直接啟動
; 否則跳轉(zhuǎn)到 菜單12 根據(jù)所選擇的不同系統(tǒng),繼續(xù)處理 EXT1.GZ
write 0x60234 8
checkrange 4 read 0x60068 && write 0x60234 7
; 開始跳轉(zhuǎn)
fallback 0 && kernel
; 菜單 [6] 處理 SRS1.ZIP,將 SRS1.ZIP 裝入內(nèi)存 (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)跳轉(zhuǎn)到菜單12,根據(jù)所選擇的不同系統(tǒng),繼續(xù)處理 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)跳轉(zhuǎn)到 菜單12 根據(jù)所選擇的不同系統(tǒng),繼續(xù)處理 EXT1.GZ
write 0x60234 8
fallback 0 && kernel
; 菜單 [8] 處理 SRS2.ZIP,將 SRS2.ZIP 裝入內(nèi)存 (rd),以便寫入到 _SRS.ZIP 中大白菜官網(wǎng)
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)跳轉(zhuǎn)到菜單12,根據(jù)所選擇的不同系統(tǒng),繼續(xù)處理 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)跳轉(zhuǎn)到 菜單12 根據(jù)所選擇的不同系統(tǒng),繼續(xù)處理 EXT1.GZ
pause --wait=0 SRS2.ZIP is ready.
write 0x60234 8
fallback 0 && kernel
; 菜單 [10] 處理 F6.ZIP,將 F6.ZIP 裝入內(nèi)存 (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)跳轉(zhuǎn)到 菜單27 直接啟動
; 否則跳轉(zhuǎn)到 菜單12 根據(jù)所選擇的不同系統(tǒng),繼續(xù)處理 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)跳轉(zhuǎn)到 菜單27 直接啟動
; 否則跳轉(zhuǎn)到 菜單12 根據(jù)所選擇的不同系統(tǒng),繼續(xù)處理 EXT1.GZ
pause --wait=0 F6.ZIP is ready.
write 0x60234 8
checkrange 4 read 0x60068 && write 0x60234 7
fallback 0 && kernel
; 菜單 [12] 根據(jù)所選擇的不同系統(tǒng)(XP/03),處理不同的 EXT1.GZ
title
write 0x60234 9
read 0x60300 && write 0x60234 10
fallback 0 && kernel
; 菜單 [13] 處理 XP 的 EXT1.GZ,將 XP 的 EXT1.GZ 裝入內(nèi)存 (rd),以便快速釋放到虛擬軟盤 (fd3)
title
pause --wait=0 Loading /0PE/XP/EXT1.GZ...
; 不自動解壓 gzip 文件,將 EXT1.GZ 整個裝入內(nèi)存 (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 啟動,則繼續(xù)處理 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 啟動,則繼續(xù)處理 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 裝入內(nèi)存 (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 啟動,則繼續(xù)處理 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 啟動,則繼續(xù)處理 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 裝入內(nèi)存 (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 啟動,則繼續(xù)處理 @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 裝入內(nèi)存 (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 啟動,則繼續(xù)處理 @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 啟動,則繼續(xù)處理 @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 裝入內(nèi)存 (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 啟動,則繼續(xù)處理 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 啟動,則繼續(xù)處理 DEF.CAB,否則直接啟動
pause --wait=0 @0#NET_.WIM is ready.
write 0x60234 20
read 0x60064 && write 0x60234 19
fallback 0 && kernel
; 菜單 [23] 內(nèi)容和 菜單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] 內(nèi)容和 菜單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 裝入內(nèi)存 (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 的內(nèi)容寫入 _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 的內(nèi)容寫入 _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
; 轉(zhuǎn) (fd2) 為 (fd0)
; 此時 (fd0) 中存放的是 SRS 文件
map --mem (fd2)+1 (fd0)
; 如果選擇了“用戶自定義菜單”,則轉(zhuǎn) (fd3) 為 (fd1)
; 此時 (fd1) 中存放的是 EXT1.GZ 中的內(nèi)容
checkrange 4 read 0x60068 || map --mem (fd3)+1 (fd1)
; 如果未選擇“用戶自定義菜單”,則設置 (fd1) 為 B.GZ 的內(nèi)容
; 此時 (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
; 調(diào)整硬盤順序,(hd7) 優(yōu)先
errorcheck off
map (hd7) (hd0)
map (hd2) (hd3)
map (hd1) (hd2)
map (hd0) (hd1)
map --hook
errorcheck on
; 進入 DOS 環(huán)境,處理文件
rootnoverify (hd0,0) && chainloader /io.sys
; 開始啟動
; boot