无忧启动论坛

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

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
931#
发表于 2011-5-23 18:53:15 | 只看该作者
原帖由 chenall 于 2011-5-23 16:57 发表
再试了几次发现问题了,

我看看先。

麻烦试试这个看看。



我也看了一下午的代码,C语言 我还是个新手,

grub4dos-0.4.4-2009-03-29p-src,fsys_pxe.c,
int pxe_detect (int blksize, char *config)  232-250行:

ret = pxe_dir (pxe_tftp_name);

done:
  if (ret)
    {
#if 1
char *new_config = config_file;
char *filename = (char *)pxe_tftp_open.FileName;
pxe_close ();
/* got file name. put it in config_file */
if (grub_strlen (filename) >= ((char *)0x8270 - new_config))
  return ! (errnum = ERR_WONT_FIT);
/* set (pd) as root device. */
saved_drive = PXE_DRIVE;
saved_partition = 0xFFFFFF;
/* Copy FILENAME to CONFIG_FILE.  */
while ((*new_config++ = *filename++) != 0);

我觉得这里有1个逻辑错误:从grub4dos的pxe命令来看,新版本基于pxe basedir的相对路径读文件,
而pxe_tftp_open.FileName是相对于(tftproot)的绝对路径吧,
我觉得这里应该向 config_file变量返回 菜单文件 基于pxe basedir的相对路径,
即:
将char *filename = (char *)pxe_tftp_open.FileName;
改为char *filename = (char *)pxe_tftp_name;
应该可以解决问题,


我这里没有开发/编译环境,

不知我说得对不对:)

[ 本帖最后由 2011exuejiao 于 2011-5-23 18:57 编辑 ]
回复

使用道具 举报

932#
发表于 2011-5-23 19:07:32 | 只看该作者
原帖由 chenall 于 2011-5-23 16:57 发表
再试了几次发现问题了,

我看看先。

麻烦试试这个看看。



这个test版本解决了问题,

这个特性会合到后续所有版本中去吗?:)
回复

使用道具 举报

933#
发表于 2011-5-23 19:18:53 | 只看该作者
@2011exuejiao
能用我就更新上传了,确实就是你上面所说的问题。以后的版本就不会有这样的问题了。
谢谢你的详细报告,又解决了一个BUG.
回复

使用道具 举报

934#
发表于 2011-5-24 14:13:07 | 只看该作者
原帖由 chenall 于 2011-5-17 21:52 发表


因为查找是以16个字节为基数的,所以最好是16的倍数。

我记得之前曾经尝试过修正这个情况的,改天抽空再看一下。

这个建议抽空修正。
回复

使用道具 举报

935#
发表于 2011-5-24 14:52:55 | 只看该作者

回复 #938 zxw 的帖子

晚上在研究一下...

另外准备把批处理的调试模式修改一下,以前是debug on的时候就开启调试。

发现这样子有时候会有些麻烦。

前面已经有改过一次了,在批处理内部debug 3也可以开启。

我考虑了一下,觉得按zhaohj前面的方案也是个不错的选择。
((debug_ori == 3 || debug == 3) && (debug != 4))
debug_ori是执行批处理前的debug值。
即如果在执行批处理前的debug 值等于3或者当前的debug值等于3并且debug的值不等于4的时候才会进入调试模式。

另外在调试模式中可以按'C键'进入命令行,按'n'键可以中止脚本.
回复

使用道具 举报

936#
发表于 2011-5-24 14:56:43 | 只看该作者
chenall 能否考虑添加对ud文件操作,就像fat模块一样
回复

使用道具 举报

937#
发表于 2011-5-24 16:16:03 | 只看该作者
原帖由 chenall 于 2011-5-24 14:52 发表
我考虑了一下,觉得按zhaohj前面的方案也是个不错的选择。
((debug_ori == 3 || debug == 3) && (debug != 4))
debug_ori是执行批处理前的debug值。
即如果在执行批处理前的debug 值等于3或者当前的debug值等于3并且debug的值不等于4的时候才会进入调试模式。

支持这样分类处理。
另debug值为4时有什么特殊用途?或留待以后另用?

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

使用道具 举报

