无忧启动论坛

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

支持含有碎片的文件仿真

    [复制链接]
841#
发表于 2015-2-11 10:11:47 | 只看该作者
请问这个现在在哪儿?
---------------------------------------------------------
目前可以使用的函数和变量:
http://grubutils.googlecode.com/svn/trunk/src/include/grub4dos.h
----------------------------------------------------------

点评

应该还在GitHub  详情 回复 发表于 2015-2-11 10:23
回复

使用道具 举报

842#
发表于 2015-2-11 10:23:43 | 只看该作者
mdyblog 发表于 2015-2-11 10:11
请问这个现在在哪儿?
---------------------------------------------------------
目前可以使用的函数 ...

应该还在GitHub
回复

使用道具 举报

843#
 楼主| 发表于 2015-2-11 11:14:49 | 只看该作者
请教 chenall :
如果在一天内修正 2 个 bug,又不想把补丁混在一起,是否应当这样操作:
1. 同步(更新)补丁代码,保持和主项目代码一致。
   git fetch grub4dos
2. 切换到 0.4.6a
   git checkout grub4dos/0.4.6a -b 0.4.6a
3. 同步(更新)本地库,保持和主项目代码一致
   git rebase grub4dos/0.4.6a
4. 打补丁1
5. 在 commit.log 写提交信息
   .修正 bug1
6. 提交本地修改信息
   git commit -a -F /mnt/cofs/commit.log
7. 上传新的分支
   git push origin 0.4.6a
8. 同步(更新)补丁代码,保持和主项目代码一致。
   git fetch grub4dos
9. 切换到 0.4.6a
   git checkout grub4dos/0.4.6a -b 0.4.6a
10. 同步(更新)本地库,保持和主项目代码一致
   git rebase grub4dos/0.4.6a
11. 打补丁2
5. 在 commit.log 写提交信息
   .修正 bug2
6. 提交本地修改信息
   git commit -a -F /mnt/cofs/commit.log
7. 上传新的分支
   git push
  

点评

1. 同步(更新)补丁代码,保持和主项目代码一致。 git fetch grub4dos 2. 切换到 0.4.6a git checkout grub4dos/0.4.6a -b 0.4.6a 3. 同步(更新)本地库,保持和主项目代码一致 git rebase grub4dos/0.4  详情 回复 发表于 2015-2-11 11:26
回复

使用道具 举报

844#
发表于 2015-2-11 11:26:48 | 只看该作者
本帖最后由 chenall 于 2015-2-11 11:29 编辑
2011yaya2007777 发表于 2015-2-11 11:14
请教 chenall :
如果在一天内修正 2 个 bug,又不想把补丁混在一起,是否应当这样操作:
1. 同步(更新) ...


1. 同步(更新)补丁代码,保持和主项目代码一致。
   git fetch grub4dos
2. 切换到 0.4.6a
   git checkout 0.4.6a
3. 同步(更新)本地库,保持和主项目代码一致
   git rebase grub4dos/0.4.6a
4. 打补丁1并提交(只是commit)
git commit
5. 打补丁2同上
git commit
6.打补丁N...同上

7. 确定修改没有问题之后就可以git push

这样子的话所有的补丁都是分开的,但是最终只会自动编译最后一个版本.(每次git push都会生成一个版本的)

同一天有多个补丁,最好还是一起补上,最后再一起push.


回复

使用道具 举报

845#
发表于 2015-2-11 11:46:51 | 只看该作者
2011yaya2007777 发表于 2015-2-10 21:25
请测试:http://wuyou.net/forum.php?mod=attachment&aid=MjA5MjI2fDRhN2E3Y2EwZjIyN2Q5NTUwNTNkMzhmNzM4NGFhOTYzfDE3MTgxNzgzODI%3D&request=yes&_f=.7z

你可以贴在报告问题的那个网站上。或者你就直接提交修改后的编译结果,那些高手们都是每天下载最新版测试的,他们很敬业。

回复

使用道具 举报

846#
 楼主| 发表于 2015-2-11 11:54:53 | 只看该作者
链接已经贴在报告问题的那个网站上。那个网站不能上传文件。这个链接不需要登录就能下载。
回复

使用道具 举报

847#
发表于 2015-2-11 14:21:15 | 只看该作者
本帖最后由 mdyblog 于 2015-2-11 16:05 编辑

请问 C写的外置命令中怎
调用
#define builtin_cmd ((int (*)(char *cmd , const char *arg, int flags))((*(int **)0x8300)[44]))
//        .long        ABS(EXT_C(builtin_cmd))  //44

