无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
151#
发表于 2015-2-11 15:48:19 | 显示全部楼层
本帖最后由 chenall 于 2015-2-11 15:53 编辑
mdyblog 发表于 2015-2-11 15:25
1:  builtin_cmd 比较特别, 不是实际要运行的函数, 只是一个“壳”。
在 源代码中兜圈。

所以 来问 ...


通过flags可能识别命令运行环境,比如是在菜单中的或者是在命令行的,大部份命令是不管这个flags参数的,但少数有判断,这个不能为0.

外部命令的话参数里面就有一个flags参数是同一个意思,直接用这个flags代入就行了.

其它的你可以看一下builtin_cmd的源码就明白了,不看源码可能无法明白真正的用法.

最简单的就用就是如参数介绍所说的.

很直观的用法. 命令,参数,标志
(char *cmd , const char *arg, int flags)

builtin_cmd('ls','(hd0)',flags);

点评

我现在有个磁盘,他的0扇区有一个隐藏分区(FAT16)的bpb还有一个正常分区的分区表,分区表没有隐藏分区的表项,g4d怎么访问这个隐藏分区?  详情 回复 发表于 2015-2-11 16:33
非常感谢!!  详情 回复 发表于 2015-2-11 15:56
回复

使用道具 举报

152#
发表于 2015-2-12 19:39:58 | 显示全部楼层
mdyblog 发表于 2015-2-12 18:05
C大请教:
我这个内置菜单怎么没有正常运行。

不太明白你的逻辑

(md)0x881+34 是如何得到的?

你没有使用类似dd之类的命令复制之前这个不应该有内容吧.

点评

4: 更奇怪的是。 ((md)0x200处 事后又放上了一份拷贝) 比较35个扇区, 就没有差错。 比较 后34个扇区, 反倒 有差错! 如图: [attachimg]209335[/attachimg]  详情 回复 发表于 2015-2-12 20:02
LZMA压缩 的 内置菜单。 自动解压到(md)0x880处. 前扣除前512字节,另外长度为34扇区, 所以 就是(md)0x881+34  详情 回复 发表于 2015-2-12 20:01
回复

使用道具 举报

153#
发表于 2015-2-13 09:36:09 | 显示全部楼层
这个你的理解错误,有点想当然.

(md)0x880 处存放的是lzma菜单是没有错,但是这个是原始的而不是经过解压的,解压是自动的.所以你这样子肯定不行.

从(md)0x880开始才是完整的(你用cat/cmp时会自动解压)这时是正常的,若是从0x881开始的文件就不完整了,少了lzma的文件头当然就不会自动解压.

要实现你上面的功能正确的作法是

1.把内置菜单用lzma压一下
2.myapp你要不要压都无所谓
3.现在开始制作内置菜单.
把经过压缩的lzma文件用'\0'填充满一个扇区.再把myapp附加在菜单最后面.这样就生成了一个包含myapp的内置菜单了

用这个内置菜单你就可以使用(md)0x881+xxx的方式来访问你的myapp程序.



点评

请教大一个问题  详情 回复 发表于 2015-2-13 12:07
非常感谢!  详情 回复 发表于 2015-2-13 11:53
回复

使用道具 举报

