无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: chenall
打印 上一主题 下一主题

[原创] 抛砖引玉,一个动态生成SRS软盘的简单脚本(2011-09-27)

[复制链接]
151#
 楼主| 发表于 2011-8-25 14:33:17 | 只看该作者

回复 #150 jh1688 的帖子

那肯定是GRUB4DOS版本不对.可能是你的硬盘上的GRUB4DOS版本太多了混乱了.
自己看一下GRUB4DOS启动的标题日期.




新的版本已经上传,自己测试基本没有发现问题.有多个SRS驱动的版或NVRAID的版的可以测试一下,看看能否驱动(不按F6)

相对于昨天晚上上传的测试版的改变

,稍微修改了一下脚本.把F6.GZ内置到脚本中.

最新的版本演示了最新版GRUB4DOS函数调用方法,还有批处理附加文件的新方案.

新的附加文件方法,一劳永逸,有兴趣的可以研究一下.

[ 本帖最后由 chenall 于 2011-8-25 14:36 编辑 ]
回复

使用道具 举报

152#
发表于 2011-8-25 14:38:52 | 只看该作者
我测试了多个SRS  使用没问题,不需要按F6  很爽,这样我可以做出最牛的外置驱动的PE

但是我看里面怎么是乱码呢?

::::addon_img:::::::::::::::
?苻UN F6.IMG 碡[email=?@0]?@0[/email]嗎/鐃*w&PR+ht:姹?Lプd儴\fH?c<飔間紊偷?踺沟娭eF!u琼C      蚺
回复

使用道具 举报

153#
发表于 2011-8-25 14:49:29 | 只看该作者
嘻嘻,又捡了一招。
*0x82d0 是偏移吧?
*0x82d8 是长度吧?
可以改进封装版的写法了。

[ 本帖最后由 zxw 于 2011-8-25 14:52 编辑 ]
回复

使用道具 举报

154#
发表于 2011-8-25 15:07:40 | 只看该作者
原帖由 chenall 于 2011-8-25 14:33 发表
那肯定是GRUB4DOS版本不对.可能是你的硬盘上的GRUB4DOS版本太多了混乱了.
自己看一下GRUB4DOS启动的标题日期.




新的版本已经上传,自己测试基本没有发现问题.有多个SRS驱动的版或NVRAID的版的可以测试一 ...

C大,不好意思,是我原来用的版本低了一档,换成0823就可以了。

动态虚拟软驱几乎可以装系统了,只是第二次启动装到34分钟左右,好像在检测硬件时蓝屏,重启……

顺便说一下,我没有用到F6键,原版的XP3……

[ 本帖最后由 jh1688 于 2011-8-25 15:09 编辑 ]
回复

使用道具 举报

155#
 楼主| 发表于 2011-8-25 15:08:20 | 只看该作者

回复 #152 21212121 的帖子

后面的乱码是正常的,我把F6.GZ附加到批处理后面了,反正很小.

嘻嘻,这个F6.GZ经过特殊处理,删除了没有用的扇内容,压一下才104个字节.

@zxw
0x82d0就是rd_base
0x82d8是rd_size
也可以使用
map --rd-base=xxx --rd-size=yyyy的形式比较直观,但需要多一个计算.

这个附加方案是比较简单的,只附加了一个文件.
使用这个方法甚至可以附加N个文件.

并且修改了附加文件的内容也不需要改代码.因为是动态提取的.

[ 本帖最后由 chenall 于 2011-8-25 15:10 编辑 ]
回复

使用道具 举报

156#
 楼主| 发表于 2011-8-25 15:09:27 | 只看该作者

回复 #154 jh1688 的帖子

汗,目前这个不支持安装系统的说..
回复

使用道具 举报

157#
发表于 2011-8-25 15:13:49 | 只看该作者
原帖由 chenall 于 2011-8-25 15:09 发表
汗,目前这个不支持安装系统的说..

我知道!!就是忍不住想试一下,基本上可用,初时的xxxxxxxxx7B现象没有了,第二次ISO文件也能正常载入,并进入安装过程,只是到了检测硬件时(34分钟左右),蓝屏一闪跳出,重启系统……如此反复……这些都是在实机上做的……
回复

使用道具 举报

158#
发表于 2011-8-25 15:21:28 | 只看该作者

回复 #155 chenall 的帖子