1: flags 怎么填, 统一填0可以吗?

2: cmd需要在 arg 的前部重复吗?

比如要执行【ls (hd0,0)】
builtin_cmd ((char*)"ls", "(hd0,0)",0);
还是
builtin_cmd ((char*)"ls", "ls (hd0,0)",0);


点评

建议看看这些函数的原来的函数的定义。这些函数都是指向内部的某个函数,它们的定义在 asm.S 文件的结尾处。flags 与内部函数的 flags 的意义是一样的,大多数情况下,函数体内部的处理过程都忽略 flags 的值,但也  详情 回复 发表于 2015-2-11 14:40
回复

使用道具 举报

848#
发表于 2015-2-11 14:40:43 | 只看该作者
mdyblog 发表于 2015-2-11 14:21
请问 C写的外置命令中怎
调用
#define builtin_cmd ((int (*)(char *cmd , const char *arg, int flags)) ...

建议看看这些函数的原来的函数的定义。这些函数都是指向内部的某个函数,它们的定义在 asm.S 文件的结尾处。flags 与内部函数的 flags 的意义是一样的,大多数情况下,函数体内部的处理过程都忽略 flags 的值,但也有少数例外。

点评

1: builtin_cmd 比较特别, 不是实际要运行的函数, 只是一个“壳”。 在 源代码中兜圈。 所以 来问问。 2: 我文的是2个问题。 山脉只涉及一个。 3: 我需要具体的答案。 比如 【ls (hd0,0)/】 bu  详情 回复 发表于 2015-2-11 15:25
回复

使用道具 举报

849#
发表于 2015-2-11 14:50:58 来自手机 | 只看该作者
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=361527
这个里面的问题用不写盘的方法怎么弄?
回复

使用道具 举报

850#
发表于 2015-2-11 15:25:40 | 只看该作者
本帖最后由 mdyblog 于 2015-2-11 16:02 编辑
不点 发表于 2015-2-11 14:40
建议看看这些函数的原来的函数的定义。这些函数都是指向内部的某个函数,它们的定义在 asm.S 文件的结尾 ...


1:  builtin_cmd 比较特别, 不是实际要运行的函数, 只是一个“壳”。
在 源代码中兜圈。
所以 来问问。

2: 我问的是2个问题。
上面只涉及一个。


3: 我需要具体的答案。
比如 【ls  (hd0,0)/】
builtin_cmd  怎么写。

不是 一些 “空泛”的指导——那些我懂的。
实际中碰到具体问题, 就希望 “具体” 的答案。

点评

你可以看一下builtin_cmd的源码就明白了.  详情 回复 发表于 2015-2-11 15:48
回复

使用道具 举报

851#
发表于 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
回复

使用道具 举报

852#
发表于 2015-2-11 15:56:42 | 只看该作者
chenall 发表于 2015-2-11 15:48
通过flags可能识别命令运行环境,比如是在菜单中的或者是在命令行的,大部份命令是不管这个flags参数的, ...

非常感谢!!
回复

使用道具 举报

853#
发表于 2015-2-11 16:33:18 来自手机 | 只看该作者
chenall 发表于 2015-2-11 15:48
通过flags可能识别命令运行环境,比如是在菜单中的或者是在命令行的,大部份命令是不管这个flags参数的, ...

我现在有个磁盘,他的0扇区有一个隐藏分区(FAT16)的bpb还有一个正常分区的分区表,分区表没有隐藏分区的表项,g4d怎么访问这个隐藏分区?

点评

0扇区(即 MBR,换句话说,是最开头的那个扇区)有一个分区的 BPB,以及一个分区表。单看这句话,grub4dos 肯定支持。这里根本不存在隐藏这回事。 比如说,你这个盘是 (hd0),那么,你用 (hd0)/ntldr 即可访问你  详情 回复 发表于 2015-2-11 16:52
回复

使用道具 举报

854#
发表于 2015-2-11 16:52:59 | 只看该作者
sunsea 发表于 2015-2-11 16:33
我现在有个磁盘,他的0扇区有一个隐藏分区(FAT16)的bpb还有一个正常分区的分区表,分区表没有隐藏分区 ...

0扇区(即 MBR,换句话说,是最开头的那个扇区)有一个分区的 BPB,以及一个分区表。单看这句话,grub4dos 肯定支持。这里根本不存在隐藏这回事。

比如说,你这个盘是 (hd0),那么,你用 (hd0)/ntldr 即可访问你的 FAT16 的根目录之下的 NTLDR 了。

至于说分区表,照样起作用,利用分区表,你可以访问其他分区,例如 (hd0,0) 之类的。

