无忧启动论坛

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

GRUB4DOS更新建议、bug反馈专帖

    [复制链接]
91#
 楼主| 发表于 2010-12-30 08:27:40 | 显示全部楼层
12-29版本g4d不支持老版本的FAT(11-05)外部命令?

Snap1.jpg (97.82 KB, 下载次数: 147)

Snap1.jpg
回复

使用道具 举报

92#
 楼主| 发表于 2010-12-30 09:11:26 | 显示全部楼层
我的ftp://60.190.19.108/zhaohj/coolg
放置了两个PE,用批处理和lst分别调用,用configfile /coolg/coolg.lst
21号的版本都没有问题
27~29,批处理都无法启动PE。
29日的版本需要使用新版fat,请替换EXT.IMG.GZ中grub目录下的fat,或下面替换。

-------------
有点奇怪,img.bat中debug on也会失灵,有时又正常
!BAT
debug on
map --mem /COOLG/EXT.IMG.GZ (fd0)
map --hook
:command --set-path=(fd0)/GRUB/
insmod (fd0)/GRUB/WENV
insmod (fd0)/GRUB/FAT
...

[ 本帖最后由 zhaohj 于 2010-12-30 10:58 编辑 ]

EXT.IMG.GZ

87.85 KB, 下载次数: 15, 下载积分: 无忧币 -2

回复

使用道具 举报

93#
 楼主| 发表于 2010-12-30 13:56:32 | 显示全部楼层
现在问题很难查,命令行下都正常,但一用批处理就出问题。
看来问题还是出在批模块。
回复

使用道具 举报

94#
 楼主| 发表于 2010-12-30 15:14:09 | 显示全部楼层
@ZXW:
278楼,能否测试一下,把文件拷贝到tftp的COOLG就可以了。configfile /COOLG/COOLG.LST
你有PXE环境,方便测试。
回复

使用道具 举报

95#
 楼主| 发表于 2010-12-30 16:39:05 | 显示全部楼层
CSPE跟踪测试,发现pkunzip出问题了。12-21g4d环境正常。

Snap1.jpg (97.28 KB, 下载次数: 151)

Snap1.jpg
回复

使用道具 举报

96#
 楼主| 发表于 2010-12-30 23:30:21 | 显示全部楼层
呵呵,总算找到问题的根源。

全部测试通过!
回复

使用道具 举报

97#
 楼主| 发表于 2011-1-4 17:03:41 | 显示全部楼层
C大该抽点时间,把CSPE更新下。现在条件都成熟了,该去掉DOS了。
回复

使用道具 举报

98#
 楼主| 发表于 2011-1-6 10:59:44 | 显示全部楼层
UD启动,(bd)是ud区,()是可见区,即0x82a0值是否为0
checkrange 0x23 read 0x8280 && checkrange 0 read 0x82a0 && map (fd0) (hd0)......
回复

使用道具 举报

99#
 楼主| 发表于 2011-1-6 15:25:05 | 显示全部楼层
标号只能用在批处理;
if %bd%==ud cat --length=0 (ud)/%h3cd% && goto 15改成下面呢?
if %bd%==ud cat --length=0 (ud)/%h3cd% && default 15 && timeout 0
另把default 1 及 timeout 30上移
回复

使用道具 举报

100#
 楼主| 发表于 2011-1-7 12:51:59 | 显示全部楼层
转贴:

一些初学者朋友对于shift命令感到非常的困惑,抱怨网上的一些shift命令教程很难理解。为了解决这个问题,于是我就写了一下这个
“超生游击队”教程以供初学者朋友参考。

言归正传,比如我老爸有10个儿子,我英雄是第10个。

第一步:
我们现在用一个另类的办法输出10个儿子的名字,将如下代码保存为hero.bat。
@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
echo %10
pause
如何运行呢?我们可以另写一个bat,内容是:call hero.bat 老大 老二 老三 …… 英雄
也就是调用hero.bat并共带10个参数!
能正确运行吗?不能,很遗憾,因为根本没有%10。


