|
再上传了一个...
只是修改了内嵌文件的读取方法..更先进一点,代码也更复杂一些.
但是代码基本上是固定的,直接复制即可使用.
新的方案无需读取两次这个批处理文件,而是直接从内存中读取目前正在运行中的批处理文件...
另: 不管使用什么方法,都要求这个批处理文件是在磁盘上,不可以使用INSMOD加载这个批处理,否则就会失败.
::echo %@time% $[0107]Loading inline file $[0102]F6.GZ......
::从0x1400000处开始查找
set b=0x1400000
:check_next_addr
set /A b=%b%+0x40
::查找正在运行的批处理文件地址位置.在0x1400000 - 0x1600000 之间查找
cat --locate=!BAT --number=1 --locate-align=0x10 --skip=%b% (md)+0xB000 | set a=
if not exist a && exit
::找到了
set /A b=0x%a%
::确定是否需要的.
::以下两句,大家可以不必理会,真想弄明白为什么,需要研究一下GRUB4DOS的程序运行机制.
::就是在PSP中查找执行的命令行.
set /A a=%b%-0x10
set /A a=%b%-*%a%
::调用函数strcmp比较,如果成功返回0,代表找到的就是目前正在运行的批处理.
::如果是直接运行的批处理,正常情况下第一次就可以找到了.由几个批处理调用的就需要找几次.
call #15 %a% "%0" && goto :check_next_addr
::把rd-base设置上面找到的批处理
map --rd-base=%b%
::设置rd-size长度为本批处理文件的大小.
cat --length=0 %0
map --rd-size=%@retval%
cat --locate=\x1F\x8B --number=1 (rd)+1 | set a=
calc *0x82d0=*0x82d0+0x%a%
calc *0x82d8=*0x82d8-0x%a%
::echo %@time% $[0107]map inline file $[0102]F6.GZ $[0107]at $[0102]%b% $[0107]to driver $[0102](rd)!
虽然代码是长了一些,但是这些代码不必做任何改动就可以直接应用了.
其它说明:
1. 附加的文件是GZ格式.
2. 可以直接使用copy /b的方法附加这个GZ文件.
3. 如果想直接编辑批处理建议使用NOTEPAD2,有高亮语法,并且修改了批处理文件内容保存时不会影响到附加的文件.
4. 本脚本限制了批处理+附加文件的大小不可以超过2M,需要的话自己修改(md)+0xB000 的值.
5. 一般情况下,某个批处理执行时它的文件内容在0X1400000地址处可以找到,如果是批处理或其它程序再调用批处理则延后.
这个新的方案,对于喜欢附加比较大的文件的朋友来说是个福音,因为取附加的文件时不需要再读批处理文件.
忘了说一下,新的代码需要最新版本GRUB4DOS才可以使用,否则会提示出错.
2011-08-25版的GRUB4DOS修正了CAT命令的一个BUG. 因为很少使用,所以没有人发现这个BUG..
[ 本帖最后由 chenall 于 2011-8-25 23:30 编辑 ] |
|