不需要任何技巧,这些概念属于 grub4dos、文件系统等一系列概念中的基本功。

点评

不给力啊  详情 回复 发表于 2015-2-11 17:05
回复

使用道具 举报

855#
发表于 2015-2-11 17:05:43 来自手机 | 只看该作者
不点 发表于 2015-2-11 16:52
0扇区(即 MBR,换句话说,是最开头的那个扇区)有一个分区的 BPB,以及一个分区表。单看这句话,grub4do ...

不给力啊

UC_Photo_001.jpg (325.34 KB, 下载次数: 184)

UC_Photo_001.jpg
回复

使用道具 举报

856#
发表于 2015-2-11 17:16:11 | 只看该作者
你的 BPB 肯定有误,无法指向正确的分区位置。下面举例说明可能的错误大致会是什么样的:

位于偏移 0x0E 处的两字节 “保留扇区数” 错误,导致 grub4dos 无法找到该分区的 FAT 表。保留扇区数是 FAT 表之前的扇区数。不可以复制分区引导扇区上的数值,既然现在引导扇区位于 MBR,那么,FAT 表之前的扇区总数就得重新计算,它应该等于第一个 FAT 扇区的扇区号(MBR 的扇区号为 0)。

位于偏移 0x1C 处的四字节 “隐藏扇区数” 错误,导致 grub4dos 无法找到该分区的引导扇区。此时,它应该是 00 00 00 00 才对,因为它位于 MBR。

点评

啊,我知道了,bOOTICE把bpB拷贝错误了,现在知道了,谢谢  详情 回复 发表于 2015-2-11 17:32
回复

使用道具 举报

857#
发表于 2015-2-11 17:32:49 | 只看该作者
不点 发表于 2015-2-11 17:16
你的 BPB 肯定有误,无法指向正确的分区位置。下面举例说明可能的错误大致会是什么样的:

位于偏移 0x0E ...

啊,我知道了,bOOTICE把bpB拷贝错误了,现在知道了,谢谢

点评

由于保留扇区数只是一个 2 字节的整数,其最大值也不过只有 65535 而已,因此,你的 FAT 应该是磁盘上的第一个物理分区才行(在物理上靠近磁盘开头),否则,当它靠后时,所需要的保留扇区数很大,超过 65535 个扇区  详情 回复 发表于 2015-2-11 17:51
回复

使用道具 举报

858#
发表于 2015-2-11 17:51:11 | 只看该作者
sunsea 发表于 2015-2-11 17:32
啊,我知道了,bOOTICE把bpB拷贝错误了,现在知道了,谢谢

由于保留扇区数只是一个 2 字节的整数,其最大值也不过只有 65535 而已,因此,你的 FAT 应该是磁盘上的第一个物理分区才行(在物理上靠近磁盘开头),否则,当它靠后时,所需要的保留扇区数很大,超过 65535 个扇区,这样就不能用上述简单办法来访问了,需要动用 map --in-situ 或者 partnew 之类的技巧才行。

点评

或者更极端一点,只知道BPB所在扇区  详情 回复 发表于 2015-2-11 18:05
好吧那如果我遇到了这种情况该怎么办(已知该分区的起始扇区和长度)  详情 回复 发表于 2015-2-11 17:54
回复

使用道具 举报

859#
发表于 2015-2-11 17:54:07 | 只看该作者
不点 发表于 2015-2-11 17:51
由于保留扇区数只是一个 2 字节的整数,其最大值也不过只有 65535 而已,因此,你的 FAT 应该是磁盘上的 ...

好吧那如果我遇到了这种情况该怎么办(已知该分区的起始扇区和长度)
回复

使用道具 举报

860#
发表于 2015-2-11 18:03:17 | 只看该作者
用 map --in-situ 吧。用法大致是:map --in-situ (hd0)XXXXXX+YYYYYY (hd0) ; map --hook;

这条命令可以把一个扇区序列仿真为一个硬盘的第一分区,即 (hd0,0)。此时,你用 (hd0,0)/ NTLDR 就可以访问你的 FAT 文件系统下的 NTLDR 文件了。

用完之后,立即用 map (hd0) (hd0) 卸载仿真,然后用 map --rehook 使卸载生效。

当然另外一种方法,也可以用 partnew 命令来实现,你自己研究吧。reboot.pro 上有很多帖子都讨论过 partnew 的使用技巧。

点评

如果情况更极端一下,只知道bpb所在扇区呢  详情 回复 发表于 2015-2-11 18:25
回复

使用道具 举报

