无忧启动论坛

标题: GRUB4DOS发现一个BUG问题!!!(chenall老师又有一个新问题帮忙看看!) [打印本页]

作者: thttht    时间: 2010-4-10 10:19
标题: GRUB4DOS发现一个BUG问题!!!(chenall老师又有一个新问题帮忙看看!)
chenall老师我在前几天向你请教过这方面的问题,下面是我当时的问题,你当时说我用的外部命令版本太旧!因为后来工作上忙这个就没有时间详细的实验!今天详细实验一下发现不是外部命令版本太旧,而是GRUB4DOS在加载字体文件后就会出现下面的情况,英文版的GRUB4DOS用UNIFONT /U16.bin命令加载中文字体后同样会出现下面的问题!(GRUB4DOS和外部命令都用的是最新版本的!)但功能并不受影响,如果一次性的输入正确的路径不修改的话可以正常使用!只是输入自定义文件名和路径时不能用删除键,每按删除键一下只是在输入错了的文件名后又加入了一个乱码符号!

还有一个问题,这个不是BUG问题,WENV 设置变量是不是有字符个数的限制啊?输入自定义路径和文件名过长是不是不行啊?如果有这样的限制具体这个限制是多少个字符啊?

---------------------------------------------------------------------------------------------------
我是要写一个加载一个可启动ISO光盘或可启动IMG软盘没有找到后也加入一个可以自定义路径和文件名的程序菜单!
现在测试在输入自定义文件名和路径时不能用删除键,不小心输入错了只能执行完后再从新输入!你的不这样的!
-------------------------------------------------------------------------------------------------------
我上面说的版本太旧是指你用的外部命令。
---------------------------------------------------------------------------------------------------


谢谢chenall老师帮助解决这个问题!也期待内置菜单使用UNIFONT的问题!你的最新回复和对WENV的升级我看到了,谢谢你了!辛苦了!

同时我在应用中又遇到一个问题希望你能帮忙看看!
关于WENV设置变量在应用时有一个问题!
WENV run map --mem ${F6} (fd0)
WENV run map --mem ${WinPE} (0xff)
map --hook
chainloader (0xff)
boot
在这种应用中有一个必须满足的要求才能成功,就是F6文件必须和WinPE文件在同一个分区内才会成功!这个条件是必须得满足的,如果这两个文件分别在两个不同的分区里启动就肯定会失败!请问能不能改进WENV来解决一样的问题啊?

[ 本帖最后由 thttht 于 2010-4-17 17:47 编辑 ]
作者: sratlf    时间: 2010-4-10 14:32
顺便也请Chenall大看下这个问题,有关Map iso的<br />
<br />
前几天帮一同学重装系统,机子是Tp sl400,装的是Xp sp3 msdn原版<br />
<br />
安装方法是用Grub4dos先加载Firadisk最新版再map --mem iso (iso放在硬盘上了)<br />
<br />
开始时一切正常,可进入Txt文本安装,也可看到硬盘,但是在复制文件时卡在72%处<br />
<br />
大概有十几分钟,然后就提示安装程序无法从源复制文件,是重试还是忽略<br />
<br />
选重试无用,继续提示,剩余28%的文件都是选的跳过,都没有复制成功<br />
<br />
怀疑是到了72%处Map的Iso失效了<br />
<br />
而且重启后再运行相同步骤到选择分区处只看到主分区和一个逻辑分区,还有两个逻辑分区不见了,显示未识别<br />
<br />
后来进Pe重新建立Mbr和分区表,再进行安装发现硬盘分区识别正常,但是到了72%还是卡死<br />
<br />
Ps:已经用这种方法成功安装过很多机子,只有一台出现这样的错误
作者: sratlf    时间: 2010-4-10 14:57
标题: 回复 #2 sratlf 的帖子
手机发帖不太好编辑,就再回复一下了

刚才忘说了,到72%卡住的文件名是Gdiplus.dll

有的时候用Ghost恢复系统也会在这个文件上卡下