第二步:
在上一步中没有输出我英雄的大名,那难道我英雄就不是我老爸的儿子吗!我得想个办法把我的名字也输出来。
好了,借助shift命令就可以达到。我们把hero.bat中的代码改一下。
@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
shift
echo %9
pause
终于我的大名输出了。可是英雄明明是第10个参数呀,怎么现在变成第9个了?
这个就是shift的功能.

也就是,执行shift命令以后,原来的%9变成了%8,原来的%8变成了%7,原来的%7变成了%6……而原来的%1变成了%0,此时原来的%0没了。
也就是说后面的参数依次冲掉了前面的参数,而为了输出我的名字,最终牺牲了%0。


第三步:
我老爸又认了4个干儿子,名字分别为a,b,c,d
到此,我老爸有多了4个干儿子。共14个儿子。

在调用hero.bat时又多了4个参数,则运行hero.bat时有:call hero.bat 老大 老二 老三 …… 英雄 a b c d
(注意:要把省略号换成名字。)


此时,hero.bat的代码如下:(最容易理解的方法)

@echo off
echo %1
echo %2
echo %3
echo %4
echo %5
echo %6
echo %7
echo %8
echo %9
shift
echo %9
::现在的%9是英雄

shift
echo %9
::现在的%9是a

shift
echo %9
::现在的%9是b

shift
echo %9
::现在的%9是c

shift
echo %9
::现在的%9是d

pause
回复

使用道具 举报

101#
 楼主| 发表于 2011-1-10 15:31:35 | 显示全部楼层
原帖由 zxw 于 2011-1-10 15:16 发表
@chenall:
cat --locate=string
string 是否有长度限制?


http://bbs.wuyou.net/forum.php?mod=viewthread&tid=180142&page=5#pid2079909
回复

使用道具 举报

102#
 楼主| 发表于 2011-1-11 10:04:55 | 显示全部楼层
set命令测试ok!
不过是否与WENV(tuxw)是否存在内存冲突?
我记得这个问题以前曾碰到过。

Snap1.jpg (95.48 KB, 下载次数: 128)

Snap1.jpg
回复

使用道具 举报

103#
 楼主| 发表于 2011-1-11 11:16:00 | 显示全部楼层
把所有的exec排除,还是存在这个错误。
不知与这个是否有关:
map --rd-base=0xF00000 && map --rd-size=0x800
这段内存是否与最新的GRUB4冲突?

需要2K的安全区域

[ 本帖最后由 zhaohj 于 2011-1-11 11:18 编辑 ]
回复

使用道具 举报

104#
 楼主| 发表于 2011-1-11 15:43:01 | 显示全部楼层
改成其他区域,如0x65000,0x200000都不行。我上面是0xf00000 (5个0),所以不存在冲突问题
出现问题是set变量支持菜单开始的,也就是1-9,1-10两个版本

[ 本帖最后由 zhaohj 于 2011-1-11 16:27 编辑 ]
回复

使用道具 举报

105#
 楼主| 发表于 2011-1-11 16:49:33 | 显示全部楼层
debug on下没出错信息死机
好像与wenv switch use_x32=on有关,第二幅图后变单步执行了,再后面死机

[ 本帖最后由 zhaohj 于 2011-1-11 16:57 编辑 ]

Snap1.jpg (112.45 KB, 下载次数: 156)

Snap1.jpg

Snap2.jpg (35.79 KB, 下载次数: 143)

Snap2.jpg
回复

使用道具 举报

106#
 楼主| 发表于 2011-1-11 17:13:08 | 显示全部楼层
死机问题1-11版本已经解决。
set oempath && WENV set oempath=${oempath!\=/}
set oempath && set srspath=%srspath%%oempath%/ && echo set srspath=%srspath% >> (fd2)/ENVI.BAT

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

Snap2.jpg
回复

使用道具 举报

107#
 楼主| 发表于 2011-1-11 20:19:42 | 显示全部楼层
原帖由 chenall 于 2011-1-11 17:26 发表


有一点需要注意一下上面的语句在批处理中执行
%srspath%%oempath%/