938#
发表于 2011-5-24 16:32:57 | 只看该作者

回复 #940 jianliulin 的帖子

这个不行,我也没有那个精力去搞这些了。
等别人出手
回复

使用道具 举报

939#
发表于 2011-5-24 16:34:13 | 只看该作者

回复 #941 zxw 的帖子

debug 4暂定为临时停用批处理调试模式。没有其它用途(但还是属于debug on)

[ 本帖最后由 chenall 于 2011-5-24 19:04 编辑 ]
回复

使用道具 举报

940#
发表于 2011-5-24 19:29:57 | 只看该作者
尝试修复cat 的问题。麻烦测试一下。

还有修改了前面的批处理调试模式的设定。

[ 本帖最后由 chenall 于 2011-5-25 00:43 编辑 ]
回复

使用道具 举报

941#
发表于 2011-5-24 20:21:33 | 只看该作者

回复 #944 chenall 的帖子

cat 反倒更有问题了。debug 我测试正常。



[ 本帖最后由 zxw 于 2011-5-24 20:34 编辑 ]
回复

使用道具 举报

942#
发表于 2011-5-24 20:59:45 | 只看该作者

回复 #945 zxw 的帖子

应该算是正常的,因为超过的部份都是\0的。
回复

使用道具 举报

943#
发表于 2011-5-24 21:02:39 | 只看该作者

回复 #946 chenall 的帖子

--length=9时,是正常的?不对吧!
再看看下图,前面两个明显是错误的。


[ 本帖最后由 zxw 于 2011-5-24 21:04 编辑 ]
回复

使用道具 举报

944#
发表于 2011-5-24 21:06:44 | 只看该作者
我是说你不应该找\0
比如长度是9,因为每次读取的是16字节,那就会把后面的部份清0.

即9以上的都是会\0.

也许你可能觉得很难理解。再考虑看看有什么比较好的方法
回复

使用道具 举报

945#
发表于 2011-5-24 21:19:16 | 只看该作者

回复 #948 chenall 的帖子

嗯,测试查找非\0的一切正常。
我大概明白了,可能是以循环的方式,每16字节读入缓存,将超出length值的部分清0,便于快速操作,方法确实巧妙。
但总不能将查找\0排除在外吧。

[ 本帖最后由 zxw 于 2011-5-24 21:22 编辑 ]
回复

使用道具 举报

946#
发表于 2011-5-24 21:29:51 | 只看该作者

回复 #949 zxw 的帖子

唉,没有学过算法,现在的cat查找效率还是很低的。

我先找找资料,看看有没有什么好的办法。
回复

使用道具 举报

947#
发表于 2011-5-24 21:45:23 | 只看该作者

回复 #950 chenall 的帖子

这样处理已经很不错了。毕竟查找\0的情形相当少,或者列为一个小bug先搁置下来,待以后条件成熟时再解决。
可惜我水平太次,看了几次cat部分的代码,奈何看不懂,帮不上忙,只能在外围助阵。

[ 本帖最后由 zxw 于 2011-5-24 21:47 编辑 ]
回复

使用道具 举报

948#
发表于 2011-5-25 00:44:18 | 只看该作者
重新上传了一个,麻烦多情况测试一下,如果没有什么大的问题就先这样子了,以后再考虑改进。

grldr.rar

128.8 KB, 下载次数: 13, 下载积分: 无忧币 -2

回复

使用道具 举报

949#
发表于 2011-5-25 08:47:22 | 只看该作者

回复 #952 chenall 的帖子

很快,真棒,测试正常。
回复

使用道具 举报

950#
 楼主| 发表于 2011-5-25 11:52:46 | 只看该作者
下面是动态生成的菜单文件:
帮我看看哪里错了?rd在0x40000 ,大小4K

Snap1.jpg (31.66 KB, 下载次数: 125)

Snap1.jpg

Snap2.jpg (34.12 KB, 下载次数: 139)

Snap2.jpg
回复

使用道具 举报

951#
发表于 2011-5-25 12:14:42 | 只看该作者
貌似没有问题。
试试这样:
if exist ac && set /a ac=0x%ac%-3 ! pause --wait=10 NOActive Partition && goto 3
回复