!BATEX  By zhaohj 2011.07.12
setlocal
set *
debug off
color white/blue blue/yellow light-red/blue 10
#使用说明
#  SRSF6.BAT /SRS             <-SRSF6.BAT放在command默认路径下,驱动文件放在任何盘的/SRS下
#  SRSF6.BAT /SRSF6/          <-SRSF6.BAT放在command默认路径下,驱动文件放在任何盘的/SRSF6下
# (bd)/BOOT/SRSF6.BAT /SRSF6  <-SRSF6.BAT放在启动设备的BOOT目录下,驱动文件放在任何盘的/SRSF6下
#--------
#参数说明:
#   fd3     SRSF6.IMG
#   0x60030 firadisk与wvblk切换
#   0x60040 x86与x64切换
#   0x60050 驱动类型
#   0x60060、0x60070保存驱动所在设备
#   0x60080 debug
#判断grubd4os版本是否支持
checkrange 20110714:-1 read 0x8278 || clear && echo Grub4Dos Version Too Old. && echo You should use grub4dos-0.4.5b-2011-06-19 or above from && pause http://code.google.com/p/grub4dos-chenall/downloads/list && exit
echo Loading SRSF6 Tool ...
map --unmap=0:3
map --rehook
map --mem=0x10000 %~f0 (rd)
map --mem (rd)3+265,135535 (fd3)
map --hook
echo Finish loading SRSF6 .
insmod (fd3)/EXT/GRUB4DOS.MOD
FAT del (fd3)/EXT/GRUB4DOS.MOD
set /u SRS=%~pnx1
if exist SRS && if not %SRS:~-1%==/ set SRS=%SRS%/
if not exist SRS set SRS=/SRS/

以上是zhaohj的srsf6模块中的内容,每次修改了附加文件都要改size,按照老大你的这个0x82d0就是rd_base 0x82d8是rd_size ,怎么改,才能动态读取,不用每次改续尾文件大小(见蓝色处),而不影响原有功能。
回复

使用道具 举报

159#
发表于 2011-8-25 15:31:57 | 只看该作者
@tingyue-wu:
不一样的,C大的f6.gz是固定不变的。
回复

使用道具 举报

160#
发表于 2011-8-25 15:39:04 | 只看该作者
原帖由 chenall 于 2011-8-25 15:08 发表
后面的乱码是正常的,我把F6.GZ附加到批处理后面了,反正很小.

嘻嘻,这个F6.GZ经过特殊处理,删除了没有用的扇内容,压一下才104个字节.

@zxw
0x82d0就是rd_base
0x82d8是rd_size
也可以使用
map --rd-ba ...



我不建议附件到批处理,因为这样以后修改容易很出问题。还是建议分开存放比较好
回复

使用道具 举报

161#
发表于 2011-8-25 15:39:51 | 只看该作者

回复 #159 zhaohj 的帖子

这样啊    ……………………………………………………
回复

使用道具 举报

162#
发表于 2011-8-25 15:54:47 | 只看该作者

回复 #158 tingyue-wu 的帖子

map --mem (rd)3+265,135535 (fd3)
改为如下就行了:
cat --locate=\x1f\x8b --number=1 (rd)+1 | set a=
calc *0x82d0=*0x82d0+0x%a% && calc *0x82d8=*0x82d8-0x%a%
map --mem (rd)+1 (fd3)
=================================
注意不要用记事本直接修改。
附件要用gz压缩。

回复 #159 zhaohj 的帖子
你错了,我已修改成功。
原帖由 chenall 于 2011-8-25 15:08 发表
@zxw
0x82d0就是rd_base
0x82d8是rd_size
也可以使用
map --rd-base=xxx --rd-size=yyyy的形式比较直观,但需要多一个计算.

这个附加方案是比较简单的,只附加了一个文件.
使用这个方法甚至可以附加N个文件.

并且修改了附加文件的内容也不需要改代码.因为是动态提取的.
...

[ 本帖最后由 zxw 于 2011-8-25 16:01 编辑 ]
回复

使用道具 举报

163#
发表于 2011-8-25 16:08:17 | 只看该作者
哇,原来是修改这里啊。因为img文件修改,肯定要重新导入的,也算省一点事吧。
回复

使用道具 举报

164#
发表于 2011-8-25 16:18:46 | 只看该作者

回复 #162 zxw 的帖子

谢谢 我用fb直接修改

回复 #163 zhaohj 的帖子

