无忧启动论坛

标题: GRUB4DOS更新建议、bug反馈专帖 [打印本页]

作者: zhaohj    时间: 2010-11-5 18:03
标题: GRUB4DOS更新建议、bug反馈专帖
本帖主要为对grub4dos的建议,或是bug的反馈,问题请去问题专帖。          by  sratlf

===================================================================

cat命令的语法是这样的:
cat [--hex] [--skip=S] [--length=L] [--locate=STRING] [--locate-align=A] FILE

--locate=STRING :查找文件中指定字符串的位置,有几个就输出几个
如文件内容:
PCI$
$PCI\VEN_1000&DEV_0050=lsi_sas                  <----------占30+2个字节=0x20
$PCI\VEN_1000&DEV_0056=lsi_sas   
$PCI\VEN_1000&DEV_005A=lsi_sas
$PCI\VEN_1000&DEV_0062=lsi_sas
$PCI\VEN_1000&DEV_0054=lsi_sas
$PCI\VEN_1000&DEV_0058=lsi_sas
$PCI\VEN_1000&DEV_005E=lsi_sas
-----------
--locate=$PCI,会输出16进制的数值,用空格分开,上面回车换行占2个字节:
6 26 46 66 86 a6 c6


[--skip=S]  跳过多少字节开始,这里S是10进制数或16进制数

----------------------------------
问题1:--locate=STRING如果输出16进制,建议输出格式改成0x6 0x26 0x46 ...
问题2:--skip=S 与上面对应为16进制。
问题3:希望加个参数,STRING不分大小写
...

[ 本帖最后由 zhaohj 于 2010-11-11 09:48 编辑 ]
作者: chenall    时间: 2010-11-5 19:12
我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

你可以把你最终想要得到的结果贴出来。
注:是最终的目的,而不是使用这个命令要达到的过程,也许会有更好的解决方案。

看看tuxw或zxw能不能想办法去实现。
作者: tuxw    时间: 2010-11-5 21:18
@zhaohj
问题1

可以这样解决
cat --locate=... | WENV set a=
WENV set a=0x${a! = 0x}   # 最前面加上0x,然后将空格替换为空格0x

[ 本帖最后由 tuxw 于 2010-11-5 21:23 编辑 ]
作者: zhaohj    时间: 2010-11-5 22:13
原帖由 chenall 于 2010-11-5 19:12 发表
我觉得这些不是很重要的东西尽量不要使用内部的命令去实现。

你可以把你最终想要得到的结果贴出来。
注:是最终的目的,而不是使用这个命令要达到的过程,也许会有更好的解决方案。

看看tuxw或zxw能不能 ...


[aaaa]
sgrhgjhm
zbgnhgj
[bbbb]
sytrhy
hnh
-------------------
我的目的很简单,如:INIFILE 文件名 [aaaa]
显示[aaaa]段录内容
作者: tuxw    时间: 2010-11-5 22:26
可以用 WENV 命令实现,只是步骤麻烦了点

!BAT
:记录偏移1
cat --locate=[aaaa] /T.TXT | WENV set s1=
WENV set s1=0x${s1}
WENV check " "<-"${s1}" set s1=${s1%% }

:记录偏移2
cat --locate=[bbbb] /T.TXT | WENV set s2=
WENV set s2=0x${s2}
WENV check " "<-"${s2}" set s2=${s2%% }

:如果查找次序相反,交换偏移量,保证s1在前面

:交换方法1: 大文件时加法有可能计算溢出
:WENV check ${s1}>=${s2} (calc s1=s1+s2 ; calc s2=s1-s2 ; calc s1=s1-s2)

:交换方法2: 需要修复calc bug的新版WENV
WENV check ${s1}>=${s2} (calc s1=s1^s2 ; calc s2=s1^s2 ; calc s1=s1^s2)

:起始位置, 字节计数
WENV calc s1=s1+6+2
WENV calc s2=s2-s1-2

WENV call cat --skip=${s1} --length=${s2} /T.TXT


@chenall
不能用最新的测试版grldr运行,试了 11-03 的可以
11-05 的最新grldr在批处理中 WENV check  返回 0 时会终止执行批处理

[ 本帖最后由 tuxw 于 2010-11-6 01:34 编辑 ]

T.rar

440 Bytes, 下载次数: 422, 下载积分: 无忧币 -2


