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