154#
发表于 2015-2-13 12:52:13 | 显示全部楼层
mdyblog 发表于 2015-2-13 12:07
请教C大一个问题:
C中 怎么获得命令行参数, 当前文件名。
看到 get_cmdline_obsolete(struct ge ...


印像中get_cmdline不能单独使用,它还有一个全局参数,需要先设置好再运行就行了.

参数的话你上面的那个就是了,看参数名字就能理解了.
一个比较重要的 cmdline指针指向要存放输入的字符,配合maxlen限定字符数(需要有足够大的空间)


关于函数的用法如果不清楚的话

我建议你还是看一下源码是如何实现的,还有如何使用的.这样会比我的解释更清楚.

事实上grub4dos有好多函数我都没有使用过,也不是很了解,我一般会先看一下该函数的原型,再参考一下源码里面的用法..更深一步可以看一下它的实现方法.

点评

怎么看 好像 不是 get_cmdline_obsolete() 我要的。 我要的 的是 运行当前程序的 命令行。 get_cmdline_obsolete() 好像是从命令行读取 用户的命令, 比如读取键盘输入的命令行! “运行当前程序的  详情 回复 发表于 2015-2-13 13:22
回复

使用道具 举报

155#
发表于 2015-2-13 13:42:21 | 显示全部楼层
mdyblog 发表于 2015-2-13 13:22
怎么看 get_cmdline_obsolete()   好像 不是  我要的。

我要的 的是 运行当前程序的 命令行。

我不明白这个 “运行当前程序的 命令行” 到底具体指的是什么,

我猜测是要获取到当前"正在运行的命令",这个没有办法得到吧,除非你自己写一个外壳程序

类似于批处理之样的,因为所有的命令都是由你控制运行的,当然就很容易获取到.

点评

C大, 请教个问题。 usb --init 这个命令能用来超越 BIOS 的访问能力限制,自由地访问U盘/USU.SD/USB.手机卡 吗? 就是 可以访问整个磁盘。 目前BIOS 可能不能访问 磁盘后面, 这个能解决U盘的这个问题吗?  详情 回复 发表于 2015-2-15 13:51
他要的大概是 当前正在运行的程序的命令行参数。 就是当一个外部程序被执行时,用户提供的命令行参数是什么,这个外部程序的作者,希望能够得到命令行参数,以便根据命令行参数的变化而采取不同的处理。  详情 回复 发表于 2015-2-13 20:13
回复

使用道具 举报

156#
发表于 2015-2-18 10:30:58 | 显示全部楼层
本帖最后由 chenall 于 2015-2-18 10:32 编辑

@mdyblog,@sratlf

是我的疏忽
0是第一个附加的文件(忘了更新了,早期的版本0是批处理本身后面发现这个没有什么用处,而且批处理在运行的时候已经不是原样的,获取到也没有用.就改了)

回头我更新一下文章内容.

当然了只是提供了一种方案,实际上并不推荐使用,,要完全理解明白这些用法至少需要对grub4dos的文件表示方法还有blocklist等命令比较熟悉.只要熟悉了这些内部命令理解起来是很容易的,不理解的话不建议使用,

点评

>>忘了更新了,早期的版本0是批处理本身后面发现这个没有什么用处 也就是 说 原来是从1开始的。 其实, 没必要改成从0开始。 改成从0开始 也看不出有什么好处。 这一改,反倒造成 不必要的不兼容。 和历史上的文  详情 回复 发表于 2015-2-18 16:56
回复

使用道具 举报

157#
发表于 2015-2-26 15:03:29 | 显示全部楼层
mdyblog 发表于 2015-2-24 14:01
请问下面的情况, 怎么保留(ud)还能访问?

UD启动 (ud)/grldr

你直接访问(hd1)/不就行了.

实际上早期的版本经过以上hook之后ud的就已经失效了的(无法正常访问).后面经过不点的修改可以了.

ud就是从ud上启动才会有的,就像pd一样,只有从pxe启动才会有pd

若是按你所说的修改的话,我也不确定能不能行,即便能行也是得不偿失.
首先,就是带来兼容性问题.
其次,假如多个磁盘上都有使用fb格式,那ud是要指哪一个呢????
比如你上面的经过map之后,系统到底要从哪个设备查找ud呢???

我觉得有些工作还是自己修改一下菜单修改下就行了,没有必要让软件来代劳,因为得不偿失.

你可以自己写一个外部软件来实现你想要的功能,在菜单中运行你的软件就产生ud设备.

ud设备关键信息在fb_status中

外部程序的作用就是自动查找ud并设置fb_status的值,这样就有ud了.

点评

1: 你直接访问(hd1)/不就行了. 谢谢, 原来还可以这样 用啊! 非常感谢! 2: 首先,就是带来兼容性问题. ---------- 可以提供一个开关。比如 --ud。 用户负责自付。 3: 其次,假如多个磁盘上都有使用fb  详情 回复 发表于 2015-2-26 17:16
回复

使用道具 举报

158#
发表于 2015-2-28 10:17:27 | 显示全部楼层
本帖最后由 chenall 于 2015-2-28 10:21 编辑
mdyblog 发表于 2015-2-28 10:03
请问  rawread() 最后的 那个 魔术数 怎么填?
我的代码从 udm搬到UD后。 读  0扇区(就恰好一个扇区) ...


rawread原型,
看原型应该很容易理解的,drive设备号,sector扇区号,byte_offset偏移,byte_len要读写的字节数,buf缓存区,write读写标志.

这个偏移比如你想读第一个扇区的0x1b8处的16个字节到内存0x40000处可以这样

rawread(0x80,0,0x1b8,16,0x40000,GRUB_READ)

  1. int
  2. rawread (unsigned long drive, unsigned long long sector, unsigned long byte_offset, unsigned long long byte_len, unsigned long long buf, unsigned long write)
复制代码

这个buf是一个内存地址,你0x200*0x200是什么意思?
write是读写标志.
用grub4dos.h的话可以使用GRUB_READ或GRUB_WRITE

最新版的grub4dos.h在这里
https://raw.githubusercontent.co ... /include/grub4dos.h

点评

这么重要的东东,还是放在首页吧(链接)。  详情 回复 发表于 2015-2-28 11:30
回复

使用道具 举报

159#
发表于 2015-3-1 09:09:58 | 显示全部楼层
2011yaya2007777 发表于 2015-2-28 18:25
请 chenall 看看,今天打了一个补丁,上传到我的分支,不知为何没有进入你的主干。

因为github有时候会抽疯访问不了.

昨天我有看了下代码是有并入0.4.6a,只是没有自动编译,我后面手工处理了一下.
回复

使用道具 举报

160#
发表于 2015-3-1 14:57:06 | 显示全部楼层
@yaya
之前的报告#841楼
http://bbs.wuyou.net/forum.php?m ... 04&fromuid=1025

昨天报告者说0.4.5c也有问题?如果问题确实存在的话那是不是说这个问题很早的版本就存在了?

回复

使用道具 举报

161#
发表于 2015-3-1 17:29:05 | 显示全部楼层
2011yaya2007777 发表于 2015-3-1 17:11
在 exfat 分区,使用 grub4dos-0.4.5c-2015-01-20,可以正常加载 .iso 镜像。
原因是:0.4.5c 没有探测到  ...

????

这个报告是grldr.mbr的问题,查找的时候直接查找(hd1)这样子,少了分区号.
回复

使用道具 举报

162#
发表于 2015-3-23 19:44:50 | 显示全部楼层
@hhh333

有办法重现吗?可以把你的TFTP整个目录和配置传上来我测试一下.

点评

我这里也有一个全套文件包,前面在论坛发表过,解压到C盘就可以了,DHCP中有两个启动器,用pxesrv即可。  详情 回复 发表于 2015-3-24 08:02
很容易重现的。 见测试包。 测试方法: 1)如果LAN有DHCP,暂时关闭掉(或组建一个小的独立测试LAN)。 本测试的DHCP IP为192.168.1.220--230 解开。进入子目录。双击运行Tftpd32.exe即可。 客户端开机(或其  详情 回复 发表于 2015-3-24 05:26
回复

使用道具 举报

163#
发表于 2015-3-24 08:12:54 | 显示全部楼层
试了一下确实有问题,目前看起来是由于gz压缩的关系,用lzma或不压缩都正常.

我试试看看能不能找到原因.
回复

使用道具 举报

164#
发表于 2015-3-24 10:14:02 | 显示全部楼层
刚上传了一个版本,应该解决了.

点评

试了,可以了  详情 回复 发表于 2015-3-24 10:38
回复

使用道具 举报

165#
发表于 2015-3-24 11:08:19 | 显示全部楼层
本帖最后由 chenall 于 2015-3-24 11:14 编辑
mdyblog 发表于 2015-3-24 10:48
请教个 关于G4D的BIOS调用的问题。
下面代码你应该见过。


来源: http://chenall.net/post/grub4dos_date_bat/

谢谢提醒,文章已经同步修改更正.

点评

谢谢!!!!  详情 回复 发表于 2015-3-24 11:15
回复

使用道具 举报

166#
发表于 2015-3-28 09:10:56 | 显示全部楼层
mdyblog 发表于 2015-3-26 22:34
反映一个现象:%~f0   有是会 将第一个参数“粘”到后面。
脚本hello :

这个还是比较碰巧的情况下才会出现的,谢谢报告,已经修复,
回复

使用道具 举报

167#
发表于 2015-4-2 14:05:45 | 显示全部楼层
本帖最后由 chenall 于 2015-4-2 14:07 编辑
mdyblog 发表于 2015-4-2 13:49
请问怎得到 某个版本的 commit 号。
git 下载源码需要。
download.json 中 0.46a下载没有 2015-02-21  之 ...


一般情况下,一天只会提交一次并且自动编译生成一个版本,如果有多个提交后面就会有commit号,就像你所说的那样子的.

源码切换到某个版本用git 的checkout命令
如下命令,这样会在本地生成一个新的分支test就是对应42859b7a的版本号.(在下载的BIN文件包里面就有介绍的 Get_Source_of_This_Build.txt)

不建议使用reset,reset --hard恢复所有其它的改动,到时需要重新pull.

  1. git clone git://github.com/chenall/grub4dos.git grub4dos_src
  2. cd grub4dos_src
  3. git checkout 42859b7a -b test
复制代码

点评

在下载的BIN文件包里面就有介绍的 Get_Source_of_This_Build.txt -------------- xiexie zhaodao l .  详情 回复 发表于 2015-4-2 14:11
git checkout 42859b7a -b test -------------------------- 42859b7a 这是什么? 怎么得到。 比如我要下载 0.4.6a2015-01-18, 怎么得到这个号码, 怎么下载这个版本(命令怎么写)?  详情 回复 发表于 2015-4-2 14:09
回复

使用道具 举报

168#
发表于 2015-4-2 14:14:33 | 显示全部楼层
请问怎得到 某个版本的 commit 号。

1. 在download.json里面有一个commit这个就是了对应的源码版本号.
2. 在grub4dos的BIN文件包里面Get_Source_of_This_Build.txt里面也有对应的版本号.

至于编译出来的文件大小不一样,这个比较正常,因为编译环境不一样所编译的结果是不一样的.只要相差不是太大就行.

点评

请问, 我前面的 “覆盖法” 编译, 有问题吗? 我这么问,是因为我前面都是这么编译的。(以后当然不会这么绕了)  详情 回复 发表于 2015-4-2 14:20
Get_Source_of_This_Build.txt: 内容好像有点错误, 和你上面写的不同。 https://github.com/chenall/grub4dos.git 访问不了 git://github.com/chenall/grub4dos.git 可以  详情 回复 发表于 2015-4-2 14:17
回复

使用道具 举报

169#
发表于 2015-4-2 14:24:59 | 显示全部楼层
mdyblog 发表于 2015-4-2 14:17
Get_Source_of_This_Build.txt:

内容好像有点错误, 和你上面写的不同。

这个我下次改一下默认用git

用git/https都是可以的,不可以的话一般是你的系统环境问题.

另外download.json只提供最近10个版本,需要其它版本的可以在grub4dos.chenall.net里面查找

比如0.4.6a-2015-03-29版
http://grub4dos.chenall.net/downloads/grub4dos-0.4.6a-2015-03-29/

在这个页面里面就有对应的源码信息什么的有需要的话很容易编程获取的,只要读一下这个页面就可以从里面提取所有需要的信息了.

回复

使用道具 举报

170#
发表于 2015-4-2 14:26:29 | 显示全部楼层
mdyblog 发表于 2015-4-2 14:20
请问, 我前面的 “覆盖法” 编译, 有问题吗?
我这么问,是因为我前面都是这么编译的。(以后当然不会 ...

"覆盖"为什么要?

"覆盖"了就是使用覆盖的版本了,即然是"覆盖"也没有必要下载旧版源码的.

点评

覆盖法: 以前 是这样的编译的: 由于不知道 git怎么下载我要的指定版本0.46a10250118. 先下载个别的,再下载 指定版本0.46a10250118 的 ZIP包(http://grub4dos.chenall.net/downloads) 再覆盖。 详细如下:  详情 回复 发表于 2015-4-2 14:36
回复

使用道具 举报

171#
发表于 2015-4-2 15:38:40 | 显示全部楼层
mdyblog 发表于 2015-4-2 14:36
覆盖法:
以前 是这样的编译的:
由于不知道 git怎么下载我要的指定版本0.46a10250118.
  1. git clone git://github.com/chenall/grub4dos.git grub4dos_src
  2. cd grub4dos_src
  3. git reset --hard 42859b7a
  4. make
  5. ###前面的这些都没有必要吧,直接下载01-18的源码编译就行了.
  6. #再下载  0.4.6a-2015-01-18的源码ZIP,解开覆盖。然后:
  7. cd stage2
  8. touch *
  9. cd ..
  10. make
复制代码


这样编译是没有问题的,效果和直接下载01-18版源码是一样的.

点评

谢谢!  详情 回复 发表于 2015-4-2 16:21
回复

使用道具 举报

172#
发表于 2015-4-8 13:26:36 | 显示全部楼层
527104427 发表于 2015-4-8 12:50
试了一下,好像没那么简单

直接./build就自动全部编译了.

点评

总是提示 Permission denied 以为是没有权限,于是用imdisk生成一个内存盘来编译,还是一样的出错。 原来是不能用IE下载源码,要 git clone git://github.com/chenall/grubutils.git 下载才行,汗  详情 回复 发表于 2015-4-8 14:03
回复

使用道具 举报

173#
发表于 2015-4-12 17:42:01 | 显示全部楼层
527104427 发表于 2015-4-12 17:15
新版grldr有个问题:

set abcdefghi=1

变量名本来就是不能超过8个字符的..
之前的版本有BUG,导致9个字符也正常,但实际上只使用了8个字符.

国外的网友比较细心发现了这个问题
https://github.com/chenall/grub4dos/issues/55

上一个版本我修改了一下,超过8个就提示出错.
后面考虑到兼容性问题,今天又编译了一个版本在这里你可以测试一下.
http://chenall.qiniudn.com/grub4dos-0.4.6a-2015-04-12.7z

现在是9个字符就警告并且自动缩短到8个字符和以前的版本一样,超过9个字符直接报错.

点评

原来是这样,还以为是BUG。 试了一下,可以  详情 回复 发表于 2015-4-12 18:49
回复

使用道具 举报

174#
发表于 2015-5-23 11:11:18 | 显示全部楼层
mdyblog 发表于 2015-5-23 06:40
请问,内置英文菜单的分辨率是强制 640X480X8bit吗?
做成中文内置菜单,怎么写才能保证一致。


中文的话就像不点所说的图形模式不一定有支持

不过如果你的菜单使用的中文不是很多的话可以考虑使用替换字模的方式来在文本模式下显示中文,最多记得是可以显示60个不同的中文汉字

点评

1: 我的内置菜单大概这样: 就预置了几个汉字字体。 后面的脚本中可以输出汉字;而不用再调font 了。 但是,在qemu测试的时候,屏幕变得老大老大的。很不好看。 没有 "预置了几个汉字字体", 就没事。  详情 回复 发表于 2015-5-23 20:47
回复

使用道具 举报

175#
发表于 2015-5-24 08:11:36 | 显示全部楼层
mdyblog 发表于 2015-5-23 20:47
1:
我的内置菜单大概这样:

需要用VTEDIT或其它的程序转换一下菜单的汉字内容,然后还需要一个外部命令VFONT

用法,使用VTEDIT编辑修改菜单之后按保存会生成一个同名的EXE文件

只要在GRUB4DOS下用VFONT调用这个EXE文件配合上面保存生成的菜单文件就可以在文本模式下显示中文了

点评

麻烦给个测试包。 直接就能演示效果。  详情 回复 发表于 2015-5-24 08:31
请问, 外部命令VFONT 哪有啊?  详情 回复 发表于 2015-5-24 08:30
转换一下菜单的汉字内容, --------------- 意思是说,G4D中: VFONT /hzfont.exe echo 你好 pause title 你好 commandline  详情 回复 发表于 2015-5-24 08:19
回复

使用道具 举报

176#
发表于 2015-5-24 09:27:21 | 显示全部楼层
mdyblog 发表于 2015-5-24 08:31
麻烦给个测试包。 直接就能演示效果。

试了一下效果不太好,没有过滤制表符,连制表符一起被替换掉了.

记得曾经有过滤制表符的,忘了在哪了....

demo.rar

145.28 KB, 下载次数: 5

回复

使用道具 举报

177#
发表于 2015-5-26 20:40:22 | 显示全部楼层
mdyblog 发表于 2015-5-26 15:10
请问新版 关于%%相连的处理改理吗?
现在是 echo  %a%%b%
以前需要多个%

请用批处理脚本测试,命令行和批处理的处理方式是不一样的.
回复

使用道具 举报

178#
发表于 2015-6-3 14:00:20 | 显示全部楼层
@yaya
发现UDF有BUG,但是我还没有找到具体原因,我只是测试了是UDF的问题,禁用UDF正常(通过0x830c控制)
https://github.com/chenall/grub4dos/issues/65

我把测试用的ISO文件也一起上传了
http://pan.baidu.com/s/1bnyJet5

你有空看一下,具体表现为,用TAB查看文件列表内容为空,(有时可以有时不行估计是哪里有内存冲突的样子)
另外执行initrd 命令之后出现file not found(文件有存在),这时按向上键调用上一条命令会出现乱码.

估计这个ISSUE应该也是同一个问题

https://github.com/chenall/grub4dos/issues/64




回复

使用道具 举报

179#
发表于 2015-6-11 14:14:31 | 显示全部楼层
hhh333 发表于 2015-6-11 05:47
最新的0609中文乱码

我试了下就PXE不正常,在硬盘上的还是正常的,你是什么环境的.

我目前估计是dec_vhd引入的问题.
回复

使用道具 举报

180#
发表于 2015-6-11 17:29:57 | 显示全部楼层
本帖最后由 chenall 于 2015-6-11 21:50 编辑

2015-06-09 0.4.6a的版本dec_vhd有一些问题,

附件的版本对dec_vhd进行了改进,简化了一些代码只判断是否是VHD_DISKTYPE_DYNAMIC格式.

大家可以测试一下看看能否发现其它问题.

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-22 06:21

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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