无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: zhaohj
打印 上一主题 下一主题

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
31#
 楼主| 发表于 2010-11-7 11:02:29 | 只看该作者
下面有可能出现溢出:
:查找下一个可能的段
WENV calc _ini_tmp=_ini_s1+${_ini_sc,?}+2
debug 0
WENV call cat --skip=${_ini_tmp} --locate=[ ${_ini_fn}
debug 1
WENV calc _ini_cnt=${?_WENV}

Snap1.jpg (96.79 KB, 下载次数: 393)

Snap1.jpg
回复

使用道具 举报

32#
 楼主| 发表于 2010-11-7 11:12:03 | 只看该作者
另外,不知道--locate-align=A是什么意思?
输入a=1,2...好像控制输出结果



-------------
还是控制一下长度算了,--length=2048,段长不可能超过2K的。
wenv set _ini_len=2048

cat命令应该加个参数--count=N

[ 本帖最后由 zhaohj 于 2010-11-7 11:19 编辑 ]
回复

使用道具 举报

33#
 楼主| 发表于 2010-11-7 11:33:06 | 只看该作者
WENV calc _ini_cnt=${?_WENV}
是否有问题,找到1个的情况,这个变量也不存在。wenv的bug?

[ 本帖最后由 zhaohj 于 2010-11-7 11:34 编辑 ]

Snap1.jpg (15.36 KB, 下载次数: 429)

Snap1.jpg
回复

使用道具 举报

34#
 楼主| 发表于 2010-11-7 12:39:19 | 只看该作者
重大bug发现:数字9不能用在变量中

[ 本帖最后由 zhaohj 于 2010-11-7 12:41 编辑 ]

Snap1.jpg (84.62 KB, 下载次数: 395)

Snap1.jpg
回复

使用道具 举报

35#
发表于 2010-11-7 12:52:56 | 只看该作者
?_WENV 只有用 call 命令中才会设置为所调用命令的返回值(最近加入check查找命令也影响它)

cat /file                   #不影响 ?_WENV
WENV call cat /file    # 影响 ?_WENV

WENV get 默认不显示内置变量( 用 get ?_WENV 或 get ?* )

数字9不用在变量名中是个BUG,数字范围的 < 判断应该改 <=

[ 本帖最后由 tuxw 于 2010-11-7 12:55 编辑 ]
回复

使用道具 举报

36#
发表于 2010-11-7 12:56:55 | 只看该作者
原帖由 zhaohj 于 2010-11-7 11:02 发表
下面有可能出现溢出:
:查找下一个可能的段
WENV calc _ini_tmp=_ini_s1+${_ini_sc,?}+2
debug 0
WENV call cat --skip=${_ini_tmp} --locate=[ ${_ini_fn}
debug 1
WENV calc _ini_cnt=${?_WENV}



这里应该不会溢出, cat 只是被调用并没有任何重定向输出, 调用后 ?_WENV 中是找到的个数。

那个 +2 不要,最初的那个批处理是针对你特定的例子文件,+2用来跳过换行。通用批处理中不能这样做,因为并不有判断后面是否存在换行符。

[ 本帖最后由 tuxw 于 2010-11-7 13:00 编辑 ]
回复

使用道具 举报

37#
发表于 2010-11-7 13:21:36 | 只看该作者
增加输出到文件功能, 临时缓冲区用完后变为 rd 文件

WENV set INIFILE=/T1.TXT [Disks] 0x600000
/GETSECT.BAT
dd if=(rd)+1 of=/myfile

GETSECT.rar

835 Bytes, 下载次数: 88, 下载积分: 无忧币 -2

回复

使用道具 举报

38#
 楼主| 发表于 2010-11-7 15:14:08 | 只看该作者
WENV set -t _ini_fn=${INIFILE%%[}
WENV set -t _ini_sc=${INIFILE#${_ini_fn}}
WENV check " "<-"${_ini_sc}" (set -t _ini_buf=${_ini_sc#]} ; set _ini_sc=${_ini_sc%% })

你多了一个$,变量值空格会自动删除
dd需要事先建一定大小文件,用FAT

--------------------
很好,测试全面通过!

[ 本帖最后由 zhaohj 于 2010-11-7 15:32 编辑 ]
回复

使用道具 举报

39#
 楼主| 发表于 2010-11-7 15:38:14 | 只看该作者
19#最后一个【】

Snap1.jpg (50.93 KB, 下载次数: 389)

Snap1.jpg
回复

使用道具 举报

40#
发表于 2010-11-7 15:51:16 | 只看该作者
这个问题你要单独运行一下
cat --locate=[HardwareIds......] /TXTSETUP.OEM
看正常否
我测试的结果是这条命令不能正确执行
Error 30:...
可能要请教下 chenall 了

======================
我就是用你#19的副本测试的,为了少打几个字,文件名我改为 T1.TXT 了,但我没有测试种长的带.的段名

关键在多的那个$
$$ 不是 for 命令专用的,复合命令(check/for) 后面跟的集合命令里多次引用的变量,可能被其它命令改变的,也要用$$。

你给出的例子处,一个或二个$都没有问题,但后面有个计算 _ini_s2 的地方必须要用 $$ 的

比如check后面的集合命令
WENV set a=1
WENV set b=1
WENV check ...  (set b=${b}${a} ; set a=$${b}) #执行到第二个set时,b已经改变了,如果用一个$的话,b引用的将是原值

测试
WENV check ...  (set b=${a}${b} ; set a=${b})
红色处分别用1个和2个$运行就可以看出区别了


这个要说清楚的话要讲一下WENV的原理
WENV check ...  (set b=${a}${b} ; set a=${b})

1.没有判断子命令时就进行一次扫描,命令变成
WENV check ...  (set b=21 ; set a=1)  #a使用了b改变前的值
2.进入check子命令后 a,b 的值已经固定了


再看这一个
WENV check ...  (set b=${a}${b} ; set a=$${b})

1.第一次扫描后
WENV check ...  (set b=21 ; set a=${b})  # 双写$就是通知WENV先不要替换这个变量

2.进入check命令, 依次执行
set b=21
set a=${b} #此时再去取变量b的值,就是改变后的值


for命令中需要双写 $$ 原因也是一样的,因为 Do 后的命令可能会执行多次,而其中可能会改变变量的值,下次执行需要读变量的新值,所以不能开始就替换变量。


但单独的集合命令则不需要双写$
WENV (... ; ...)
这种简单命令直接按 ; 分解成多条命令,然后逐条替换变量,执行,所以不需要双写 $

[ 本帖最后由 tuxw 于 2010-11-7 16:16 编辑 ]
回复

使用道具 举报

41#
发表于 2010-11-7 16:45:49 | 只看该作者
@zhaohj
还有个隐患,你自己修改下
在第一次使用 rd 前,先将它清0

WENV reset =${_ini_buf} ${_ini_cnt} #或只清前面17字节也是可以的
WENV check ${_ini_cnt}>=1 call cat --skip=${_ini_tmp} --locate=[ ${_ini_fn} > (rd)+1

输出重定向到 rd  后,在第18个字节处截断。启动后初次运行可能没问题,但临时缓冲区可能被其它命令用过(比如read)初值不为0,它可能含有一些其它字符,如果我们的搜索命令输出只有3个字节,那4-17间的字符可能造成干扰,先清下0就没问题了。

之所以在18个字节处截断,是因为最大可能的偏移值64位,16进制结果要占16个字符,加前面的空格是17个字符。这样保证第一个偏移值不被截断。实际上在 18-512间截断都可以,但截断处前面的部分要先清0。

[ 本帖最后由 tuxw 于 2010-11-7 16:49 编辑 ]
回复

使用道具 举报

42#
 楼主| 发表于 2010-11-7 18:11:10 | 只看该作者
cat --locate=字符串不能超过16个,>16个字符就出错。

要让C大查一下了。

不然要先判断这个变量的长度,超过往前截断。

WENV check " "<-"${_ini_sc}" (set -t _ini_buf=$${_ini_sc#]} ; set _ini_sc=$${_ini_sc%% })
:目前cat最多只能匹配16个字符
WENV check ${_ini_sc,?}>=17 set _ini_sc=${_ini_sc:-16}
这样就正常了。

如果scsi.后面8个字符,这样    x.scsi.12345678]
                                 位数  1                   16
这样就很不保险。还不如把最后的]去掉,从倒数17开始取16位
WENV check ${_ini_sc,?}>=17 set _ini_sc=${_ini_sc:-17:16}

-------------
看下面:
      [HardwareIds.scsi.SIL3X12R]
                  [Files.scsi.SIL3X12R]
取倒数16个字符  s.scsi.SIL3X12R]
正好重叠,这样唯一性很难保证
另,cat区分大小写也是一个问题

[ 本帖最后由 zhaohj 于 2010-11-7 19:05 编辑 ]

Snap1.jpg (23.64 KB, 下载次数: 407)

Snap1.jpg
回复

使用道具 举报

43#
发表于 2010-11-7 19:26:55 | 只看该作者
不要这么复杂,设置 INIFILE 时只给16个字符就行了,这样通用性会好一点。批处理内部参数分离部分改一下就可以了

===============
改动量比较小的方法
wenv call cat --locate=${_ini_sc:0:16} ...
只取段名的前16字符进行查找,其它地方不用动,也用判断段名是否超出16字符。
改动_ini_sc的话计算偏移,起始,字节数部分都要相应改变。

[ 本帖最后由 tuxw 于 2010-11-7 20:01 编辑 ]
回复

使用道具 举报

44#
 楼主| 发表于 2010-11-7 21:05:12 | 只看该作者
[HardwareIds.scsi.SIL3X12R]
id="PCI\VEN_1095&DEV_3112&CC_0104","Si3112r"
id="PCI\VEN_1095&DEV_3512&CC_0104","Si3112r"
[HardwareIds.scsi.SIL3X12S]
id="PCI\VEN_1095&DEV_3112&CC_0180","Si3112"
id="PCI\VEN_1095&DEV_3512&CC_0180","Si3112"
[HardwareIds.scsi.MSASXP]
id="PCI\VEN_1000&DEV_0060&SUBSYS_10001458","MSASXP"
[HardwareIds.scsi.SYMMPI]
id="PCI\VEN_1000&DEV_0622","SYMMPI"
id="PCI\VEN_1000&DEV_0624","SYMMPI"
-----------------
取前16个字符能行吗?
回复

使用道具 举报

45#
发表于 2010-11-7 21:42:09 | 只看该作者
这种情况没有完美的办法,如果你取后面或中间的,同样存在这个2个长段名局部相同的问题

取前16字符查找只是在应对 cat 的 16 字节限制这一问题的最简洁的方法

===============
复杂一点的有效的办法

WENV call cat --locate=${_ini_sc:0:16} ${_ini_fn}
先查找16字节
通过 ?_WENV 判断是否找到多个
如找到一个,则就是目标
否则再从多个偏处开始查找 ${_ini_sc:16:16}
继续判断

总之,办法总是比困难多

[ 本帖最后由 tuxw 于 2010-11-7 21:52 编辑 ]
回复

使用道具 举报

46#
 楼主| 发表于 2010-11-7 22:43:37 | 只看该作者
先看看C大怎么说,为何cat是16个,方便的话能否修改,并适当增加功能。
如16进制的输出,字符串大小写区分,字符串长度限制。
回复

使用道具 举报

47#
发表于 2010-11-7 22:54:23 | 只看该作者
cat 比较16个字符,太长了会降低效率。一次读取16个字符进入缓冲后后再进行比较。

另外--locate-align=A是指对齐参数。

即如果你确定你要查找的内容的位置正好是A的倍数则使用这个参数可以加快查找。

比如A=16时。
只会从0X0,0X10,0X20等开始的位置进行查找。
回复

使用道具 举报

48#
发表于 2010-11-8 00:09:16 | 只看该作者
上传了一个 WENV,加了个 find 命令
WENV find [-skip=S] [-len=L] [-c] STRING FILE

G2.rar (719 Bytes, 下载次数: 110)
指定缓冲区,将结果写到文件,屏幕上不显示结果,便于在菜单中调用
WENV set INIFILE=/TXTSETUP.OEM [HardwareIds.scsi.ATABUS] 0x600000
/G2.BAT
WENV get INI_OK && FAT copy (rd)+1 (fd0)/myfile

不指定缓冲区时,只是在屏上显示结果, 不生成 rd 文件


[ 本帖最后由 tuxw 于 2010-11-8 01:55 编辑 ]
回复

使用道具 举报

49#
 楼主| 发表于 2010-11-8 16:55:34 | 只看该作者
现在对wenv switch有点模糊了,最好加个help,时间一长容易忘记。
如:WENV switch -h
       出现帮助信息
---------------------
我记得wenv for 默认会取消前后引号,测试也正常
现在switch是111111,6位,怎样保持前后引号输出?

------------------
知道了,???0

        位号:1  2  3  4  5  6
                 ?   ?  ?  ?  ?  ?
        默认  1  1  1  1  1  1
                |   |  |   |  |   |____  NOT_TRUNC, 为0时命令行超出512字节部分截断,并自动设置为1
                |   |  |   |  |
                |   |  |   |  |______  转义符 \ 当普通字符输出
                |   |  |   |
                |   |  |   |________  操作变量时去掉前后引号(不影响check)
                |   |  |
                |   |  |__________  数值转字符串时用10进制
                |   |
                |   |____________  数值计算结果取64位
                |
                |______________  ECHO自动自动换行

[ 本帖最后由 zhaohj 于 2010-11-8 18:02 编辑 ]
回复

使用道具 举报

50#
发表于 2010-11-8 20:37:41 | 只看该作者
现在这些开关还是测试性质的,有些开关可能以后不会保留,或许顺序可能会变动(将可能用到频率较高的排在前面,修改方便也容易记忆),要等稳定后再统一说明。我现在最想改的是将开关定义反过来,只有打开某个开关,才触发默认行为相反的功能。这也是一直没提供 switch echo_ln=on 这种直观语法的原因之一,实现这个语法后再变动时会麻烦很多。现在这种简单想变动只需要调一下几个语句的行序,0,1互换就可以了。

[ 本帖最后由 tuxw 于 2010-11-8 20:39 编辑 ]
回复

使用道具 举报

51#
 楼主| 发表于 2010-11-8 23:42:55 | 只看该作者
想在循环里运行你的批处理,看来还得改造成wenv read bat格式的。

但这么多判断语句,好像根本无法实现。

举例说明,下面这段:
[scsi]
ICH6RAHCI="INTEL ICH6R AHCI"
ICH6MAHCI="INTEL ICH6M AHCI"
ICH6RRAID="INTEL ICH6R RAID"

[HardwareIds.scsi.ICH6RAHCI]
id="PCI\VEN_8086&DEV_2652&CC_0106","iaStor"
[HardwareIds.scsi.ICH6MAHCI]
id="PCI\VEN_8086&DEV_2653&CC_0106","iaStor"
[HardwareIds.scsi.ICH6RRAID]
id="PCI\VEN_8086&DEV_2652&CC_0104","iaStor"

我现在只知道 id 值,只有通过批处理取出[scsi]段内容如生成FILE,然后wenv for /f  "delims==" %i in ( FILE ) do (set a=%i,set INIFILE=OEM [HardwareIds.scsi.$${a}] ; ...

[ 本帖最后由 zhaohj 于 2010-11-9 00:12 编辑 ]
回复

使用道具 举报

52#
发表于 2010-11-9 00:07:47 | 只看该作者
是有这个问题,Grub4Dos 的批处理需要直接运行,不能由 WENV 调用

read 不支持条件连写命令,也不能使用 Grub4Dos 的文件重定向和管道

再想想看有没有其它办法解决循环运行的问题
实在不行,干脆在 find 命令里直接给你支持这个特殊功能算了,反正这个 find 命令估计也只有你用,

或者最后还是得要一个你说的 inifile,不过我对这个不看好,除了你这个用法,inifile 的独立的read/write功能在grub4dos环境下实在没什么用处,而没有了read/write还能叫inifile吗

[ 本帖最后由 tuxw 于 2010-11-9 00:15 编辑 ]
回复

使用道具 举报

53#
 楼主| 发表于 2010-11-9 00:15:45 | 只看该作者
问题反过来了,知道某段落的部分内容,反查段落名。
回复

使用道具 举报

54#
发表于 2010-11-9 01:04:43 | 只看该作者
已经实现了 WENV find [-skip=S] [-len=L] [-end=STRING] [-c] [-r] STRING FILE
但有其它部分的代码(switch)正在修改,明天上传吧

WENV find -end=[  [Disks] /TXTSETUP.OEM
直接输出 [Disks] 段

顺手添加了个 -r,反向查找,正好满足你反查段名的问题,不过这部分没在代码里实现,需要自己批处理
回复

使用道具 举报

55#
发表于 2010-11-9 02:38:38 | 只看该作者
已上传
help 中不显示 find 命令,但 WENV find 可显示其语法
WENV find [-skip=S] [-len=L] [-end=ENDS] [-c] [-r] STRING FILE

新增 -r 参数反向查找STRING,为简化编程,取消了 skip>0 时从 skip+1 开始查找的特性
新增 -end 参数
未指定 -end 时,跟之前一样,只是一个简的查找命令,取得第一个找到的位置

如指定 -end,则找到 STRING 后,继续向后查找 ENDS,找到则输出之间的内容
如找到 ENDS 会设置好 rd,可以在find命令之后立即复制 (rd)+1 到文件

find 命令只要找到 STRING 就会返回1,通过一个返回值没办法知道是否有找到 ENDS
添加了一个内置变量 ?_FIND,如找到,设置其为 ENDS的偏移量,否则删除 ?_FIND,可根据 ?_FIND 是否存在来判断能否复制 rd

[ 本帖最后由 tuxw 于 2010-11-9 02:47 编辑 ]
回复

使用道具 举报

56#
发表于 2010-11-9 03:01:50 | 只看该作者
反查段名

WENV find string /TXTSETUP.OEM && WENV set a=${?_WENV}
WENF find -len=${a} -r [ /TXTSETUP.OEM && WENV set b=${?_WENV}
WENV calc -hex c=b+1
WENV find -skip=${c} ] /TXTSETUP.OEM && WENV set c=${?_WENV}
WENV calc c=c-b+1
WENV call cat --skip=${b} --length=${c} /TXTSETUP.OEM
回复

使用道具 举报

57#
 楼主| 发表于 2010-11-9 07:58:49 | 只看该作者
想不到凌晨3点还在忙,辛苦了。万分感谢实现了我的需求。

今天好好测试,不能辜负你的成果!
回复

使用道具 举报

58#
发表于 2010-11-9 20:32:57 | 只看该作者

grub4dos 2010年11曰7号版本bug

以下的2003.iso都用nlite集成了firadisk 0.0.1.24驱动
在电脑上用buldr启动win2003的iso蓝屏。
按重启键重启电脑,再用grub4dos直接载入2003.iso蓝屏。
在电脑上用buldr启动win2003的iso蓝屏。
按关机键关闭电脑,再用grub4dos直接载入2003.iso不蓝屏
map --mem /2003.iso (0xff)
map --hook
chainloader (0xff)
map --mem /1.img (fd0)
map --hook
boot
上面的菜单不蓝屏
map --mem /1.img (fd0)
map --hook
map --mem /2003.iso (0xff)
map --hook
chainloader (0xff)
boot
这个菜单蓝屏
其中1.img就是一个空的软盘镜像

[ 本帖最后由 510819776 于 2010-11-9 20:36 编辑 ]
回复

使用道具 举报

59#
发表于 2010-11-9 20:49:26 | 只看该作者

回复 #58 510819776 的帖子

很意外的发现  map iso和img的顺序不同居然还有区别  2003是哪个版本的  蓝屏的话蓝屏代码是什么  

能不能再帮忙测试下没有用nlite集成firadisk驱动的2003.iso交换map iso和img的顺序还蓝不蓝
回复

使用道具 举报

60#
发表于 2010-11-9 21:20:14 | 只看该作者
后一个菜单,后面加一行
rootnoverify (fd0)

[ 本帖最后由 pseudo 于 2010-11-9 21:21 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-24 08:46

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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