861#
发表于 2015-2-11 18:05:58 | 只看该作者
不点 发表于 2015-2-11 17:51
由于保留扇区数只是一个 2 字节的整数,其最大值也不过只有 65535 而已,因此,你的 FAT 应该是磁盘上的 ...

或者更极端一点,只知道BPB所在扇区
回复

使用道具 举报

862#
发表于 2015-2-11 18:25:43 来自手机 | 只看该作者
不点 发表于 2015-2-11 18:03
用 map --in-situ 吧。用法大致是:map --in-situ (hd0)XXXXXX+YYYYYY (hd0) ; map --hook;

这条命令可 ...

如果情况更极端一下,只知道bpb所在扇区呢

点评

自己多动手试验吧,理论掌握得再多,也需要在实践中检验,才能成为可靠的理论。只有自己亲自摸索,才能把理论变成自己的知识。自己在摸索的过程中,还能有新的发现,那就切实成为自己的知识了。  详情 回复 发表于 2015-2-11 20:36
回复

使用道具 举报

863#
发表于 2015-2-11 20:36:15 | 只看该作者
sunsea 发表于 2015-2-11 18:25
如果情况更极端一下,只知道bpb所在扇区呢

自己多动手试验吧,理论掌握得再多,也需要在实践中检验,才能成为可靠的理论。只有自己亲自摸索,才能把理论变成自己的知识。自己在摸索的过程中,还能有新的发现,那就切实成为自己的知识了。

回复

使用道具 举报

864#
发表于 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
回复

使用道具 举报

865#
发表于 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
回复

使用道具 举报

866#
发表于 2015-2-13 11:53:47 | 只看该作者
chenall 发表于 2015-2-13 09:36
这个你的理解错误,有点想当然.

(md)0x880 处存放的是lzma菜单是没有错,但是这个是原始的而不是经过解压 ...

非常感谢!
回复

使用道具 举报

867#
发表于 2015-2-13 12:07:14 | 只看该作者
本帖最后由 mdyblog 于 2015-2-13 12:10 编辑
chenall 发表于 2015-2-13 09:36
这个你的理解错误,有点想当然.

(md)0x880 处存放的是lzma菜单是没有错,但是这个是原始的而不是经过解压 ...


请教C大一个问题:
C中 怎么获得命令行参数, 当前文件名。
看到 get_cmdline_obsolete(struct get_cmdline_arg cmdline)


C中 怎么准备 get_cmdline_obsolete ()的参数?
int
get_cmdline_obsolete (struct get_cmdline_arg cmdline);

struct get_cmdline_arg
{
        unsigned char *cmdline;
        unsigned char *prompt;
        unsigned int maxlen;
        unsigned int echo_char;
        unsigned int readline;
} __attribute__ ((packed));
这个结构怎么准备,怎么填。
我就想获得 命令行参数, 当前文件名。


还看到 get_cmdline(void);
get_cmdline(void) 好像不能直接用。 用了直接重启了。

点评

印像中get_cmdline不能单独使用,它还有一个全局参数,需要先设置好再运行就行了. 参数的话你上面的那个就是了,看参数名字就能理解了. 一个比较重要的 cmdline指针指向要存放输入的字符,配合maxlen限定字符数(需要  详情 回复 发表于 2015-2-13 12:52
回复

使用道具 举报

868#
发表于 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
回复

使用道具 举报

869#
发表于 2015-2-13 13:22:01 | 只看该作者
chenall 发表于 2015-2-13 12:52
印像中get_cmdline不能单独使用,它还有一个全局参数,需要先设置好再运行就行了.

参数的话你上面的那 ...


怎么看 get_cmdline_obsolete()   好像 不是  我要的。

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

get_cmdline_obsolete() 好像是从命令行读取 用户的命令, 比如读取键盘输入的命令行!

“运行当前程序的 命令行” 怎么获得? 其实 就要 %0--当前文件.

点评

当前文件名称,有的dos版本会放在comline的参数上,即和comspec一样可以在psp区段读取。 psp区段一般放在ds:2ch处,比较正式的获取方法是呼叫int 21h ah=62h,BX传回的便是psp区段。 psp:0放的是整个系统参列序列  详情 回复 发表于 2015-2-13 21:46
我不明白这个 “运行当前程序的 命令行” 到底具体指的是什么, 我猜测是要获取到当前"正在运行的命令",这个没有办法得到吧,除非你自己写一个外壳程序 类似于批处理之样的,因为所有的命令都是由你控制运行的,当  详情 回复 发表于 2015-2-13 13:42
回复

使用道具 举报

870#
发表于 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
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-12 15:46

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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