作者: sratlf    时间: 2010-11-6 11:40
标题: GRUB4DOS更新建议专帖
和问题贴分开处理
作者: zhaohj    时间: 2010-11-6 14:36
最近几天一直在分析N版的F6驱动(oem格式驱动),在现有的条件下,要想实现原SRS_F6返回模块的仿真盘功能实在太难了。而且很多oem驱动包也是这种格式的,下面贴出一部分,方便分析:

现有条件:只知道(1)
需要达到的目的:
  1:需要提取对应段落(2)段落名,提取出ICH10DAHCI
  2:需要提取对应段落(4),及所有sys扩展名的文件名、所有inf扩展名的文件名
  3:需要提取 “相对目录"

为何要这么做?
  1:需要(2)是为了修改默认SCSI
      也为了方便修改成单ID
  2:需要知道文件名及路径,主要是fat copy需要完整路径的文件名

[ 本帖最后由 zhaohj 于 2010-11-6 16:04 编辑 ]

F6.JPG (132.41 KB, 下载次数: 799)

F6.JPG

作者: 135956    时间: 2010-11-6 15:26
建议在无忧开个grub4dos的版块,时空论坛很少去。
作者: zhaohj    时间: 2010-11-6 15:51
原帖由 tuxw 于 2010-11-5 22:26 发表
可以用 WENV 命令实现,只是步骤麻烦了点



