0PE专用菜单文件MENU.0PE解读(二) 批处理篇
来源:互联网 发布:js hidden input 赋值 编辑:程序博客网 时间:2024/06/06 09:22
继续看 0PE 的批处理文件
http://bbs.wuyou.com/forum.php?mod=viewthread&tid=148300&page=1&authorid=187169
整个 0PE 的菜单 2 楼已经补充完整了,继续看看 0PE 的批处理。
批处理语句基本能看懂,就是流程太复杂了,转来转去的,看不太懂,只能理解个大概,错误的地方请 Pseudo 大侠指正。
这里接着 2 楼的菜单继续启动,现在已经进入 DOS 了,由 autoexec.bat 调用 autoexe0.bat 来处理 PE 文件,内容如下:
autoexe0.bat:
--------------------------------------------------------------------------------
@echo off
:: 设置环境变量
CALL BAT\_ENV.BAT
del BAT\_ENV.BAT
:: 是否进入 DOS
if "%SYS.VER%"=="DOS" goto :dos
:: 不进入 DOS,则设置 PATH 变量
path c:\;c:\bin;c:\bat
:: 执行 0PE 补丁程序(如果有的话)
if exist bin\0pepatch.bat call 0pepatch.bat
:: 删除 config.sys(不再需要)
del config.sys
:: 这些已经在软盘里面了,可以删除了
>nul del A.GZ
>nul del F6.GZ
>nul if not "%MENU.USR%"=="1" del B.GZ
:: 创建临时目录
md c:\TEMP
set temp=c:\TEMP
:: 如果不进入 DOS,则转道 start 启动
if not "%SYS.VER%"=="DOS" goto :start
:: 启动 DOS
:dos
:: 删除无用目录
>nul deltree /y bat
>nul deltree /y buf
>nul deltree /y bin
>nul deltree /y wxpe
>nul deltree /y temp
:: 删除无用文件
del config.sys
>nul del A.GZ
>nul del B.GZ
>nul del F6.GZ
del deltree.com
del autoexec.bat
:: 启动完毕
cls
goto :end
:Start
:: 清空 autoexec.bat
>autoexec.bat echo.
:: 从 _KERNEL.ZIP 中获取 KERNEL.ZIP
cd C:\BUF
call grtrim.bat KERNEL.ZIP
:: 解压 KERNEL.ZIP 到根目录,并删除 KERNEL.ZIP
cd c:\
if exist C:\BUF\KERNEL.ZIP pkunzip -od C:\BUF\KERNEL.ZIP>NUL
if exist C:\BUF\KERNEL.ZIP del C:\BUF\KERNEL.ZIP
:: 复制 Kernel 目录中的所有文件到 C:\ 根目录,并删除 Kernel 目录
:: 为什么不直接压缩到 KERNEL.ZIP 的根目录中,直接解压,还要这样转移一次?
>nul xcp /m c:\KERNEL\*.* c:\ /H /S /Y /R /Q
>nul deltree /y c:\KERNEL
:: 继续启动 autoexe1.bat
autoexe1.bat
:end
--------------------------------------------------------------------------------
autoexe1.bat:
--------------------------------------------------------------------------------
@echo off
:: 如果不是启动用户自定义菜单,则启动 PE
if not "%MENU.USR%"=="1" goto PE
:: 复制 MENUUSR.bat 到 A 盘
>nul xcp /m /y c:\bat\MENUUSR.bat a:\MENUUSR.bat
:: 执行 MENUUSR.bat
a:\MENUUSR.bat
goto :end
:: 启动 PE
:PE
cd C:\BUF
:: 如果不是从 PXE 启动,则删除 _NETMAP.TXT _NETID.TXT _DEF.CAB
if "%BTM%"=="PXE" goto :L1
for %%i in (_NETMAP.TXT _NETID.TXT _DEF.CAB) do if exist %%i del %%i
:: 如果不是从 ISO 启动,则删除 _EXT2.WIM _NET.WIM
if "%BTM%"=="ISO" goto :L1
for %%i in (_EXT2.WIM _NET.WIM) do if exist %%i del %%i
:L1
:: 获取 NETMAP.TXT NETID.TXT DEF.CAB NET.WIM EXT2.WIM 文件(处理由 Grub4Dos 转移进来的文件)
for %%i in (NETMAP.TXT NETID.TXT DEF.CAB NET.WIM EXT2.WIM) do call grtrim.bat %%i
:: 删除 auoexe0.bat,不再需要
cd C:\
del autoexe0.bat
:: 继续启动 auto_exe.bat
call auto_exe.bat
:end
--------------------------------------------------------------------------------
auto_exe.bat :
--------------------------------------------------------------------------------
@echo off
:: 全局变量%scsiImg%、%OEMF6%、%EXT1%、%config%、%MP%, etc.
:: 如果 PEISO 不为空,则将 set PEISO=%PEISO%的值 写入 C:\WXPE\setPEISO.cmd
:: 注:PEISO = 0PE.ISO 的相对存放位置,由 GRUB4DOS 传入DOS
if not "%PEISO%"=="" echo set PEISO=%PEISO%>C:\WXPE\setPEISO.Cmd
:: 如果 PEISO 不为空,则 ??
if exist C:\WXPE\setPEISO.cmd str C:\WXPE\setPEISO.cmd 0 0 /R /ASC:/ /ASC:\ /A>nul
:: 如果 "%BTM%"=="ISO" 则创建 C:\WXPE\BTMISO 空文件
if "%BTM%"=="ISO" echo.>C:\WXPE\BTMISO
:: 将 set SYS.VER=%SYS.VER%的值 写入到 C:\WXPE\setOSVER.cmd
echo set SYS.VER=%SYS.VER%>C:\WXPE\setOSVER.cmd
:: 如果不是 PXE 启动,也不是 ISO 启动,则跳转到 NOSERVER
set Tftp_Server=
if not "%BTM%"=="PXE" if not "%BTM%"=="ISO" goto :NOSERVER
:: 否则复制文件到相应位置
>nul if exist c:\buf\EXT2.WIM xcp /m c:\buf\EXT2.WIM c:\0PE\%SYS.VER%\EXT2.WIM
>nul if exist c:\buf\NET.WIM xcp /m c:\buf\NET.WIM c:\0PE\AutoRuns\@0#NET.WIM
:: 如果是 ISO 启动,则跳转到 NOSERVER
if "%BTM%"=="ISO" goto :NOSERVER
:: ??
>nul undipd 0x60
:: 设置 FTP 服务器地址
call setip.bat
:: 如果 Tftp_Server 为空,则跳转到 NOSERVER
if "%Tftp_Server%"=="" goto :NOSERVER
:: 将 set Tftp_Server=%Tftp_Server% 写入 C:\WXPE\setTFTPD.cmd
>C:\WXPE\setTFTPD.cmd echo set Tftp_Server=%Tftp_Server%
:NOSERVER
Cls
:: 设置变量 status
if "%EXT1%"=="TRUE" set status=EXT1.GZ: Ready
if not "%EXT1%"=="TRUE" set status=EXT1.GZ: None
if "%scsiImg%"=="TRUE" set status=%status%, SRS*.ZIP: Ready
if "%OEMF6%"=="TRUE" set status=%status%, F6.ZIP: Ready
if not "%scsiImg%"=="TRUE" if not "%OEMF6%"=="TRUE" set status=%status%, SRS: None
:: 显示 0PE 菜单选择窗口 (WBAT 窗口)
if "%scsiImg%"=="TRUE" call w.bat box @c:\bat\wbat.txt:cc #5,3
if "%OEMF6%"=="TRUE" call w.bat box @c:\bat\wbat.txt:cc #5,3
if not "%scsiImg%"=="TRUE" if not "%OEMF6%"=="TRUE" call w.bat box @c:\bat\wbat.txt:cc #4,3
set status=
:: 处理选择
:: 从 XP 系统获取 SRS 驱动
IF "%WBAT%"=="1" set config=N_SCSI
:: 从 ZIP 中获取 SRS 驱动
IF "%WBAT%"=="2" set config=SCSI
:: 启动到 DOS
IF "%WBAT%"=="3" set config=DOS
:: 清除 CMOS 密码
IF "%WBAT%"=="4" set config=DELCMOS
:: 是否多核
set MP=ENABLE
IF "%wcb1%"=="1" set MP=DISABLE
:: 保存日志
set REPORT=FALSE
IF "%wcb2%"=="1" set REPORT=TRUE
:: 正常启动 PE
set MANUALSTART=FALSE
IF "%wcb3%"=="1" set MANUALSTART=TRUE
SET WBAT=
SET wcb1=
set wcb2=
set wcb3=
goto :%config%
:DOS
:: 进入 DOS
goto end
:DELCMOS
:: 清除 CMOS 密码
DELCMOS.com
echo CMOS password has been cleared, reboot system please!
goto end
:N_SCSI
:SCSI
:: 将 SRS 装载到虚拟软盘
call auto.bat
:: 消除莫名其妙的报txtsetup.sif某行错
>nul XCP.COM c:\wxpe\txtsetup.sif c:\wxpe\txtsetup.sjf /H
del c:\wxpe\txtsetup.sif
ren c:\wxpe\txtsetup.sjf txtsetup.sif
if "%OEMF6%"=="TRUE" IF not "%config%"=="N_SCSI" goto KEEPFD0
:: 卸载 (fd0), (fd1), (fd2), 光驱
>>0pemenu.lst echo map --unmap=0,1,2,0x81:0xff
goto REHOOK
:KEEPFD0
:: 卸载 (fd1), (fd2), 光驱
>>0pemenu.lst echo map --unmap=1,2,0x81:0xff
:REHOOK
:: 使 map 结果生效
>>0pemenu.lst echo map --rehook
>>0pemenu.lst echo map --hook=0x80
:: 设置 (hd0,0)/setupldr.bin 为启动文件
>>0pemenu.lst echo chainloader (hd0,0)/setupldr.bin
:: 判断是否删除 c:\HDdrv
IF "%MANUALSTART%"=="TRUE" goto L1
IF "%DEBUGON%"=="1" goto L1
:: 删除 c:\HDdrv 目录
>nul deltree /Y c:\HDdrv
:L1
:: 清理文件目录
>nul UNDIPD.COM -u
>nul deltree /Y c:\bat
>nul deltree /Y c:\bin
>nul deltree /Y c:\BUF
del c:\deltree.com
:: 判断是否显示 Debug 信息
IF "%MANUALSTART%"=="TRUE" goto PRMPT
IF "%DEBUGON%"=="1" goto PRMPT
:: 直接启动 PE
startPE.bat
:PRMPT
:: 显示变量值
echo DEBUGON=%DEBUGON%,config=%config%,PEISO=%PEISO%,EXT1=%EXT1%,scsiImg=%scsiImg%,OEMF6=%OEMF6%,F6DEF=%F6DEF%,Tftp_Server=%Tftp_Server%
echo xpres=%xpres%,xpdrv=%xpdrv%,xpdir=%xpdir%,MP=%MP%,SYS.VER=%SYS.VER%
:: 显示 c:\HDDRV 所有文件列表
if exist c:\HDDRV\nul dir /a-d c:\HDDRV
:: 启动 PE
IF "%DEBUGON%"=="1" pause
IF "%DEBUGON%"=="1" startPE.bat
echo Note: You can then start PE by typing "startPE".
:end
--------------------------------------------------------------------------------
startPE.bat:
--------------------------------------------------------------------------------
@echo off
c:
cd \
:: 0pemenu.lst 是动态创建的
if not exist 0pemenu.lst goto quit
:: 清理文件
del io.sys
del autoexe1.bat
del auto_exe.bat
del command.com
if exist a:\_SRS.ZIP del a:\_SRS.ZIP
>nul copy /y grub.exe a:\grub.exe
del grub.exe
:: 启动 PE (借助 GRUB4DOS)
a:\grub --config-file=c:\0pemenu.lst
:: 出错后转到这里
:quit
echo.
echo Sorry, PE not ready to start.
--------------------------------------------------------------------------------
上面的还不是核心,只是流程,核心文件在 KERNEL\BAT 里面,文件列表如下:
auto.bat
check.bat
chknet.bat
CHKPCI.BIN
cpy.bat
drivers.txt
drvSif.bat
F6AUTO.bat
MENUUSR.bat
MP.SIF
REPORT.bat
SCSI.BAT
SCSI_DRV.EXE
setip.bat
system32.txt
tftpget.bat
userdl.bat
wbat.txt
xcpbat.bat
希望 Pseudo 大侠有时间的话给大家解读一下这些脚本,这些脚本里面有太多判断和跳转,又牵扯到很多环境变量,如果不整体把握是很难读懂的,我就是被那些环境变量和跳转给搞晕了,看不懂了。
0 0
- 0PE专用菜单文件MENU.0PE解读(二) 批处理篇
- 0PE的专用菜单文件MENU.0PE解读 (一)
- 0PE内置菜单解读(NB版) NB版0PE内置菜单解读
- PE文件(二)
- PE文件解读
- PE文件结构(PE文件头二)
- PE文件初探二
- PE文件结构(二)
- PE文件详解二
- 深入剖析PE文件(二)
- 编写PE文件解析器(二)
- PE文件-PE文件格式
- PE文件结构详解<二>
- PE文件(一)
- PE文件(三)
- 【VC6.0】文件操作,读取PE文件
- PE文件解析器的编写(二)——PE文件头的解析
- PE(二)
- jquery validate使用和扩展规则,jqueryvalidate
- 吝啬的国度 nyoj
- HDU1708 Fibonacci String【水题】
- C# 调用C++ DLL 总结
- Linux 下安装Eclipse
- 0PE专用菜单文件MENU.0PE解读(二) 批处理篇
- 大话设计模式C++实现-第20章-迭代器模式
- HDU1718 Rank【水题】
- HDU_1010 Tempter of the Bone[DFS]
- Java EE HTML5 WebSocket 示例【转自http://www.oschina.net/translate/java-ee-html5-websocket-example】
- 判断一个字符串是否是由字母组成
- 算法导论学习笔记(3)-习题2.3-7-排序+二分
- 架构与反射——Struts2开发过程与处理流程解析
- CentOS-6.3安装Mysql-5.5.29