Grub4dos典型菜单文件示范解读

001  terminal console
002  color white/blue blue/yellow light-red/blue light-green/black
003  default 0
004  timeout 3
005  debug off
006  # save darddrives_orig:当前磁盘数量保存到 0x6000B
007  dd  if =( md ) 2+1  of =( md ) 0x300+1  bs = count = skip = 0x75  seek = 0xb
008  clear
009 
010  # 一些变量参数信息
011  # 0x8280    boot_drive
012  # 0x82A4    0:auto gunzip,1:no auto gunzip
013  # 0x60100   0:local,1:PXE,2:ISCSI,3:ERROR
014  # 0x60008   4:/OEM_SCSI.IMG,3:/MINIPE/OEM_SRS.ZIP,2:/OEM_SRS.ZIP
015  # 0x60000   2,READ /SYSTEM.WIM
016  # 0x60004   2,READ /NET.WIM
017  # 0x60110   8bit,save root
018  # 0x6000B   harddrives_orig
019  # 0x603FB   MICROPE.ISO文件大小
020  # 0x603FF   MICROPE.ISO所在分区号
021  ################################
022  #一些常用语句介绍
023  #   write 0x60100 3             写内存命令使得内存0x60100的值为3
024  #   cat --length=0 (disk)/file  cat --length=0 用于获取文件大小,也可以用于检测文件是否存在
025  #   fallback n  如果后面的语句中有一句执行失败就跳到菜单n
026  #   kernel  未加参数的kernel,这样扫许会出错,配合fallback n来实现转菜单。
027  #   fallback F同kernel也是一个固意出错的语句。
028  #   pause --wait=0 显示后面的信息,不等待,如果wait=2就是等待2秒,如果没有--wait参数就是一直等待。
029  #   checkrange xx command1 && command2    检测command1执行返回的值是否xx,如是是就执行command2
030  #   || 如果前面的命令返回了一个失败的值,就执行后面的语句。
031  #0
032  title  [ 0 ]  Micro Windows PE  ( autocheck ) \n\r\n\t  Micro Windows PE by chenall 2009.11.11 http://www.chenall.com
033  ###########################################################
034  # GRUB4DOS 版本检测(通过一些新版的功能来检测),如果检测版本不符合就跳到第14个菜单。
035  fallback 14
036  # 关闭出错检测
037  errorcheck off
038  #(hd)是新版才有的功能,使用cat (hd)+1检测
039  cat  ( hd ) +1
040  #如果返回值是23(Error while parsing number)就代表这个版本太低了,正常情况下应该返回21
041  checkrange 23 errnum  &&  write 0x60100 3
042  #恢复
043  errorcheck on
044  #检测上面的结果,如果内存0x60100位置的值是3就说明版本不符合
045  #后面kernel不加参数,执行时会出错,配合前面的fall back(错误跳转)来实现菜单跳转
046  checkrange 3  read  0x60100  &&  kernel
047  ###########################################################
048 
049  ###########################################################
050  #PXE启动检测
051  fallback 1
052  #判断启动磁盘号,如果是0X21代表它是从PXE启动的就跳。
053  checkrange 0x21  read  0x8280  &&  kernel
054  #
055  #iSCSI启动检测,在内存512K-1024K之间查找iSCSI启动标志
056  fallback 2
057  #\x69BFT=iBFT iBFT是ISCSI启动标志(并且按16字节对齐的)具体可以参考ISCSI启动规范。
058  cat --locate = \x 69BFT --locate-align = 16  ( md ) 0x400+0x400  &&  kernel
059  #
060  fallback 3
061  #写一个值到内存位置0x60100
062  write 0x60100 0
063  pause --wait = 0 Boot MicroPE From  local  by chenall 2009.11.11
064  #文件定位##############################
065  #检测当前root下是否有指定文件,有就跳到下一菜单
066  cat --length = 0 /WXPE/WINPE.IMG  &&  kernel
067  #如果上面没有找到就全盘查找,并设置为ROOT
068  find --set-root /WXPE/WINPE.IMG  &&  kernel
069  #如果上面还是没有找到就找ISO文件
070  find --set-root /boot/MicroPE.ISO
071  #找到了ISO文件,加载这个ISO文件
072  pause --wait = 0 Boot MicroPE With /boot/MicroPE.iso......
073  #先使用普通的方式映射(比较快),如果不行就加载到内存
074  map /BOOT/MICROPE.ISO  ( hd32 )   ||  map --mem /BOOT/MICROPE.ISO  ( hd32 )
075  map --hook
076 
077  #可选语句,保存ISO文件所在分区号(用于进入PE后确定使用的ISO文件磁盘,因为有可能有多处存在)
078  cat --length = 0 /BOOT/MICROPE.ISO  &&  dd  if =( md )   of =( md )   bs = count = skip = 0x8290  seek = 0x603FB
079  root  ( hd32 )
080  cat --length = 0 /MINIPE/EXT.ZIP
081  dd  if =( md )   of =( md )   bs = count = skip = 0x829e  seek = 0x603FF
082  kernel
083 
084  #1
085  title
086  pause --wait = 0 Boot MicroPE From PXE by chenall 2009.11.11
087  pause --wait = 0 Loading WINPE.IMG ......
088  #如果内存小于120MB,直接读取(需要读两次),否则只需要读一次
089  checkrange 0x1E000:-1  read  0x8298  &&  write 0x82a4 1
090  map --mem = 0xB000 /WXPE/WINPE.IMG  ( rd )   ||  map --mem = 0xB000 /MicroPE_PXE.ISO  ( rd )
091  write 0x82a4 0
092  write 0x60100 1
093  map --mem  ( rd ) /WINPE.IMG  ( hd0 )   ||  map --mem  ( rd ) +1  ( hd0 )
094  fallback 3
095  fallback F
096 
097  #2
098  title
099  pause --wait = 0 Bootting MicroPE From iSCSI ......
100  write 0x60100 2
101  fallback 3
102  fallback F
103 
104  #3
105  title
106  pause --wait = 0 Loading WINPE.IMG and EXT.ZIP ......
107  checkrange 0,2  read  0x60100  &&  map --mem /WXPE/WINPE.IMG  ( hd0 )
108  cat --length = 0 /MINIPE/EXT.ZIP  ||  map --unmap = 0xa0
109  map  ( hd0 )   ( hd1 )   &&  pause --wait = 0
110  map  ( hd1 )   ( hd )   &&  pause --wait = 0
111  map --hook
112  #定位外置程序路径/MINIPE/EXT.ZIP,如果没有找到就启动失败
113  cat --length = 0 /MINIPE/EXT.ZIP  ||  find --set-root --ignore-floppies /MINIPE/EXT.ZIP
114  #保存当前ROOT
115  dd  if =( md )   of =( md )   bs = count = skip = 0x829c  seek = 0x60110
116  #查找OEM_SCSI.IMG和OEM_SRS.ZIP
117  errorcheck off
118  find --set-root --ignore-floppies --ignore-cd /OEM_SRS.ZIP  ||  find --set-root --ignore-floppies --ignore-cd /MINIPE/OEM_SRS.ZIP
119  checkrange 0 errnum  ||  find --set-root --ignore-floppies --ignore-cd /OEM_SCSI.IMG
120  errorcheck on
121  cat --length = 0 /OEM_SCSI.IMG  &&  write 0x60008 4
122  cat --length = 0 /MINIPE/OEM_SRS.ZIP  &&  write 0x60008 3
123  cat --length = 0 /OEM_SRS.ZIP  &&  write 0x60008 2
124  checkrange 2,3  read  0x60008  &&  dd  if =( md )   of =( md )   bs = count = skip = 0x8290  seek = 0x60010
125  checkrange 2  read  0x60008  &&  map --mem /OEM_SRS.ZIP  ( fd1 )
126  checkrange 3  read  0x60008  &&  map --mem /MINIPE/OEM_SRS.ZIP  ( fd1 )
127  checkrange 4  read  0x60008  &&  map --mem /OEM_SCSI.IMG  ( fd1 )
128  #还原ROOT
129  dd  if =( md )   of =( md )   bs = count = skip = 0x60110  seek = 0x829c  &&  root  () /MINIPE
130  map --mem  ( hd0,0 ) /EXT.IMG  ( fd2 )
131  ##如果外置程序所在磁盘的BIOS号是0-3或0x80-0x90,就把这个磁盘映射为(hd1)备用.
132  ##checkrange 0 read 0x82a0 && map ()+1 (hd)
133  ##checkrange 2 read 0x60100 && map ()+1 (hd1)
134  map --hook
135  #准备EXT.ZIP
136  cat --length = 0 /EXT.ZIP
137  dd  if =( md ) 0x41+1  of =( fd2 ) /_EXT.ZIP  bs = count = skip = 0x90
138  map --mem = 0xB000 /EXT.ZIP  ( rd )
139  dd  if =( rd ) +1  of =( fd2 ) /_EXT.ZIP  bs = seek = 4
140  pause --wait = 0 Modify configuration information
141  #以下语句用于修改CONFIG.SYS让它加载UNDI_DRV.EXE.默认不加载,使用PXE启动时通过修改特定字符让它加载.
142  checkrange 1  read  0x60100  &&  write  ( fd2 ) /config.sys devi
143 
144  #设置DOS变量(1.PXE;2.iSCSI;0.本地)
145  checkrange 2  read  0x60100  &&  write --offset = 0x0  ( hd0,0 ) /_SETENVI.BAT  \r\n set  boot = 2 \r\n
146  checkrange 1  read  0x60100  &&  write --offset = 0x0  ( hd0,0 ) /_SETENVI.BAT  \r\n set  boot = 1 \r\n
147  checkrange 0  read  0x60100  &&  write --offset = 0x0  ( hd0,0 ) /_SETENVI.BAT  \r\n set  boot = 0 \r\n
148 
149  checkrange 4  read  0x60008  &&  write --offset = 0x40  ( hd0,0 ) /_SETENVI.BAT  \r\n set  srs = OEM1 \r\n
150  #如果DEBUG开启显示DOS的启动菜单以方便错误处理
151  checkrange 2 debug  &&  write --offset = 0x14  ( fd2 ) /msdos.sys 1
152  checkrange 2 debug  &&  write --offset = 0x10  ( hd0,0 ) /_SETENVI.BAT  \r\n set  debug = 1 \r\n
153  checkrange 0  read  0x60100  &&  fallback 4
154  checkrange 0xa0:0xff  read  0x82a0  &&  fallback 15
155  checkrange 0  read  0x60100  &&  kernel
156  #把PXE启动的IP地址信息传到DOS下
157  dd  if =( md ) 0x41+1  of =( fd2 ) /IP.BIN  bs = count = 12  skip = 0x84
158  cat --length = ( hd0,0 ) /WXPE/SYSTEM/SYSTEM.WIM  ||  write 0x60000 2
159  cat --length = ( hd0,0 ) /WXPE/NET/NET.WIM   ||  write 0x60004 2
160  fallback 4
161  fallback F
162 
163 
164  #4 模块化跳转
165  title
166  fallback 5
167  checkrange 2  read  0x60000  &&  kernel
168  fallback 6
169  checkrange 2  read  0x60004  &&  kernel
170  fallback 13
171  checkrange 4  read  0x60008  &&  kernel
172  fallback 12
173  checkrange 2,3  read  0x60008  &&  kernel
174  fallback 7
175  map --mem = 0xB000 /SRS.ZIP  ( rd )   &&  kernel
176  fallback 11
177  map --mem = 0xB000 /F6.ZIP  ( rd )   &&  kernel
178  fallback 13
179  fallback F
180 
181  #5 system.wim部份
182  title
183  write 0x60000 0
184  pause --wait = 0 Loading SYSTEM.WIM......
185  map --mem = 0xB000 /SYSTEM.WIM  ( rd )
186  cat --length = ( rd ) +1
187  pause --wait = 0 Writing SYSTEM.WIM to  ( hd0,0 ) /system.bin ......
188  #写system.wim的长度信息到(hd0,0)/system.bin
189  dd  if =( md ) 0x41+1  of =( hd0,0 ) /system.bin  bs = count = skip = 0x90
190  #写SYSTEM.WIM文件内容到(hd0,0)/system.bin(从第4个字节开始写),如果写入成功就设置一个变量
191  dd  if =( rd ) +1  of =( hd0,0 ) /system.bin  bs = seek = &&  write --offset = 0x20  ( hd0,0 ) /_SETENVI.BAT  \r\n set  system = 1 \r\n
192  fallback 4
193  fallback F
194 
195  #6 net.wim部份,语句功能请参考上面
196  title
197  write 0x60004 0
198  pause --wait = 0 Loading @0#net.wim......
199  map --mem = 0xB000 /AUTORUNS/@0#NET.WIM  ( rd )
200  cat --length = ( rd ) +1
201  pause --wait = 0 Writing @0#net.wim to  ( hd0,0 ) /net.bin......
202  dd  if =( md ) 0x41+1  of =( hd0,0 ) /net.bin  bs = count = skip = 0x90
203  dd  if =( rd ) +1  of =( hd0,0 ) /net.bin  bs = seek = &&  write --offset = 0x30  ( hd0,0 ) /_SETENVI.BAT  \r\n set  net = 1 \r\n
204  fallback 4
205  fallback F
206 
207  #7 检查是否存在外置驱动包,如果有的话自动加载.(SRS.ZIP)
208  title
209  fallback 8
210  pause --wait = 0 Loading SRS.ZIP......
211  cat --length = ( rd ) +1
212  dd  if =( md ) 0x41+1  of =( fd2 ) /_SRS.ZIP  bs = count = skip = 0x90
213  dd  if =( rd ) +1  of =( fd2 ) /_SRS.ZIP  bs = seek = 4
214  write --offset = 0x40  ( hd0,0 ) /_SETENVI.BAT  \r\n set  srs = SRS \r\n
215  fallback F
216 
217  #8
218  title
219  #如果内存大于500MB就设置一个变量(用于自动把镜像转到128MB).需开启高级功能才生效
220  checkrange 512  read  0x60108  &&  write --offset = 0x50  ( hd0,0 ) /_SETENVI.BAT  \r\n set  to128 = 1 \r\n
221  dd  if =( md ) 0x300+2  of =( hd0,0 ) /_SETENVI.BAT  bs = count = skip = 0x3FB  seek = 0x7FB  &&  pause --wait = 0
222  map  ( fd2 )   ( fd0 )
223  map --unmap = 2
224  map --rehook
225 
226  checkrange 2 debug  &&  pause Press any key to  continue  . . .
227  pause --wait = 0 Booting...  &&  chainloader  ( fd0 ) /io.sys
228 
229  #9
230  title  [ 9 ]  SET DEBUG mode \n\r\n\t Trun on/off debug level
231  write 0x60104 0
232  checkrange 2 debug  &&  write 0x60104 2
233  checkrange 2  read  0x60104  &&  debug off
234  checkrange 0  read  0x60104  &&  debug on
235  clear
236  checkrange 2 debug  &&  pause Debug is now on ...
237  checkrange 0 debug  &&  pause Debug is now off ...
238 
239  #10
240  title  [ 10 ]  Enable advanced mode  ( test )
241  write 0x6010c 888
242  checkrange 0x7d000:-1  read  0x8298  &&  write 0x60108 512
243  pause Advanced Mode is enabled
244 
245  #11
246  title
247  fallback 8
248  pause --wait = 0 Loading F6.ZIP......
249  cat --length = ( rd ) +1
250  dd  if =( md ) 0x41+1  of =( fd2 ) /_SRS.ZIP  bs = count = skip = 0x90
251  dd  if =( rd ) +1  of =( fd2 ) /_SRS.ZIP  bs = seek = 4
252  write --offset = 0x40  ( hd0,0 ) /_SETENVI.BAT  \r\n set  srs = F6 \r\n
253  map --mem  ( fd2 ) /bat/F6.gz  ( fd1 )
254  map --hook
255  fallback F
256 
257  #12
258  title
259  fallback 8
260  pause --wait = 0 Loading OEM_SRS.ZIP......
261  dd  if =( md ) 0x300+2  of =( fd2 ) /_SRS.ZIP  bs = count = skip = 0x10
262  dd  if =( fd1 )   of =( fd2 ) /_SRS.ZIP  bs = seek = 4
263  write --offset = 0x40  ( hd0,0 ) /_SETENVI.BAT  \r\n set  srs = OEM \r\n
264  map --mem  ( fd2 ) /bat/F6.gz  ( fd1 )
265  map --hook
266  fallback F
267 
268  #13
269  title
270  fallback 8
271  checkrange 1,2  read  0x60100  &&  kernel
272  map  ( fd2 )   ( fd0 )
273  map --unmap = 2
274  map --rehook  &&  configfile  ( fd0 ) /menu.lst
275  fallback F
276 
277  #14
278  title
279  pause --wait = 0 Error!
280  pause GRUB4DOS Version mismatched!
281 
282  #15
283  title
284  #如果虚拟光驱中,设置一个变量,使得启动时优先使用光驱或ISO上的外置程序.
285  fallback 4
286  write --offset = 0x60  ( hd0,0 ) /_SETENVI.BAT  \r\n set  CDROMEX_ = 1 \r\n
287  read  0x603fb  &&  kernel
288  #获取虚拟ISO文件的大小.
289  map  ()   ( hd30 )
290  map --hook
291  cat --length = ( hd30 ) +1
292  checkrange 0xfb0400  read  0x82b0  &&  kernel
293  dd  if =( md )   of =( md )   bs = count = skip = 0x82b0  seek = 0x60110
294  dd  if =( md )   of =( md )   bs = count = skip = 0x8290  seek = 0x60114
295  dd  if =( md ) 0x300+2  of =( hd0,0 ) /_SETENVI.BAT  bs = count = skip = 0x110  seek = 0x7F0
296  map  ( hd30 )   ( hd30 )
297  map --hook
298  fallback F
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值