你这个最大的问题:[bbbb]段落名不可能预先知道的。
作者: tuxw    时间: 2010-11-6 15:59
可以先查找 [aaaa] 再查找 [
如果 [bbbb] 不可预知,用 INIFILE 的方式更不可能实现,INI 是必须要知道段名和变量名才可以操作的
作者: zhaohj    时间: 2010-11-6 16:14
原帖由 tuxw 于 2010-11-6 15:59 发表
可以先查找 [aaaa] 再查找 [
如果  不可预知,用 INIFILE 的方式更不可能实现,INI 是必须要知道段名和变量名才可以操作的


inifile  a:\txtsetup.oem [aaaa]>f6.tmp
DOS下就这么简单提取出了[aaaa]段落的内容
作者: tuxw    时间: 2010-11-6 19:14
原帖由 zhaohj 于 2010-11-6 16:14 发表


inifile  a:\txtsetup.oem [aaaa]>f6.tmp
DOS下就这么简单提取出了[aaaa]段落的内容


尽量运用现有的功能达到目的,避免重复开发,
我将批处理改了下,算是一个通用的外部命令了
用法:
WENV set INIFILE=INI文件 [段名]
GETSECT.BAT

GETSECT.rar (707 Bytes, 下载次数: 137)

目前只能在11-03版的grldr上运行(11-04以后的版本批处理有BUG,新版正常后批处理还可以简化,并且可以将通过参数指定一个文件名,将结果写入文件)



!BAT设置变量INIFILE=INI文件名 [段名],打印该段内容

:参数检查
WENV get INIFILE || kernel
WENV reset _ini_*

:文件名、段名
WENV set _ini_fn=${INIFILE% }
WENV set _ini_sc=${INIFILE## }

:保存当前debug状态,打开回显,否则管道命令可能失败
debug status | WENV set -t _ini_db= && WENV set _ini_db=${_ini_db## } && debug 1

:记录偏移1
WENV call cat --locate=${_ini_sc} ${_ini_fn} | WENV set -t _ini_s1=
WENV get _ini_s1 || WENV echo -e not found sect ${_ini_sc}\n && WENV call debug ${_ini_db} && WENV reset _ini_* && kernel
WENV set _ini_s1=0x${_ini_s1}
WENV check " "<-"${_ini_s1}" set _ini_s1=${_ini_s1%% }

:记录偏移2
WENV calc _ini_tmp=_ini_s1+1
WENV call cat --skip=${_ini_tmp} --locate=[ ${_ini_fn} | WENV set -t _ini_s2=
WENV set _ini_s2=0x${_ini_s2}
WENV check " "<-"${_ini_s2}" set _ini_s2=${_ini_s2%% }

:没有找到下一个段时,设置为文件长度
WENV check ${_ini_s2,?}==2 && WENV call cat --length=0 ${_ini_fn} | WENV set -t _ini_s2=
WENV check " "<-"${_ini_s2}" set _ini_s2=${_ini_s2## }

:起始位置, 字节计数
WENV calc _ini_s1=_ini_s1+${_ini_sc,?}
WENV calc _ini_s2=_ini_s2-_ini_s1

:直接显示, 首尾可能有换行(如果内容较短,可通过变量中转显示去掉首尾换行)
WENV call cat --skip=${_ini_s1} --length=${_ini_s2} ${_ini_fn}

:恢复环境
WENV call debug ${_ini_db}
WENV reset _ini_*

作者: tuxw    时间: 2010-11-6 19:22
我比较希望的用法是这样的
WENV read GetSect.env inifile [aaaa]
作者: tuxw    时间: 2010-11-6 19:40
标题: 1105bug
11-05 版批处理BUG

随便写一个简单的语句集合的批处理文件,运行正常

在中间任意位置加一句
WENV check 1==2 echo ok
再运行批处理将在这句后退出

应该是只要有一条语句返回0就终止了
比如插入 WENV calc 1-1 && WENV echo ok 也一样
作者: zhaohj    时间: 2010-11-6 20:14
我也测试是这样,批处理中无法使用wenv check
本来想用wenv for /f "delims= " %i in ("STRING”) do set s=%i 来获取16进制的第一个数值
发觉“ ”空格分隔符不起作用了。
----------
要用到新版的>>,看来得等到grldr修正了。
作者: tuxw    时间: 2010-11-6 21:13
现在不能用 WENV check " "<-"${VAR}" 来检查VAR是否包含空格(无空格时批处理会终止)

在grldr修正前可以用下面的临时办法代替
WENV reset tmp
WENV set tmp=${VAR# }  #无空格时tmp变量不存在
WENV get tmp && ...
作者: zhaohj    时间: 2010-11-6 22:54
想把文本中注释先过滤掉,下面的命令竟然不行:
cat --length=0 (fd1)/txtsetup.oem && fat mkfile size=* (fd1)/temp
echo ; > (fd1)/temp
wenv for /f "eol=# delims=" %i in ( (fd1)/txtsetup.oem ) do (set a=%i ; echo $${a} >> (fd1)/temp)

不知哪里错了?帮忙测试一下

不过滤掉的话,比如[Disks],会找到多个,不知道哪个是需要的。

[ 本帖最后由 zhaohj 于 2010-11-6 23:06 编辑 ]

txtsetup.rar

1.55 KB, 下载次数: 93, 下载积分: 无忧币 -2


作者: chenall    时间: 2010-11-6 23:09
原帖由 zhaohj 于 2010-11-6 20:14 发表
我也测试是这样,批处理中无法使用wenv check
本来想用wenv for /f "delims= " %i in ("STRING”) do set s=%i 来获取16进制的第一个数值
发觉“ ”空格分隔符不起作用了。
----------
要用到新版的>>,看来 ...


wenv默认就是使用空格作为分隔符的啊。这个怎么和GRLDR扯上关系了。应该是WENV的BUG。
作者: zhaohj    时间: 2010-11-6 23:16
这个问题的发现,主要是locate=[ 时,象F6的txtsetup.oem有太多的[,导致变量值超过512。

我上传这个txtsetup.oem,比较大。

[ 本帖最后由 zhaohj 于 2010-11-6 23:18 编辑 ]

txtsetup.rar

2.42 KB, 下载次数: 92, 下载积分: 无忧币 -2


作者: tuxw    时间: 2010-11-6 23:18
原帖由 zhaohj 于 2010-11-6 22:54 发表
想把文本中注释先过滤掉,下面的命令竟然不行:
cat --length=0 (fd1)/txtsetup.oem && fat mkfile size=* (fd1)/temp
echo ; > (fd1)/temp
wenv for /f "eol=# delims=" %i in ( (fd1)/txtsetup.oem ) do ( ...


最后一条命令改成这样:
wenv for /f "eol=# delims=" %i in ( (fd1)/txtsetup.oem ) do echo %i  >> (fd1)/temp

DO 后面只能跟 WENV 子命令
而 >> 是 Grub4Dos 的特性,是 Grub4Dos 支持的命令间的分隔符

这个写法
wenv for /f "eol=# delims=" %i in ( (fd1)/txtsetup.oem ) do (set a=%i ; echo $${a} >> (fd1)/temp)
Grub4Dos在分析命令行时,会将 >> 前面的部分当作一条命令(显然这个格式是不合WENV语法的),然后将结果传给后面的部分

[ 本帖最后由 tuxw 于 2010-11-6 23:19 编辑 ]
作者: tuxw    时间: 2010-11-6 23:26
原帖由 zhaohj 于 2010-11-6 23:16 发表
这个问题的发现,主要是locate=[ 时,象F6的txtsetup.oem有太多的[,导致变量值超过512。

我上传这个txtsetup.oem,比较大。


这个也有办法解决,就是分块查找,不过批处理会比较复杂
或者将 locate=[ 的查找结果输出到临时文件,再对文件进行判断

[ 本帖最后由 tuxw 于 2010-11-6 23:28 编辑 ]
作者: zhaohj    时间: 2010-11-6 23:31
#20楼还是有问题,你再测试一下,我的理解,应该do (...)
应该每个循环执行()中的命令
作者: chenall    时间: 2010-11-6 23:38
原帖由 zhaohj 于 2010-11-6 20:14 发表
我也测试是这样,批处理中无法使用wenv check
本来想用wenv for /f "delims= " %i in ("STRING”) do set s=%i 来获取16进制的第一个数值
发觉“ ”空格分隔符不起作用了。
----------
要用到新版的>>,看来 ...



看了一下这个是WENV的BUG。
看下面的代码,等tuxw的修正版吧。

    for(i=0;i<7 && *arg;i++)
    {
     if (*arg == '\"' || *arg == ' ')
      break;
     delims = *arg++;
    }

简单一点处理只要再加一个判断就好了。
    if (*arg == '\"' || (*arg == ' ' && arg[1] != '\"'))

这样对语法要求比较严格,不能有多余的空格,当然正常情下这样处理就足够了,没有必要去作那么多的判断。
事实上许多GRUB4DOS的命令对语法要求都是比较严格的,可以节约一些代码空间。
作者: tuxw    时间: 2010-11-6 23:44
原帖由 zhaohj 于 2010-11-6 23:31 发表
#20楼还是有问题,你再测试一下,我的理解,应该do (...)
应该每个循环执行()中的命令


do 后面的 () 不是必须的,只是大多数时候后面不是一条简单的命令,所以要用集合命令,单命令时有无 () 没有关系

只要执行一个  WENV 命令看是否正常就行了
文件重定向不是在循环的时候一行行写入 temp 的,而是等前面的 WENV 命令执行完毕,然后将它的输出写入 temp
下面的输出已经过滤掉注释了



[ 本帖最后由 tuxw 于 2010-11-6 23:53 编辑 ]
作者: tuxw    时间: 2010-11-6 23:46
原帖由 chenall 于 2010-11-6 23:38 发表



看了一下这个是WENV的BUG。
看下面的代码,等tuxw的修正版吧。

    for(i=0;i

好,我重编译下

==================
已上传

[ 本帖最后由 tuxw 于 2010-11-6 23:58 编辑 ]
作者: zhaohj    时间: 2010-11-7 00:12
新版grldr测试版,发觉cat命令的bug

Snap1.jpg (15.42 KB, 下载次数: 466)

Snap1.jpg

作者: chenall    时间: 2010-11-7 00:21
额,,又没有完全清除前一句的error信息了。
作者: tuxw    时间: 2010-11-7 08:48
GETSECT.rar (820 Bytes, 下载次数: 104)

解决了大文件搜索结果超出512字节的问题



第3个参数指定缓冲区地址,不是必须的,不指定的话默认0x600000

[ 本帖最后由 tuxw 于 2010-11-7 09:12 编辑 ]
作者: zhaohj    时间: 2010-11-7 10:38
呵呵,我也正在考虑这个问题呢!要么在cat中加参数--length=1024,控制搜索范围,要么放在文件中。
---------------
变量溢出的问题,我认为WENV应该自动截断比较好。

缓冲区地址,默认改成0x65000
WENV calc _ini_tmp=_ini_s1+${_ini_sc,?}+2

[ 本帖最后由 zhaohj 于 2010-11-7 10:52 编辑 ]
作者: tuxw    时间: 2010-11-7 10:52
自动截断不太好
可能你设置了一个超出长度的变量,但你没有注意到,自动截断后将这个问题掩盖了,而这个问题可能在很远的位置才表现出来,故障定位会比较麻烦

或者用一个变通的方式:设置一个开关,变量可能超长,但用户明确知道只需要截断的部分时,先打开这个开关

[ 本帖最后由 tuxw 于 2010-11-7 10:53 编辑 ]
作者: 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}

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

Snap1.jpg

作者: zhaohj    时间: 2010-11-7 11:12
另外,不知道--locate-align=A是什么意思?
输入a=1,2...好像控制输出结果



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

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

[ 本帖最后由 zhaohj 于 2010-11-7 11:19 编辑 ]
作者: zhaohj    时间: 2010-11-7 11:33
WENV calc _ini_cnt=${?_WENV}
是否有问题,找到1个的情况,这个变量也不存在。wenv的bug?

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

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

Snap1.jpg

作者: zhaohj    时间: 2010-11-7 12:39
重大bug发现:数字9不能用在变量中

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

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

Snap1.jpg

作者: tuxw    时间: 2010-11-7 12:52
?_WENV 只有用 call 命令中才会设置为所调用命令的返回值(最近加入check查找命令也影响它)

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

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

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

[ 本帖最后由 tuxw 于 2010-11-7 12:55 编辑 ]
作者: tuxw    时间: 2010-11-7 12:56
原帖由 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 编辑 ]
作者: tuxw    时间: 2010-11-7 13:21
增加输出到文件功能, 临时缓冲区用完后变为 rd 文件

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

GETSECT.rar

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


作者: zhaohj    时间: 2010-11-7 15:14
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 编辑 ]
作者: zhaohj    时间: 2010-11-7 15:38
19#最后一个【】

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

Snap1.jpg

作者: tuxw    时间: 2010-11-7 15:51
这个问题你要单独运行一下
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 编辑 ]
作者: tuxw    时间: 2010-11-7 16:45
@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 编辑 ]
作者: zhaohj    时间: 2010-11-7 18:11
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

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

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

[ 本帖最后由 tuxw 于 2010-11-7 20:01 编辑 ]
作者: zhaohj    时间: 2010-11-7 21:05
[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个字符能行吗?
作者: tuxw    时间: 2010-11-7 21:42
这种情况没有完美的办法,如果你取后面或中间的,同样存在这个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 编辑 ]
作者: zhaohj    时间: 2010-11-7 22:43
先看看C大怎么说,为何cat是16个,方便的话能否修改,并适当增加功能。
如16进制的输出,字符串大小写区分,字符串长度限制。
作者: chenall    时间: 2010-11-7 22:54
cat 比较16个字符,太长了会降低效率。一次读取16个字符进入缓冲后后再进行比较。

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

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

比如A=16时。
只会从0X0,0X10,0X20等开始的位置进行查找。
作者: tuxw    时间: 2010-11-8 00:09
上传了一个 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 编辑 ]
作者: zhaohj    时间: 2010-11-8 16:55
现在对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 编辑 ]
作者: tuxw    时间: 2010-11-8 20:37
现在这些开关还是测试性质的,有些开关可能以后不会保留,或许顺序可能会变动(将可能用到频率较高的排在前面,修改方便也容易记忆),要等稳定后再统一说明。我现在最想改的是将开关定义反过来,只有打开某个开关,才触发默认行为相反的功能。这也是一直没提供 switch echo_ln=on 这种直观语法的原因之一,实现这个语法后再变动时会麻烦很多。现在这种简单想变动只需要调一下几个语句的行序,0,1互换就可以了。

[ 本帖最后由 tuxw 于 2010-11-8 20:39 编辑 ]
作者: zhaohj    时间: 2010-11-8 23:42
想在循环里运行你的批处理,看来还得改造成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 编辑 ]
作者: tuxw    时间: 2010-11-9 00:07
是有这个问题,Grub4Dos 的批处理需要直接运行,不能由 WENV 调用

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

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

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

[ 本帖最后由 tuxw 于 2010-11-9 00:15 编辑 ]
作者: zhaohj    时间: 2010-11-9 00:15
问题反过来了,知道某段落的部分内容,反查段落名。
作者: tuxw    时间: 2010-11-9 01:04
已经实现了 WENV find [-skip=S] [-len=L] [-end=STRING] [-c] [-r] STRING FILE
但有其它部分的代码(switch)正在修改,明天上传吧

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

顺手添加了个 -r,反向查找,正好满足你反查段名的问题,不过这部分没在代码里实现,需要自己批处理
作者: tuxw    时间: 2010-11-9 02: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 编辑 ]
作者: tuxw    时间: 2010-11-9 03:01
反查段名

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
作者: zhaohj    时间: 2010-11-9 07:58
想不到凌晨3点还在忙,辛苦了。万分感谢实现了我的需求。

今天好好测试,不能辜负你的成果!
作者: 510819776    时间: 2010-11-9 20:32
标题: 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 编辑 ]
作者: sratlf    时间: 2010-11-9 20:49
标题: 回复 #58 510819776 的帖子
很意外的发现  map iso和img的顺序不同居然还有区别  2003是哪个版本的  蓝屏的话蓝屏代码是什么  

能不能再帮忙测试下没有用nlite集成firadisk驱动的2003.iso交换map iso和img的顺序还蓝不蓝
作者: pseudo    时间: 2010-11-9 21:20
后一个菜单,后面加一行
rootnoverify (fd0)

[ 本帖最后由 pseudo 于 2010-11-9 21:21 编辑 ]
作者: zhaohj    时间: 2010-11-11 10:28
留下两个问题:
1:PXE列表问题
2:ZIP支持问题
作者: zhaohj    时间: 2010-11-12 22:37
C大,11-6的grldr测试版总算发现问题了:
http://bbs.wuyou.net/forum.php?m ... p;page=9#pid2083067
作者: zhaohj    时间: 2010-11-15 17:04
configfile会改变debug状态为debug 1,这个看来是grldr的bug
作者: chenall    时间: 2010-11-15 17:18
原帖由 zhaohj 于 2010-11-15 17:04 发表
configfile会改变debug状态为debug 1,这个看来是grldr的bug


这个可以算是bug,也可以不算.

configfile 是一个不可返回命令,执行的效果其实就是相当于重新加载GRLDR的过程只是省略了前面的过程直接加载新配置文件.

加载新的configfile相当于是进入了新的环境.

[ 本帖最后由 chenall 于 2010-11-15 17:20 编辑 ]
作者: zhaohj    时间: 2010-11-15 22:10
但下面这个肯定是bug,为何现在find会终止或找不到文件,可能与这个有关:
返回值不应该Error 15,不然终止了。
目前只有errorcheck off

[ 本帖最后由 zhaohj 于 2010-11-15 22:17 编辑 ]

Snap1.jpg (15.05 KB, 下载次数: 323)

Snap1.jpg

作者: chenall    时间: 2010-11-15 23:23
这个是正常的啊,找不到就返回错误。以前的版本一直是这样的吧。
作者: zhaohj    时间: 2010-11-16 09:31
测试版感觉总还有点问题,我同样的菜单,一个能执行,一个就无论如何执行不下去。
下面是虚拟成(fd2)的,find找不到

Snap1.jpg (70.06 KB, 下载次数: 296)

Snap1.jpg

作者: zhaohj    时间: 2010-11-16 09:35
而当root (fd2)时就没问题

Snap2.jpg (57.31 KB, 下载次数: 295)

Snap2.jpg

作者: chenall    时间: 2010-11-16 12:45
你看一下map --status的状态里面的软驱数量是多少。。
find是根据这个来查找的。

猜测可能是先map (fd2)再映射(fd1) (fd0),这样会导致软驱的数量没有增加

当root (fd2)时可以找到这是肯定的,因为查找时优先找当前root设备(之前的版本会找不到)

[ 本帖最后由 chenall 于 2010-11-16 12:48 编辑 ]
作者: zhaohj    时间: 2010-11-16 15:31
是先map (fd2),这个是主程序。

Snap1.jpg (68.17 KB, 下载次数: 295)

Snap1.jpg

作者: zhaohj    时间: 2010-11-16 15:43
测试发现,如果先map (fd0) (fd1),floppies_curr=2
再map (fd2),也不会增加floppies_curr,始终是2
可能是镜像文件非标准引起的?
再次测试,用标准格式的,也不会增加floppies_curr值,最多是2

下面的图是按顺序(fd0)~(fd3)map的

[ 本帖最后由 zhaohj 于 2010-11-16 15:49 编辑 ]

Snap1.jpg (76.07 KB, 下载次数: 292)

Snap1.jpg

作者: chenall    时间: 2010-11-16 16:28
原帖由 zhaohj 于 2010-11-16 15:43 发表
测试发现,如果先map (fd0) (fd1),floppies_curr=2
再map (fd2),也不会增加floppies_curr,始终是2
可能是镜像文件非标准引起的?
再次测试,用标准格式的,也不会增加floppies_curr值,最多是2

下面的 ...


哦,看来你得想其它办法解决问题了。因为标准的电脑中最多只有两个软驱,可能因为这个原因所以这个值不会大于2.

具体看不点怎么解释了。
作者: chenall    时间: 2010-11-16 16:52
刚上传了一个新的GRUB4DOS测试版本。

尝试支持多个外部命令同时运行。(即外部命令再次调用其它外部命令)

例子
wenv call exec chkpci ${pcicfg}

注:中间的exec是为了兼容之前的设计,代表执行的是一个外部程序。

另外请尽量不要在外部命令中调用那些不可返回的命令像configfile。因为会造成内存占用无法释放。

这个版本主要测试多外部命令执行还有目前简易内存管理机制是否有问题。
作者: zhaohj    时间: 2010-11-17 00:54
全面测试了新版grldr,没发现问题。稳定性也不错。
作者: zhaohj    时间: 2010-11-17 00:58
最理想的状况是不分内部命令、外部命令。
作者: zhaohj    时间: 2010-11-17 01:11
>及>>(管道),传输给FAT生成的文件,在grub下使用是没有问题的。但这个文件后要给其他系统使用,还是有问题的,

我在SRSF6生成软盘镜像时就发现了这个问题。
最理想的情况是>处理后,清空这个文件,这样减少用户的其他操作。
我现在不得不在内存清空文件大小的区域,复制给文件。
作者: jianliulin    时间: 2010-11-17 11:09
原帖由 zhaohj 于 2010-11-17 00:58 发表
最理想的状况是不分内部命令、外部命令。


对啊!!目前的外部命令都是比较常用的命令,稳定后能否考虑内置???
作者: chenall    时间: 2010-11-17 14:41
原帖由 jianliulin 于 2010-11-17 11:09 发表


对啊!!目前的外部命令都是比较常用的命令,稳定后能否考虑内置???


目前的GRUB4DOS程序已经够大的了,不会考虑内置,但是会有其它解决方案。
我还在考虑中,大家有什么好的方案也可以提出来。

理想状态是简单的打包然后附加在GRLDR尾部就可以使用。(GRUB.EXE不考虑)
作者: chenall    时间: 2010-11-17 16:40
@zhaohj
抱歉,没有看明白你前面所指的问题。
另外这里的问题也是稀里糊涂的。
http://bbs.wuyou.net/forum.php?m ... p;page=8#pid2086963


新的GRUB4DOS版本已经上传,重写优化了command_func(外部命令调用)的代码。

现在写外部命令可以省去以下几行。
        void *p = &main;
        char *arg = p - (*(int *)(p - 8));
        int flags = (*(int *)(p - 12));
直接把主函数声明为
int main(char *arg,int flags)就可以了。
作者: zhaohj    时间: 2010-11-17 17:22
哦,正在调试中;
发现11-17版本grldr会卡住,大概是wenv调用fat的时候

卡住后,按回车键就进入到命令行了

[ 本帖最后由 zhaohj 于 2010-11-17 17:24 编辑 ]

Snap1.jpg (128.92 KB, 下载次数: 291)

Snap1.jpg

作者: zxw    时间: 2010-11-17 17:24
这个应该是语法检查不够严格的地方。


以前的版本也一样。
作者: zhaohj    时间: 2010-11-17 22:42
这个问题比较纠结:在11-6的grub上正常运行的SRSF6.IMG,只更换grldr到11-17版本
出现:
初步怀疑是内存冲突或破坏所致。

[ 本帖最后由 zhaohj 于 2010-11-17 22:59 编辑 ]

Snap1.jpg (94.79 KB, 下载次数: 290)

Snap1.jpg

作者: chenall    时间: 2010-11-17 23:22
新版GRUB4DOS使用了从32MB开始的内存。

如果说有比较大的区别的话可能就在这里了,你可以检查一下是不是有使用了32MB处的内存.
作者: zhaohj    时间: 2010-11-18 00:01
0xb00000(11M~12M)这块区域有使用吗?
这块区域我当做临时存放的。
作者: chenall    时间: 2010-11-18 00:10
记得之前有用过这一块内存,具体的忘了在哪里用到了,应该是外部命令。
作者: zhaohj    时间: 2010-11-18 00:17
那现在最小的内存安全区域是那一块?
<1m就可以
--------------
换成其他内存区域0xf00000,也出现相同错误。

感觉错误是批处理结束后返回引起的,看下面已完成写操作,我的批处理已经结束,但还是出现错误:

[ 本帖最后由 zhaohj 于 2010-11-18 00:32 编辑 ]

Snap1.jpg (64.38 KB, 下载次数: 285)

Snap1.jpg

作者: chenall    时间: 2010-11-18 00:31
原帖由 zhaohj 于 2010-11-17 22:42 发表
这个问题比较纠结:在11-6的grub上正常运行的SRSF6.IMG,只更换grldr到11-17版本
出现:
初步怀疑是内存冲突或破坏所致。


这个要跟踪一下具体执行的命令是什么。
作者: chenall    时间: 2010-11-18 00:32
原帖由 zhaohj 于 2010-11-18 00:17 发表
那现在最小的内存安全区域是那一块?


批处理里面有非法字符?
作者: zhaohj    时间: 2010-11-18 00:37
我都一条命令一条命令手动输入过,都没有问题。
但运行批处理就不行,到结束处出现上述错误,实际上这时全部命令已经完成,是退出批处理出现的问题。

问题出在批处理模块上。
作者: zhaohj    时间: 2010-11-18 00:39
如果批处理中有非法命令,也不会终止的。
ERROR27是系统错误

我的批处理在http://bbs.wuyou.net/forum.php?mod=viewthread&tid=159851&page=83#pid2087181

[ 本帖最后由 zhaohj 于 2010-11-18 00:41 编辑 ]
作者: chenall    时间: 2010-11-18 00:47
原帖由 zhaohj 于 2010-11-18 00:39 发表
如果批处理中有非法命令,也不会终止的。
ERROR27是系统错误


GRUB4DOS的批处理是碰到错误就退出的,你可以在批处理中进行调试看看是哪一句出现的问题。
比如先注释最后一句再看看是否同样的问题。如果是再注释倒数第二句。

ERROR 27,在check、find中比较容易出现,一般是命令写错。

或者批处理中有非法字符(ASCII 值小于0X20的),还有一个可能是该命令不允许在这个地方执行。
作者: zhaohj    时间: 2010-11-18 00:49
我在批处理中每条命令后加 pause 查看过,都没有出现错误,但最后一条命令结束后,就出现上述错误。
批处理肯定没有问题,而且其他菜单中也使用过这个批处理也没有问题。

C大我在FTP中你下载测试一下,可能会发现这个隐藏的BUG

[ 本帖最后由 zhaohj 于 2010-11-18 00:57 编辑 ]
作者: chenall    时间: 2010-11-18 16:22
我应该大概知道这个产生的原因了.

我先测试下再上传一个新的版本.
作者: chenall    时间: 2010-11-18 17:03
新的版本已经上传,应该是修正了前面Error 27的bug.

另外新增加了一个内存变量在0000:8278处,以后可以通过这个变量来判断你菜单是否适用于该版本GRUB4DOS.
使用编译时的日期.比如今天上传的版本
read 0x8278 会显示0x132B7FE  (20101118)

以下命令可用于检测是否20101118以后的版本.
checkrange 20101118:-1 read 0x8278
作者: zhaohj    时间: 2010-11-18 17:11
哦,谢谢,马上测试 .................

-----------------------

测试汇报:全部通过!

无忧有你真精彩!

[ 本帖最后由 zhaohj 于 2010-11-18 17:19 编辑 ]
作者: zhaohj    时间: 2010-11-20 00:27
批处理中“:”是注释,但最后的注释出现错误

Snap1.jpg (30.69 KB, 下载次数: 309)

Snap1.jpg

作者: tuxw    时间: 2010-11-20 09:39
这个问题貌似要在批处理最后必须有个换行,不然检测不到批处理结束
作者: zhaohj    时间: 2010-11-20 09:49
是的,最后加换行OK !
作者: 2010lifefx    时间: 2010-11-21 03:07
标题: 这个是什么问题啊?


grub4dos 的版本 grub4dos-0.4.5b-2010-11-18.zip
作者: zhaohj    时间: 2010-11-21 10:53
这是老问题了。
一方面DOS设备加载程序或驻留程序破坏了中断向量;
另一方面,可能也是最关键的是主板生产厂家的故意为之。BIOS陷阱。




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3