因为批处理执行前会先替换%%为一个 %.然后再丢给命令处理器。
所以上面会被处理成
%srspath%oempath%/


呵呵,改成%srspath%%%oempath%/  问题解决。

下面问题怎么解决?

Snap1.jpg (73.19 KB, 下载次数: 157)

Snap1.jpg
回复

使用道具 举报

108#
 楼主| 发表于 2011-1-12 09:49:52 | 显示全部楼层
昨天在测试SRSF6过程中,其中的一个批处理makeinf.bat使用了0x40000内存地址:
map --rd-base=0x40000 && map --rd-size=0x800
...
fat copy (rd)+1 (fd1)/SRS.INF
出现死机,后来改成:
fat mkfile size=2k (fd1)/SRS.INF
因为">"以前是没清空内存的,是后来改变的。
-----------------
怀疑要么是tuxw的wenv问题引起的内存冲突,要么...
问题可以重现,C大是否需要彻查?
回复

使用道具 举报

109#
 楼主| 发表于 2011-1-12 11:21:34 | 显示全部楼层
奇怪,可能是1-10版本的问题,1-11版本问题无法重现。

批处理中,debug on后,下面这两句:
echo !BAT > (fd2)/DRIVERS.BAT
WENV for /f "tokens=3 delims==," %i in ( (fd1)/SYSINF ) do (set a=$u,%i ; check %<-$${a} loop ; echo cat --length=0 $${srspath}$${a} key(&&) FAT copy /o $${srspath}$${a} (fd1)/) >> (fd2)/DRIVERS.BAT

生成的DRIVERS.BAT见图,怎么取消set a=$u,%i 生成的输出?

[ 本帖最后由 zhaohj 于 2011-1-12 12:43 编辑 ]

Snap1.jpg (59.71 KB, 下载次数: 136)

Snap1.jpg
回复

使用道具 举报

110#
 楼主| 发表于 2011-1-12 16:45:54 | 显示全部楼层
C大有否计划扩展set、if功能?
set a=$u,%a%  ...
set /p a=$u,please input:
set /a *0x60000=*0x60000+1
if abcd<-%a%
...
回复

使用道具 举报

111#
 楼主| 发表于 2011-1-13 10:56:20 | 显示全部楼层
C大,今天运行DOS版的DISKGEN,发现CSPE下用DISKGEN分区与DOS下分区的分区情况不一致。
而在其他PE下使用DISKGEN与DOS下一致的,望有空时候测试一下。
下面是DOS下与CSPE下使用diskgen的分区报告:

[ 本帖最后由 zhaohj 于 2011-1-13 10:57 编辑 ]

Snap2.jpg (167.99 KB, 下载次数: 147)

dos下报告

dos下报告

Snap3.jpg (239.34 KB, 下载次数: 150)

CSPE下报告

CSPE下报告
回复

使用道具 举报

112#
 楼主| 发表于 2011-1-13 23:15:53 | 显示全部楼层
原帖由 chenall 于 2011-1-13 11:05 发表
你用0PE试一下应该也是一样的。

这是因为使用了虚拟磁盘的原因。

CSPE我已经不管了。


晚上测试了0PE下diskgen,竟然与DOS下分区一致,迷糊了。

[ 本帖最后由 zhaohj 于 2011-1-13 23:18 编辑 ]

Snap3.jpg (66.81 KB, 下载次数: 139)

Snap3.jpg
回复

使用道具 举报

113#
 楼主| 发表于 2011-1-14 10:28:31 | 显示全部楼层
确实,查看了0PE的txtsetup.sif中使用了FIRADISK。

但我在CSPE的ext.zip\upsys,把FIRADISK.sys改名为wdsys.sys,放入upsys目录下,结果也是一样的。
回复

使用道具 举报

114#
 楼主| 发表于 2011-1-14 11:22:19 | 显示全部楼层
原帖由 chenall 于 2011-1-14 10:56 发表


也许是没有交换磁盘映射,具体的忘记了。