使用道具 举报

952#
 楼主| 发表于 2011-5-25 12:23:13 | 只看该作者
问题是configfile (rd)+1后,把变量直接扩展了。而这时还没有运行,这个变量是不存在的,导致set ac=0x,本应该set ac=0x%ac%
回复

使用道具 举报

953#
发表于 2011-5-25 12:31:52 | 只看该作者
能不能用"%%"作延後處理?
回复

使用道具 举报

954#
发表于 2011-5-25 12:37:57 | 只看该作者

回复 #954 zhaohj 的帖子

这个不影响使用吧,其实在configfile (rd)+1的时候是还没有扩展的。要等到执行的时候才会扩展。

因为菜单支持扩展,所以在菜单显示的时候就会进行扩展了(但只针对菜单的显示),使用菜单的编辑功能其实这个也算是另一种菜单。
回复

使用道具 举报

955#
 楼主| 发表于 2011-5-25 12:38:43 | 只看该作者
原帖由 2010roytam1 于 2011-5-25 12:31 发表
能不能用"%%"作延後處理?


这个我想到了,没用的。等待C大来处理...
回复

使用道具 举报

956#
 楼主| 发表于 2011-5-25 14:12:20 | 只看该作者
解决了,用批处理动态生成菜单,P处理中的变量在exit前最好清空,不然在菜单语句中变量直接扩展了。
回复

使用道具 举报

957#
 楼主| 发表于 2011-5-26 17:13:41 | 只看该作者
C大,chkpci是否要加入新的cc段?

http://bbs.wuyou.net/forum.php?m ... p;page=3#pid2240508
回复

使用道具 举报

958#
发表于 2011-5-26 17:49:24 | 只看该作者

回复 #961 zhaohj 的帖子

抱歉,我没有看明白。
回复

使用道具 举报

959#
发表于 2011-5-26 21:59:28 | 只看该作者
原帖由 chenall 于 2011-5-24 14:52 发表
我考虑了一下,觉得按zhaohj前面的方案也是个不错的选择。
((debug_ori == 3 || debug == 3) && (debug != 4))
debug_ori是执行批处理前的debug值。
即如果在执行批处理前的debug 值等于3或者当前的debug值等于3并且debug的值不等于4的时候才会进入调试模式。


批处理的调试模式比较特殊,应该使用比较高的debug值,比如 debug==99,数值较大取意为最/更详细的输出信息(相当于一个总开关)
一来判断比较简洁,另外其它地方使用debug值影响较小,可以仍然采用 debug > n 或 debug on,可以连续的使用debug值而不必特意跳过 3


cat --locate=\0 ...
我觉得用文本的语法去查找二进制值要求本身就不合理
cat --hex --locate=0x00 ...
用这个语法程序设计上反而好搞一点,充分的利用已有的参数,判断的代码都省了

[ 本帖最后由 tuxw 于 2011-5-26 22:01 编辑 ]
回复

使用道具 举报

960#
发表于 2011-5-26 22:10:28 | 只看该作者
原帖由 zhaohj 于 2011-5-25 11:52 发表
下面是动态生成的菜单文件:
帮我看看哪里错了?rd在0x40000 ,大小4K


寻找活动分区的方法不可靠,geometry 的输出信息太长了,一个扇区很悬(增加暂存扇区数,也会受管道缓冲区长度限制),分区稍微复杂点活动分区又靠后时就会失败
活动分区最多只有4个可能,逐个判断反而更简洁
set ac=
makeactive --status (hd0,0) && set ac=0
makeactive --status (hd0,1) && set ac=1
makeactive --status (hd0,2) && set ac=2
makeactive --status (hd0,3) && set ac=3
if exist ac && echo %ac% ! echo NO ...

或者用外部命令
wenv gpart 0 && if exist GP_G4D_A && wenv echo ${GP_G4D_A} ! echo NO ...

或用原版的wenv
wenv reset ac ]]] for /L %i in (0,1,3) do (call makeactive --status (hd0,%i) ]]& (set ac=%i ; break))

[ 本帖最后由 tuxw 于 2011-5-26 22:32 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-23 13:00

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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