不知道是不是和这个文件有关
作者: zhaohj    时间: 2010-4-10 17:52
是不是使用方法有问题。我这里测试正常啊。
菜单文件有没有使用UTF格式。
作者: thttht    时间: 2010-4-10 18:04
我这里其他功能都正常啊!输入正确的自定义的路径文件名后也可以启动!英文版的加载字体也正常,显示中文没有问题!菜单文件使用UTF格式了,中文版的和英文版的在我这里都是不加载字体删除键就好用,加载字体后就不行了,这两种情况我只是改了菜单加载中文字体这部分其他的地方没有动啊,完全一样的。GRUB4DOS文件也用的是同一个!!!


find --set-root /boot/grub/fonts.gz || find --set-root /grub/fonts.gz
command --set-path=()/boot/grub/ || command --set-path=()/grub/

pxe detect
configfile
default 4
timeout 10


WENV init
debug off
#初始化并设置默认参数。
write 0x60000 0
write 0x60100 0
WENV set ISO=/boot/PE.ISO


find --set-root /BOOT/grub/fonts.gz || find --set-root /grub/fonts.gz || find --set-root /BOOT/fonts.gz || find --set-root /fonts.gz
fontfile /BOOT/grub/fonts.gz || fontfile /grub/fonts.gz || fontfile /BOOT/fonts.gz || fontfile /fonts.gz


title 【 04 】 查找并运行《 PE.ISO 光盘 》 \n\n\查找/boot/PE.ISO文件,如果没有找到提示用户输入一个文件路径,并返回重新查找。
WENV get ISO || fallback --go 14
WENV run ECHO find ${ISO} on your hard disk drive..
WENV run find --set-root ${ISO} || WENV set ISO=$input,Input new ISO file PATH: && fallback --go 3
WENV run map ${ISO} (0xff) || WENV run map --mem ${ISO} (0xff)
map --hook
chainloader (0xff)
boot

[ 本帖最后由 thttht 于 2010-4-10 18:09 编辑 ]
作者: zhaohj    时间: 2010-4-11 10:14
变量名不能超过7个字符.
变量值不能超过511个字符
最多保存64个变量.

英文版grldr配合外置命令UNIFONT或FONTFILE是最理想的选择。
作者: chenall    时间: 2010-4-11 16:38
@thttht
只有在图形模式下才会这样,其实只是显示的问题,实际上已经改了。只不过图形模式没有处理退格字符所以才会这样。

@sratlf
也许是你的内存有问题,也许是硬盘有问题。
作者: sratlf    时间: 2010-4-11 17:31
标题: 回复 #7 chenall 的帖子
不是我的机子  要是我的机子分析就方便了   

内存应该没有问题   开始也怀疑内存有问题  用MEMTEST检测了下没发现错误

就是硬盘速度很慢  而且感觉分区表好像也有问题  因为第一次安装选择硬盘时看不到最后两个分区  改了分区表后才能看见  就是还是有问题
作者: thttht    时间: 2010-4-12 09:16
原帖由 chenall 于 2010-4-11 16:38 发表
@thttht
只有在图形模式下才会这样,其实只是显示的问题,实际上已经改了。只不过图形模式没有处理退格字符所以才会这样。

@sratlf
也许是你的内存有问题,也许是硬盘有问题。




我使用时发现不管是英文版的还是中文版的只要是不加载字体文件就没有这个显示问题,中文版的用fontfile /BOOT/grub/fonts.gz 加载字体,英文版的用UNIFONT /U16.BIN加载字体后才出现这个问题!不加载中文字体时就没问题!可以用退格键显示很正常!中文版和英文版加载字体后的确是向chenall老师你说的那样也能用退格键只是在显示上有问题,不知道这个可以在以后的版本中修复吗?

谢谢zhaohj ,在你们的热心帮助和讲解下我们才能有进步!学到很多有用的东西!!!
现在我一般还在用中文版的,chenall也和我说过和你一样的观点用英文版grldr配合外置命令UNIFONT,但我现在多数时候还在用内置菜单和内置外部菜单配合使用,希望grldr早点支持内置菜单UNIFONT的多语言显示的问题就好了!

变量名不能超过7个字符.
变量值不能超过511个字符
最多保存64个变量.

英文版grldr配合外置命令UNIFONT或FONTFILE是最理想的选择。

---------------------------------------------------------------------------
谢谢你们这些程序员无私的奉献我们才能用到这么好的程序!!!!