你没我看的仔细 呵呵 我说能改吧
回复

使用道具 举报

165#
发表于 2011-8-25 16:23:35 | 只看该作者

回复 #164 tingyue-wu 的帖子

fbt修改的也可以这样,更新尾续文件不用修改红色处数字(后面的空格注意要保留):
map --mem (rd)3+97,49615            (fd3) || clear
if not exist (fd3)+1 call :fix %~f0 (fd3)
map --hook
……
:fix
cat --locate=!BAT (rd)+1 >> (md)+1,1
dd if=(rd) of=(md) bs=1 count=0x200 skip=%?% seek=0x60000 >> (md)+1,1
set /a a=*0x60020
set /a b=*0x60024
set /a c=%b%-1/0x200+1
set a=%a%+%c%,%b%
map --mem (rd)%a% %2
cat --locate=(rd) --number=2 (rd)+1 >> (md)+1,1
set /A b=%?%+4
write --offset=%b% %1 %a% >> (md)+1,1
set *
exit


[ 本帖最后由 zxw 于 2011-8-25 16:24 编辑 ]
回复

使用道具 举报

166#
发表于 2011-8-25 16:48:37 | 只看该作者

回复 #165 zxw 的帖子

改为如下就行了:
cat --locate=\x1f\x8b --number=1 (rd)+1 | set a=
calc *0x82d0=*0x82d0+0x%a% && calc *0x82d8=*0x82d8-0x%a%
map --mem (rd)+1 (fd3)
=================================
出错error 28:selected item cannot fit into memory

fbt修改的也可以这样,更新尾续文件不用修改红色处数字(后面的空格注意要保留):
map --mem (rd)3+97,49615            (fd3) || clear
if not exist (fd3)+1 call :fix %~f0 (fd3)
map --hook
……
:fix
cat --locate=!BAT (rd)+1 >> (md)+1,1
dd if=(rd) of=(md) bs=1 count=0x200 skip=%?% seek=0x60000 >> (md)+1,1
set /a a=*0x60020
set /a b=*0x60024
set /a c=%b%-1/0x200+1
set a=%a%+%c%,%b%
map --mem (rd)%a% %2
cat --locate=(rd) --number=2 (rd)+1 >> (md)+1,1
set /A b=%?%+4
write --offset=%b% %1 %a% >> (md)+1,1
set *
exit
======================================
出错 error 17:cannot mount selected partition
回复

使用道具 举报

167#
发表于 2011-8-25 17:06:19 | 只看该作者

回复 #166 tingyue-wu 的帖子

c大的新方法:
不能用fbt编辑..
要用winhex编辑。
或者dos的copy连接
附件要gz压缩
=================
我提供的方法:
必须用fbt编辑
要注意修改盘符

[ 本帖最后由 zxw 于 2011-8-25 17:13 编辑 ]
回复

使用道具 举报

168#
发表于 2011-8-25 17:34:54 | 只看该作者
希望有nv板raid的,把txtsetup.oem贴出来。
下一步:
1:加inf及dll文件。这个版本有太多的dll文件,有点晕。
2:超过1个scsi的加载fira驱动(可选),便于安装系统。
多scsi的情况,有可能要扩大仿真盘的容量了。
回复

使用道具 举报

169#
 楼主| 发表于 2011-8-25 23:18:22 | 只看该作者
再上传了一个...
只是修改了内嵌文件的读取方法..更先进一点,代码也更复杂一些.
但是代码基本上是固定的,直接复制即可使用.
新的方案无需读取两次这个批处理文件,而是直接从内存中读取目前正在运行中的批处理文件...

另: 不管使用什么方法,都要求这个批处理文件是在磁盘上,不可以使用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 编辑 ]
回复

使用道具 举报

170#
发表于 2011-8-25 23:51:34 | 只看该作者
正在拜读前一个版本,苦啃新功能,尚未消化,一知半解。新版本又来了……
一直未搞懂--locate-align的用法,测试结果与自己理解的总是不相符合。
哈哈,换用新版grldr终于明白了。

[ 本帖最后由 zxw 于 2011-8-26 00:30 编辑 ]
回复

使用道具 举报