确实,你的提醒是对的。是没有交换磁盘映射问题。microsoft.lst中:
# 0x6000C   harddrives_orig
......
#0
title [0] Micro Windows PE (autocheck)\n\r\n\t Micro Windows PE by chenall 2010.02.02 http://www.chenall.com
WENV calc hd_num=*0x475 & 0xff
WENV set srspath=/CSPE
echo grub4dos Version check Success... || goto 14
clear
checkrange 0x80 read 0x8280 && map --read-only ()+1 (fd3)
checkrange 0 read 0x8280 && map () (fd3)
checkrange 1:-1 read 0x6000C && map (hd0) (hd)
map --hook || echo

上面的hd_num没有写入0x6000c,导致checkrange 1:-1 read 0x6000C && map (hd0) (hd)永远没执行。
改成
WENV calc hd_num=*0x475 & 0xff
WENV call write 0x6000c ${hd_num}   新版可以改成 write 0x6000c %hd_num%

问题解决!

[ 本帖最后由 zhaohj 于 2011-1-14 11:24 编辑 ]

Snap1.jpg (187.22 KB, 下载次数: 116)

Snap1.jpg
回复

使用道具 举报

115#
 楼主| 发表于 2011-1-14 16:26:13 | 显示全部楼层
很好,WENV的50%功能已经内置了。
回复

使用道具 举报

116#
 楼主| 发表于 2011-1-15 12:16:40 | 显示全部楼层
问下C大:
time、date是grub4内置的两个变量,如显示当前日期、时间 echo %@date%  %@time%
还有其他内置的变量吗?
回复

使用道具 举报

117#
 楼主| 发表于 2011-1-15 14:33:03 | 显示全部楼层
这个返回值很有用处,比如set a=abc
read 0x4cb00得到0x3,就是变量值的长度

如果能这样就更好了:
set b=*0x4cb00

[ 本帖最后由 zhaohj 于 2011-1-15 14:54 编辑 ]
回复

使用道具 举报

118#
 楼主| 发表于 2011-1-16 17:06:40 | 显示全部楼层
cat命令已经增加了参数--number=n,能否扩展一下--number=-n,输出倒数n个数。如-1是找到的最后一个。
现在通过locate=string 总数目可通过返回值0x4cb00得到。
通常情况下,用户需要的是第一个或最后一个结果值。
现在第一个通过--number=1已经解决,只需要最后一个,有没简单的方法?(只考虑内置命令)。
回复

使用道具 举报

119#
 楼主| 发表于 2011-1-17 11:19:56 | 显示全部楼层
问C大,比如call :get_las要调用多次,
如:
!BAT
...
cat --length=%a% --locate=[ (fd1)/OEM | call :get_last
set /a b=0x%last%+1
cat --length=%a% --locate=] (fd1)/OEM | call :get_last
...

:get_last
if "%1%=="" goto :end
shift
if "%1%=="" set last=%0
goto :get_last
:end
-----------------------
上面call后无法返回到下一句,有什么办法?
需要return?
exit退出当前批处理了。
另外,我的批处理1中又调用了批处理2,如果批处理2中有exit是退出了全部批处理,而不会返回到批处理1中。

[ 本帖最后由 zhaohj 于 2011-1-17 11:53 编辑 ]
回复

使用道具 举报

120#
 楼主| 发表于 2011-1-17 12:22:33 | 显示全部楼层
测试多次了
OEM2PCI.BAT:
!BAT
...
(fd2)/EXT/MAKEOEM.BAT
--------------------------
MAKEOEM.BAT
!BAT
...
cat --length=%a% --locate=[ (fd1)/OEM | call :get_last
set /a b=0x%last%+1
cat --length=%a% --locate=] (fd1)/OEM | call :get_last
...

:get_last
if "%1%=="" exit
shift
if "%1%=="" set last=%0
goto :get_last

[ 本帖最后由 zhaohj 于 2011-1-17 12:25 编辑 ]

Snap1.jpg (79.07 KB, 下载次数: 118)

Snap1.jpg
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-14 00:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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