[ 本帖最后由 thttht 于 2010-4-12 10:58 编辑 ]
作者: mood100    时间: 2010-4-16 14:24
高手分析后,又学到东西了!
作者: zhaohj    时间: 2010-4-16 15:36
加载中文后,选中某一菜单后进入下一个菜单,这个“下一菜单”如果不用中文的,可以退出图形界面:
terminal console
这样避免了退格键乱码问题。

新版SRS_F6就是这样处理的(0415中文版)。
作者: thttht    时间: 2010-4-16 17:19
谢谢!学习了!这的确是个好办法!
作者: chenall    时间: 2010-4-17 16:56
我明天会再发布一个版本(WENV和GRUB4DOS要一起更新)

解决这个问题,新wenv的input功能将可以使用自动完成等功能(和GRUB4DOS命令行一样),这样可以更方便操作。因为直接调GRUB4DOS的get_cmdline功能.

晚上如果有空再顺便看看能不能解决内置菜单使用UNIFONT的问题。

[ 本帖最后由 chenall 于 2010-4-17 16:57 编辑 ]
作者: thttht    时间: 2010-4-17 17:42
谢谢chenall老师帮助解决这个问题!也期待内置菜单使用UNIFONT的问题!
同时还有一个问题希望你能帮忙看看!
关于WENV设置变量在应用时有一个问题!
WENV run map --mem ${F6} (fd0)
WENV run map --mem ${WinPE} (0xff)
map --hook
chainloader (0xff)
boot
在这种应用中有一个必须满足的要求才能成功,就是F6文件必须和WinPE文件在同一个分区内才会成功!这个条件是必须得满足的,如果这两个文件分别在两个不同的分区里启动就肯定会失败!请问能不能改进WENV来解决一样的问题啊?
作者: zhaohj    时间: 2010-4-17 17:54
虚拟机测试,UNIFONT第一次正常,第二次启动有时会花屏。
关闭虚拟机再次打开运行又正常,感觉不太稳定。
作者: chenall    时间: 2010-4-17 18:00
原帖由 thttht 于 2010-4-17 17:42 发表
谢谢chenall老师帮助解决这个问题!也期待内置菜单使用UNIFONT的问题!
同时还有一个问题希望你能帮忙看看!
关于WENV设置变量在应用时有一个问题!
WENV run map --mem ${F6} (fd0)
WENV run map --mem ${ ...


不太明白你指的是什么?

如果你的F6和WINPE都是绝对路径,应该都是要成功的吧.
作者: zhaohj    时间: 2010-4-17 18:02
原帖由 thttht 于 2010-4-17 17:42 发表
谢谢chenall老师帮助解决这个问题!也期待内置菜单使用UNIFONT的问题!
同时还有一个问题希望你能帮忙看看!
关于WENV设置变量在应用时有一个问题!
WENV run map --mem ${F6} (fd0)
WENV run map --mem ${ ...


改成这样行吗?
WENV run find --set-root ${F6}
WENV run map --mem ()${F6} (fd0)
WENV run find --set-root ${WinPE}
WENV run map --mem ()${WinPE} (0xff)

注意没/,因为${F6}已经带路径。
作者: chenall    时间: 2010-4-17 18:03
原帖由 zhaohj 于 2010-4-17 17:54 发表
虚拟机测试,UNIFONT第一次正常,第二次启动有时会花屏。
关闭虚拟机再次打开运行又正常,感觉不太稳定。


我还没有发现这样的情况.....
作者: zhaohj    时间: 2010-4-17 18:19
这个我虚拟机可以重现,明天截个图看看。
花屏后,菜单的英文字符都不对齐了。
作者: zhaohj    时间: 2010-4-19 08:23
"find 命令添加一个 --ignore-oem 参数"是什么意思?
作者: thttht    时间: 2010-4-19 08:50
原帖由 chenall 于 2010-4-17 18:00 发表


不太明白你指的是什么?

如果你的F6和WINPE都是绝对路径,应该都是要成功的吧.


find --set-root /boot/grub/fonts.gz || find --set-root /grub/fonts.gz
command --set-path=()/boot/grub/ || command --set-path=()/grub/

pxe detect
configfile
default 4
timeout 10


WENV init
debug off
#初始化并设置默认参数。
write 0x60000 0
write 0x60100 0
WENV set ISO=/boot/PE.ISO

find --set-root /BOOT/grub/fonts.gz || find --set-root /grub/fonts.gz || find --set-root /BOOT/fonts.gz || find --set-root /fonts.gz
fontfile /BOOT/grub/fonts.gz || fontfile /grub/fonts.gz || fontfile /BOOT/fonts.gz || fontfile /fonts.gz

title 【 04 】 查找并运行《 PE.ISO 光盘 》 \n\n\查找/boot/PE.ISO文件,如果没有找到提示用户输入一个文件路径,并返回重新查找。
WENV get ISO || fallback --go 14
WENV run ECHO find ${ISO} on your hard disk drive..
WENV run find --set-root ${ISO} || WENV set ISO=$input,Input new ISO file PATH: && fallback --go 3
WENV run map ${ISO} (0xff) || WENV run map --mem ${ISO} (0xff)
map --hook
chainloader (0xff)
boot

在这样的时候必须要PE.ISO文件在和grub程序及外部命令文件在同一个分区内才会成功!这个条件是必须得满足的,如果这两个文件分别在两个不同的分区里,启动就肯定会失败!不知道我这回的意识说明白了吗?

不知道是我菜单那里有问题才出现这样的错误!还是现在就有这样的限制!请chenall老师帮我看看我这个问题出在那里?

[ 本帖最后由 thttht 于 2010-4-19 11:39 编辑 ]
作者: chenall    时间: 2010-4-19 15:05
对不起,我还是没有完全明白。
具体是什么失败,WENV执行失败?map命令失败?还是????

不过对于command --set-path建议使用一个绝对路径(尽量保证这个路径一直可以访问)
作者: zhaohj    时间: 2010-4-19 15:10
一:外部命令不能调用外部命令;
二:太多的find不是一个好习惯,反而会造成更多的失败;G4D不是高级语言,很多受硬件制约。
三:上面WENV run find --set-root ${ISO},如不成功,执行WENV set ISO=$input,Input new ISO file PATH: && fallback --go 3,肯定无条件转到3
      如果WENV run find --set-root ${ISO}成立,下面的语句肯定会执行的。

四:WENV set ISO=/boot/PE.ISO写法有问题,要么全大写,要么全小写。find中也是。大小写混合肯定失败。
作者: zhaohj    时间: 2010-4-19 15:17
报告C大,新版WENV解决了input图形模式下的输入问题。感谢!

另外,UNIFONT及FONTFILE有什么办法卸载?能不能做个参数 --u
作者: chenall    时间: 2010-4-19 16:21
http://chenall.net/2010/04/grub4dos_unifont/

呵呵,我忘了给unifont加帮助提示信息了,本身有卸载功能的
--unload
作者: zhaohj    时间: 2010-4-19 17:49
又发生字符错位了,不过不是每次

Snap1.jpg (130.88 KB, 下载次数: 101)

Snap1.jpg

作者: guoqqqqqq    时间: 2010-4-19 18:08
原帖由 zhaohj 于 2010-4-19 17:49 发表
又发生字符错位了,不过不是每次


看来英文版GRUB加载中文字库的效果,不如中文版GRUB加载中文字库的显示效果稳定。
作者: chenall    时间: 2010-4-19 22:31
是用UNIFONT还是FONTFILE?
作者: zhaohj    时间: 2010-4-19 22:37
错误在所难免,发现错误才能改正错误。

上面都写了半个汉字(左半边),还有半个汉字(右半边)哪里去了?

用UNIFONT
作者: chenall    时间: 2010-4-19 23:35
能不能把你的菜单文件传给我一下,我看看有没有办法重现。

另外因为程序是在4M-6M中运行的,如果有其它程序修改了这其中的内存数据就有可能造成这种情况。
你试试在出现这种情况后进入命令行执行以下命令看看它的值是多少。
read 0x400018

程序没有对内存数据进行保护(因为我不懂,呵呵)。

[ 本帖最后由 chenall 于 2010-4-19 23:59 编辑 ]
作者: zhaohj    时间: 2010-4-20 08:06
文件放在FTP://60.190.19.108/zhhsh/20100415正式版

我虚拟机VM7.0可以重现,不过要多试几次。

[ 本帖最后由 zhaohj 于 2010-4-20 08:13 编辑 ]

Snap2.jpg (108.76 KB, 下载次数: 118)

正常的

正常的

Snap1.jpg (97.76 KB, 下载次数: 102)

非正常的

非正常的

作者: zhaohj    时间: 2010-4-20 09:05
在乱码情况下,write 0x400018  0xb 就不乱码了。
这就是说,0x400018需要保护或RESET.

现在解决办法是在UNIFONT前write 0x400018  0xb 确保不乱码(实际上也不能说乱码,是只写了半个汉字)。
作者: chenall    时间: 2010-4-20 12:44
谢谢zhaohj .

明白了,晚上上传一个新版本

[ 本帖最后由 chenall 于 2010-4-20 13:11 编辑 ]
作者: thttht    时间: 2010-4-20 14:47
原帖由 chenall 于 2010-4-19 15:05 发表
对不起,我还是没有完全明白。
具体是什么失败,WENV执行失败?map命令失败?还是????

不过对于command --set-path建议使用一个绝对路径(尽量保证这个路径一直可以访问)



不好意思!我的这个菜单在执行时并不是WENV执行失败而是在执行map命令时失败的,执行这个菜单时手动输入的文件必须和外部命令在同一个分区不然在执行map命令时就会失败!说找不到文件!其实WENV执行手动输入的文件路径和文件名时已经通过并找到了文件后执行下一步map命令时会失败!在整个过程中WENV执行没有什么问题,问题出在WENV执行完进行下一步map命令时!如果外部命令和手动输入的文件在同一个分区里,目录路径不同也没有关系,就会成功启动!

在你的提示下我把command --set-path使用一个绝对路径后以上问题就没有了!看来还是因为我原来菜单command --set-path设置和后面的WENV执行手动输入的文件后并map时WENV变量的设备根目录和我原来菜单command --set-path设置的根目录有冲突吧?是不是在command --set-path没有用绝对路径而搜索到的路径和WENV变量搜索储存的文件根目录产生了混淆而导致map时是到command --set-path的根目录里找文件而没有在WENV变量手动输入的搜索到的文件根目录去map文件,这样路径相同但设备根目录已经改变导致map文件时找不到文件了!不知道这种问题应该是使用方法方面的错误还是属于WENV和command --set-path搜索设置路径方面冲突的BUG!!!

不过问题已经找到并按你的方法解决设置绝对路径!!!谢谢chenall老师!这个属于不属于BUG我不太清楚!同时也感谢zhaohj对我的帮助!谢谢!!!
作者: zhaohj    时间: 2010-4-20 15:09
失败的情况下,你返回到命令行查看一下
GRUB>command
我想一般(bd)是不会变的,你的主要问题还是大小写混合引起的。
G4D对大小写太敏感了,设备名都是小写,文件名扩展名包括路径要么全大写,要么全小写。
象这个 map --mem (fd3)/srs/srs_f6.IMG (rd)就不行,map --mem (fd3)/SRS/SRS_F6.img (rd)也不行
          map --mem (FD3)/srs/srs_f6.img (rd)就不行,map --mem (fd3)/SRS/SRS_F6.IMG (RD)也不行

         map --mem (fd3)/srs/srs_f6.img (rd)就行,map --mem (fd3)/SRS/SRS_F6.IMG (rd)也行
作者: thttht    时间: 2010-4-20 15:33
原帖由 zhaohj 于 2010-4-20 15:09 发表
失败的情况下,你返回到命令行查看一下
GRUB>command
我想一般(bd)是不会变的,你的主要问题还是大小写混合引起的。
G4D对大小写太敏感了,设备名都是小写,文件名扩展名包括路径要么全大写,要么全小写。
...



这个在你上次发帖说的时候这个问题我已经改了!现在看应该不完全是大小写的问题!我个人觉得还是command --set-path搜索并设置的根设备和后面WENV变量搜索储存的文件根目录产生了相互影响!command --set-path不用搜索设置而是直接指定使用绝对路径相同的菜单就不会出现这样的问题了!这个菜单如果你修改好大小写的问题在虚拟机里把GRUB4DOS和外部命令放在硬盘A分区,把要加载的ISO文件放在硬盘B分区,command --set-path这里用
find --set-root /boot/grub/fonts.gz 
command --set-path=()/boot/grub/

不直接指定使用绝对路径应该可以重现我说的现象!
作者: chenall    时间: 2010-4-20 15:50
找不到文件可能是提示找不到WENV文件。。
你必须保证wenv可以访问。

不建议使用
command --set-path=()/boot/grub/

因为这时如果执行了root命令那就可能会找不到外部命令。

所以你还是先试试使用绝对路径像(bd)或(hd0,0)之类的。
作者: chenall    时间: 2010-4-20 15:52
对于外部命令
有空我会尝试一些改进。只要第一次执行这个命令成功,就把这个命令放到内存中。这样一般就不会找不到了。
作者: thttht    时间: 2010-4-20 16:01
原帖由 chenall 于 2010-4-20 15:50 发表
找不到文件可能是提示找不到WENV文件。。
你必须保证wenv可以访问。

不建议使用
command --set-path=()/boot/grub/

因为这时如果执行了root命令那就可能会找不到外部命令。

所以你还是先试试使用绝对 ...



这个时候wenv应该是可以访问的,
WENV run find --set-root ${ISO} || WENV set ISO=$input,Input new ISO file PATH: && fallback --go 3
执行完这一步时都没有问题接下来就执行
WENV run map ${ISO} (0xff) || WENV run map --mem ${ISO} (0xff)
这一步时提示找不到文件,这之间没有在执行root命令,
我马上用命令行试试提示找不到文件到底是找不到WENV文件了还是找不到ISO文件!

我现在是按你的建议command --set-path使用了绝对路径,并且在使用了绝对路径后这个问题也的确是解决了!

================================================================================================
有空我会尝试一些改进。只要第一次执行这个命令成功,就把这个命令放到内存中。这样一般就不会找不到了。

不知道是不是可以把比较成熟稳定的外部命令加入到 GRUB4DOS中啊!

[ 本帖最后由 thttht 于 2010-4-20 16:05 编辑 ]
作者: zhaohj    时间: 2010-4-20 16:06
原帖由 chenall 于 2010-4-20 15:52 发表
对于外部命令
有空我会尝试一些改进。只要第一次执行这个命令成功,就把这个命令放到内存中。这样一般就不会找不到了。


那这个外部命令成功,其他外部命令怎办?
我觉得这样很好,放到内存万一冲突或覆盖也很麻烦。
作者: thttht    时间: 2010-4-20 16:32
经测试的确是由于ISO文件和外部命令不在同一个分区,command --set-path又没有使用绝对路径导致在执行WENV set ISO=$input,Input new ISO file PATH: 时root根目录的改变使WENV外部命令找不到!下面的WENV run map --mem ${ISO} (0xff)也就失败了!这里提示的找不到文件的确是在执行WENV run map --mem时已经找不到外部命令WENV!ISO文件和外部命令在同一个分区时root根目录不会改变也就可以成功启动了!

[ 本帖最后由 thttht 于 2010-4-20 16:34 编辑 ]
作者: chenall    时间: 2010-4-20 16:39
原帖由 zhaohj 于 2010-4-20 16:06 发表


那这个外部命令成功,其他外部命令怎办?
我觉得这样很好,放到内存万一冲突或覆盖也很麻烦。


当然没有那么简单了。

到时会在内存中开辟一个区域,根据需要(可以设定一个参数)把外部命令放到内存中(这样就相当于内部命令了),只要这个命令使用过一次以后就从内存读取。
作者: zhaohj    时间: 2010-4-20 16:42
C大有空看看下面的,是不是可以取消INIFILE的65535B限制
http://www.cnblogs.com/strinkbug/archive/2008/12/18/1357801.html
作者: chenall    时间: 2010-4-20 17:23
新版UNIFONT已经上传,麻烦测试一下。

INIFILE,现在好像用不上了。。
作者: zhaohj    时间: 2010-4-21 08:47
原帖由 chenall 于 2010-4-20 17:23 发表
新版UNIFONT已经上传,麻烦测试一下。

INIFILE,现在好像用不上了。。


完美解决,感谢!

以前运行控制台有些乱码也不见了,现在非常正常。

现在的驱动都超大,hwid部分可能会超过65535B(64KB),得想法改进INIFILE或搞个替代品。
作者: chenall    时间: 2010-4-21 12:24
还有一点忘了说了,
新的GRUB4DOS应该可以在内置菜单中使用UNIFONT显示中文了。




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