171#
发表于 2011-8-26 12:10:04 | 只看该作者
grub4dos.h中看了一下,目前有74个功能调用。
-------------------
::call func malloc
call #50 1024 && set /A p_hwid=*0x4cb00
::call func memset
call #24 %p_hwid% 0 1024
动态分配一块内存,大小1K,内存起始位置放在p_hwid
------------------
::call func sprintf
call #0 %p_hwid% "%~1"
把%~1的内容写入到刚定义内存区域,这里%~1是本机的SRSID,如PCI\VEN_1000&DEV_0030
------------------
::call func free
call #51 %p_hwid%
释放上面定义的内存
===================
::call func strtok
call #13 %p_hwid% ","
分解字符串
call #0 0 "id="%s","%1"" %p_hwid% | echo >> (md)0x300+2
把指针0开始的字符串赋值给%s,得到id="PCI\VEN_1000&DEV_0030","SYMMPI",追加到(md)0x300+2
:addins_next
call #13 0 "," || exit
call #0 0 "id="%s","%1"" %@retval% | echo >> (md)0x300+2
goto :addins_next
==================
这里懂得意思,但没十分了解。strtok是分解字符串的功能,总的意思是把:
id="PCI\VEN_1000&DEV_0030","symmpi"这样的内容写到(md)0x300+2
有多个写多个。
回复

使用道具 举报

172#
发表于 2011-8-26 12:20:27 | 只看该作者
呵,我也大致看懂了。但对strtok分割字符串还有点疑惑:
如要分割字符串a,b,c:
  1. call #50 1024
  2. set /A p=*0x4cb00
  3. call #24 %p% 0 1024
  4. call #0 %p% "a,b,c"
  5. call #13 %p% ","
  6. call #0 0 "%s" %p% | echo > (md)0x300+2
  7. [循环]
  8. #51 %p%
复制代码
如要得到a b c,在grub4dos批处理中这个循环应该怎么写?关键是指针返回NULL如何写?

[ 本帖最后由 zxw 于 2011-8-26 12:24 编辑 ]
回复

使用道具 举报

173#
发表于 2011-8-26 12:35:39 | 只看该作者
call #50 1024
set /A p=*0x4cb00
call #24 %p% 0 1024
call #0 %p% "a,b,c"
call #13 %p% ","
call #0 0 "%s" %p% | echo > (md)0x300+2
:add
call #13 0 "," || exit
call #0 0 "%s" %@retval% | echo >> (md)0x300+2
goto :add

得到
a
b
c

[ 本帖最后由 zhaohj 于 2011-8-26 15:01 编辑 ]
回复

使用道具 举报

174#
 楼主| 发表于 2011-8-26 14:10:25 | 只看该作者
原型:extern char *strtok(char *s, char *delim);
        
  用法:#include <string.h>
  
  功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
  
  说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
        strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,直到找遍整个字符串。
        返回指向下一个标记串。当没有标记串时则返回空字符NULL。


在GRUB4DOS中使用,返回NULL也就是返回了0,
回复

使用道具 举报

175#
发表于 2011-8-26 14:29:42 | 只看该作者
谢谢两位指点,终于明白了。原来这里的%@retval%是指针……

[ 本帖最后由 zxw 于 2011-8-26 14:49 编辑 ]
回复

使用道具 举报

176#
发表于 2011-8-26 14:55:22 | 只看该作者
越讨论越深入啊,佩服啊
回复

使用道具 举报

177#
发表于 2011-8-26 23:07:51 | 只看该作者
@chenall:
fontx、fontx之类的函数是否考虑也添加如此调用?
回复

使用道具 举报

178#
 楼主| 发表于 2011-8-26 23:11:42 | 只看该作者

回复 #177 zxw 的帖子

没看明白,....

目前所有GRUB4DOS的接口函数都可以直接在命令行下使用

call #n 的方式来调用,关键是参数要正确,有些函数还需要自己组装参数.
回复

使用道具 举报

179#
发表于 2011-8-26 23:19:06 | 只看该作者
貌似malloc、sprintf、free等函数的入口是0x8300?
fontx、fonty等函数的入口是0x8304?
=========================
如上述理解是正确的,fontx、fonty等函数如何用call #n方式来调用?
利用fontxy函数?
call 4# ……?
回复

使用道具 举报

180#
 楼主| 发表于 2011-8-26 23:40:56 | 只看该作者
晕,

这些是变量,而非函数.

要自己计算一下再获取就行了.

懂C语言直接自己根据指针地址计算一下,另外你想要的FONTX/FONTY只有一图形模式下有效.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-26 13:42

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表