|
原帖由 zxw 于 2011-9-2 16:36 发表
这种方式附加文件后的批处理不能再gz压缩,否则会出错。
看来必须使用终级杀手锏了...
新的版本,没有任何限制,即使是用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 Fn.15 %a% "%0" && goto :check_next_addr
::把rd-base设置上面找到的批处理
map --rd-base=%b%
::设置rd-size长度为本批处理文件的大小.
set /a b=%b%-20
set /a b=*%b%
map --rd-size=%b%
cat --locate=\x1F\x8B --number=1 (rd)+1 | set a=
if not exist a exit
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)! |
|