Bash语言:
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 = 1 count = 1 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 = 1 count = 4 skip = 0x8290 seek = 0x603FB
079 root ( hd32 )
080 cat --length = 0 /MINIPE/EXT.ZIP
081 dd if =( md ) of =( md ) bs = 1 count = 1 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 = 1 count = 8 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 = 1 count = 4 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 = 1 count = 8 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 = 1 count = 4 skip = 0x90
138 map --mem = 0xB000 /EXT.ZIP ( rd )
139 dd if =( rd ) +1 of =( fd2 ) /_EXT.ZIP bs = 1 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 = 1 count = 12 skip = 0x84
158 cat --length = 0 ( hd0,0 ) /WXPE/SYSTEM/SYSTEM.WIM || write 0x60000 2
159 cat --length = 0 ( 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 = 0 ( 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 = 1 count = 4 skip = 0x90
190 #写SYSTEM.WIM文件内容到(hd0,0)/system.bin(从第4个字节开始写),如果写入成功就设置一个变量
191 dd if =( rd ) +1 of =( hd0,0 ) /system.bin bs = 1 seek = 4 && 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 = 0 ( 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 = 1 count = 4 skip = 0x90
203 dd if =( rd ) +1 of =( hd0,0 ) /net.bin bs = 1 seek = 4 && 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 = 0 ( rd ) +1
212 dd if =( md ) 0x41+1 of =( fd2 ) /_SRS.ZIP bs = 1 count = 4 skip = 0x90
213 dd if =( rd ) +1 of =( fd2 ) /_SRS.ZIP bs = 1 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 = 1 count = 5 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 = 0 ( rd ) +1
250 dd if =( md ) 0x41+1 of =( fd2 ) /_SRS.ZIP bs = 1 count = 4 skip = 0x90
251 dd if =( rd ) +1 of =( fd2 ) /_SRS.ZIP bs = 1 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 = 1 count = 4 skip = 0x10
262 dd if =( fd1 ) of =( fd2 ) /_SRS.ZIP bs = 1 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 = 0 ( hd30 ) +1
292 checkrange 0xfb0400 read 0x82b0 && kernel
293 dd if =( md ) of =( md ) bs = 1 count = 4 skip = 0x82b0 seek = 0x60110
294 dd if =( md ) of =( md ) bs = 1 count = 4 skip = 0x8290 seek = 0x60114
295 dd if =( md ) 0x300+2 of =( hd0,0 ) /_SETENVI.BAT bs = 1 count = 8 skip = 0x110 seek = 0x7F0
296 map ( hd30 ) ( hd30 )
297 map --hook
298 fallback F
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 = 1 count = 1 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 = 1 count = 4 skip = 0x8290 seek = 0x603FB
079 root ( hd32 )
080 cat --length = 0 /MINIPE/EXT.ZIP
081 dd if =( md ) of =( md ) bs = 1 count = 1 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 = 1 count = 8 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 = 1 count = 4 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 = 1 count = 8 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 = 1 count = 4 skip = 0x90
138 map --mem = 0xB000 /EXT.ZIP ( rd )
139 dd if =( rd ) +1 of =( fd2 ) /_EXT.ZIP bs = 1 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 = 1 count = 12 skip = 0x84
158 cat --length = 0 ( hd0,0 ) /WXPE/SYSTEM/SYSTEM.WIM || write 0x60000 2
159 cat --length = 0 ( 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 = 0 ( 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 = 1 count = 4 skip = 0x90
190 #写SYSTEM.WIM文件内容到(hd0,0)/system.bin(从第4个字节开始写),如果写入成功就设置一个变量
191 dd if =( rd ) +1 of =( hd0,0 ) /system.bin bs = 1 seek = 4 && 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 = 0 ( 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 = 1 count = 4 skip = 0x90
203 dd if =( rd ) +1 of =( hd0,0 ) /net.bin bs = 1 seek = 4 && 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 = 0 ( rd ) +1
212 dd if =( md ) 0x41+1 of =( fd2 ) /_SRS.ZIP bs = 1 count = 4 skip = 0x90
213 dd if =( rd ) +1 of =( fd2 ) /_SRS.ZIP bs = 1 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 = 1 count = 5 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 = 0 ( rd ) +1
250 dd if =( md ) 0x41+1 of =( fd2 ) /_SRS.ZIP bs = 1 count = 4 skip = 0x90
251 dd if =( rd ) +1 of =( fd2 ) /_SRS.ZIP bs = 1 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 = 1 count = 4 skip = 0x10
262 dd if =( fd1 ) of =( fd2 ) /_SRS.ZIP bs = 1 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 = 0 ( hd30 ) +1
292 checkrange 0xfb0400 read 0x82b0 && kernel
293 dd if =( md ) of =( md ) bs = 1 count = 4 skip = 0x82b0 seek = 0x60110
294 dd if =( md ) of =( md ) bs = 1 count = 4 skip = 0x8290 seek = 0x60114
295 dd if =( md ) 0x300+2 of =( hd0,0 ) /_SETENVI.BAT bs = 1 count = 8 skip = 0x110 seek = 0x7F0
296 map ( hd30 ) ( hd30 )
297 map --hook
298 fallback F