无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 8703|回复: 20
打印 上一主题 下一主题

[已解决] 请教关于wee的两个小问题

  [复制链接]
跳转到指定楼层
1#
发表于 2013-12-28 23:03:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pppfj 于 2014-1-5 22:20 编辑

最近在学习wee的使用,有几处不太清楚,特此请教:
    1.进入wee的命令行后,wee的提示符显示为:
wee 0>
,执行命令:hexdump后,提示符变为:
wee 17>
;执行命令:title后,显示出内置菜单,按esc退出后提示符变为
wee 23>
,再执行find命令后,提示符又变回:
wee 0>
。请问:提示符wee后的数字代表什么?
    2.在本人机器上,在wee的命令行执行不带参数的find命令,显示:
(0x80,255) (0x80,0) (0x80,1) (0x80,2)
,后面三个似乎硬盘的三个分区,请问:(0x80,255)代表什么意思?
    3.在wee的命令行执行root命令,显示:
(0x80,255):0,0:00,0C:unknown
,如何理解?

    谢谢!
2#
发表于 2013-12-29 00:06:14 | 只看该作者
老兄,wee 提示符后面的数字是出错的代号。出错代号的意义与 grub4dos 相同。请查阅 grub4dos 的出错代码信息。0 是表示执行命令成功。其他值表示失败。

按 tab 键可以列出支持的内部命令。hexdump 不是内部命令,所以出错。

title 是内部命令,执行它就能进入内置菜单。

(0x80,255) 等价于 (0x80),也即 (hd0)。

就是说,分区号 255 表示的是整个硬盘。

    (0x80,255):0,0:00,0C:unknown

这是说,当前设备是 (hd0),它不是一个分区,而是整个硬盘。因此,它没有别的有效信息。unknown 表示文件系统的类型是未知的。如果 MBR 上含有有效的 BPB,则 (hd0) 的文件系统就可以识别出来了,例如 FAT。

如果是一个普通分区,那么其他的信息就是:起始扇区号、分区长度、分区是否激活(80 表示激活,00 表示非激活)以及分区的 ID 字节。

回复

使用道具 举报

3#
 楼主| 发表于 2013-12-29 10:36:10 | 只看该作者
本帖最后由 pppfj 于 2013-12-29 11:04 编辑

    谢谢不点大师深夜指点,保重身体。
    关于“wee 提示符后面的数字是出错的代号”的问题,经您指点后,发现在置顶的wee的help文档中,在介绍第4个命令exit时以注释的方式说明了,只怪自己学习不认真。做为惩罚,把help文档仔仔细细从头到尾读了三遍。
    wee的命令行界面,是wee的学习使用者首先接触到的东西,help文档对此的描述所放位置太隐蔽了。
    但是,上述疑问中关于不带参数的hexdump、find、root命令的作用,以及命令返回结果的说明,help文档在介绍三个命令时却没有提及。不知道help的原作者是否愿意根据大师的指点,补充完善一下三个命令的说明,给初学者更明确的指导。
回复

使用道具 举报

4#
 楼主| 发表于 2013-12-29 11:26:39 | 只看该作者
本帖最后由 pppfj 于 2013-12-29 14:23 编辑

通过对help文档的深入学习,关于command命令有些疑问。help文档中介绍:
command
command命令用来执行外部可执行文件。
语法:
command [FILE [ARGS]]
wee不再需要 chainloader 和 kernel 命令了,取而代之的是用 command 本身的功能。command 命令把可以引导的文件(示例如单扇区文件、NTLDR、IO.SYS、vmlinuz 等)都当作可执行文件来对待了。单单在命令行之下敲入 ntldr、 io.sys或者 vmlinuz 等,就可以启动相应的文件了,它们已经是wee的可执行程序了…………

示例1:
#启动linux
command (hd0,0)/vmlinuz (hd0,0)/initrd.img root=UUID=XXXXXXXXXXXXX ro quiet splash acpi=noirq
……
示例2:
#启动mbr
(hd0)+1
示例3:
#启动dbr
(hd0,0)+1

疑问1:"wee 0>command /ntldr"是否等价于“wee 0>/ntldr"?如果推论成立的话,command命令是否就不再需要了?
疑问2:“启动linux: command (hd0,0)/vmlinuz (hd0,0)/initrd.img root=UUID=XXXXXXXXXXXXX ro quiet splash acpi=noirq ”,是否可以直接用:(hd0,0)/vmlinuz (hd0,0)/initrd.img root=UUID=XXXXXXXXXXXXX ro quiet splash acpi=noirq ?
疑问3:默认的root设备描述符是否可以省略?如:
    假如root设备为(hd0),那么“(hd0)+1”是否等价于:命令行直接输入:“+1”?
    假如root设备为(hd0,0),(hd0,0)+1=+1?

以上这些疑问,help文档都没有说明,望指点。也希望文档更完善。
回复

使用道具 举报

5#
发表于 2013-12-29 14:30:54 | 只看该作者
很抱歉,我自己很少使用 WEE,所以,我也不知道 WEE 的命令究竟有多少了。您对于文档的不完善,能够给以理解并提出建议,而不是抱怨,我对此也表示敬佩。关于 hexdump,我还真的忘了这条命令了。但我知道,它是为黑客准备的。其实,这话又是多余,因为能够来使用 WEE 的人,就不是外行了。但是,有些命令,确实很少用到,只是给 fans 使用的。如果我没记错的话,在一个命令行的开头,直接按 delete 键,就执行 hexdump 的操作。很多东西是未公开的。不是不愿意公开,而是没有时间去做这个工作。

黑客们不妨自己看看源代码,了解各个命令的用法,然后自己写出文档,作为对现有文档的补充,供其他人参考。

自己身体差,事物繁多,照顾不了文档的编写,确实该 “打板子”。给大家造成的障碍和不便,深表歉意。

command 命令通常是可以省略的。如果有某个外部命令正好与内部命令的名字相同,那可能就需要用 command 命令了。另外,假如某个外部命令同时具有多种可执行格式,那将来也许需要用 command 命令的某个参数来指定采用其中的一种格式,而不是其他的格式。比如说,grub.exe 既是 Linux 格式,又是 GRLDR 格式。目前,我们只使用 Linux 格式来启动 grub.exe。假如将来有人希望以 GRLDR 格式来启动 grub.exe,那就需要为 command 命令添加一个启动参数(开关)了。

当前设备名是可以省略的。

wee 有很多功能是简化了的,与 grub4dos 有差别。其中也有某些比 grub4dos 更方便的设计,比如,前面你看到的 root 命令能够返回 “起始扇区” 和 “分区长度” 信息,这就是一点改进,方便黑客们掌握系统的基本情况。

回复

使用道具 举报

6#
 楼主| 发表于 2013-12-30 13:05:13 | 只看该作者
本帖最后由 pppfj 于 2013-12-30 13:37 编辑

谢谢大师指点。本人不是计算机相关行业人员,更不可能是黑客,只是一名普通的使用者、爱好者,因此所问的问题比较幼稚,但在一定程度上代表处于同一水平的普通用户。
    继续wee的学习过程,了解内置菜单。用十六进制编辑器打开wee63.mbr,在文件结尾附近发现了类似菜单的东东:

将其文字部分单独摘出来后,结果如下:
  1. find --set-root /boot/grub/grldr /boot/grub/grldr
  2. timeout 1
  3. default 0

  4. title 1. Windows
  5. find --set-root --active command +1
  6. find --set-root /bootmgr /bootmgr
  7. find --set-root /ntldr /ntldr

  8. title 2. Grub4dos
  9. find --set-root /boot/grub/grldr /boot/grub/grldr
  10. find --set-root /boot/grub.exe /boot/grub.exe
  11. find --set-root /boot/grldr /boot/grldr
  12. find --set-root /grub.exe /grub.exe
  13. find --set-root /grldr /grldr
  14. ……………………
复制代码

有两个问题请教:
1.从偏移0x78D0-0x78DB连续的12个00字节是否是wee内核结束的标志?
2.在置顶的wee的help文档中,介绍timeout命令时指出:“在菜单头部使用,不能用于菜单项中。”,那么,上面菜单中,timeout命令前面的一行“find --set-root /boot/grub/grldr /boot/grub/grldr”,是否属于菜单的组成部分?
3.以上面的十六进制代码为例,如果想要手工将菜单整合进wee中,从哪个偏移位置开始粘贴?
C大的weesetup可以完成菜单整合的功能,在此提问,只为学习和了解wee的结构和原理,望见谅并赐教。
谢谢!
回复

使用道具 举报

7#
发表于 2013-12-30 22:21:46 | 只看该作者
本帖最后由 不点 于 2013-12-30 22:33 编辑

wee 的内置菜单,与 grub4dos 的内置菜单是类似的。它的位置,可以精确定位。自己找找以前的帖子吧。

如果我的记忆没错的话,在 grldr 的偏移 0x206C 处,就有一个指针,指向内置菜单。不过,这个指针是需要进行一个运算,才能得到内置菜单的位置的。

同样地,在 wee63.mbr 的偏移 0x46C 处,也有一个类似的指针。

以上是从技术角度考虑的。

从非技术的角度,也有判断的方法,那就是 “肉眼” 判断方法:

B0 02 1A CE 接着是 12 个 00 字节。再接下来就是菜单了。

你所说的 find 命令,也位于菜单头部,即,位于所有的 title 命令之前。这些命令都属于 “菜单初始化命令”,不是菜单项命令。

有很多工具软件都支持导入导出 wee 以及 grub4dos 的内置菜单。你找找看,应该不止一种。


不建议手动操作。手动操作有两大危险:

1、容易一时犯糊涂,毁掉分区表,造成整个硬盘的数据丢失。

2、容易超过 63 扇区界限,造成紧接着的 PBR 分区上 BPB 的破坏,因而这个分区的数据也就 “完蛋” 了。

回复

使用道具 举报

8#
 楼主| 发表于 2013-12-31 10:11:15 | 只看该作者
本帖最后由 pppfj 于 2013-12-31 15:42 编辑

  谢谢大师。通过您的指点,知道了grldr和wee是通过内部指针判定内置菜单位置的,而不是通过内核结束标志识别,甚至可以认为内核不一定有所谓的结束标志,颠覆了以前自己的猜想。作为外行,了解到这里,足够了。
  我是属于不但知其然,还想知其所以然类型的,只是所从事的不是电脑或软件类的工作,对编程不懂,看不懂代码,无法自己找答案,所以给大家添麻烦了。
  一个软件的影响力和认可度,除了软件自身的功能和易用性之外,有人对初学者热心解惑也是重要组成部分。
  除了大师本人外,衷心希望能有更多的热心人。
  这个帖子,如果能够给后来的初学者留下点线索,也是勉强算作一点贡献吧。
回复

使用道具 举报

9#
 楼主| 发表于 2013-12-31 17:49:50 | 只看该作者
内置脚本这一条命令相对不好理解:
find --set-root --active command +1

尝试一下做个解释,如果错了请指正:
    在wee所发现的所有设备中查找激活分区,找到第一个后,将其设置为根设备,并执行命令+1,即:从该分区的引导记录进行引导。
命令:find --set-root --active command +1
是否等价于:
find --set-root --active +1
是否也等价于:
find --set-root --active
command +1

find --set-root --active
+1
回复

使用道具 举报

10#
发表于 2013-12-31 20:28:39 | 只看该作者
find 的基本用法就是:find 【选项】【文件名】 【条件】

对照 find --set-root --active command +1 ,就可以分析,“选项” 部分是 --set-root --active,而 “文件名” 被省略,没有出现。command +1 就只能充当 “条件” 了。

--set-root 意思是找到分区后把它设置为当前设备。--active 的意思是只查找激活的分区。而查找的条件是满足 command +1。但这个条件是不会返回的,它直接启动 +1 这个引导扇区。所以,如果查找的结果是成功的,则命令不会返回到 wee 的系统当中,而是直接启动激活的分区了。那么,find 命令之后的那些命令,就没有机会获得控制权了。如果查找失败,当然,后续的命令就可以执行了。

从以上分析可知,此时的 --set-root 参数是可以省略的。--set-root 的意思是为后续的命令行设置默认的工作设备(即,当前设备)。既然查找成功后不可能返回,那也就没必要为后续的命令设置当前工作设备了。

再来分析 find --set-root --active +1:这时,+1 是合法 “文件名”,所以,意义就完全不同了。“条件” 部分是不存在的。查找活动的分区,只要这个分区的第一扇区—— 即 ()+1 ——是存在的便可。找到后,设置它为当前工作设备。通常这个 +1 也是可以省略的,因为活动分区通常都是实际存在的分区。也有一些分区是没有第一扇区的,比如,(hd0,0)、 (hd0,1)、(hd0,2)、(hd0,3) 这四个主分区,往往就有一两个是空白分区,是不存在实际内容的。这些空白分区在 MBR 分区表里面的表项都是 00 字节。所以,带上 +1 也不算多余吧,能够过滤掉那些空白分区。

最后再来分析这两个:

find --set-root --active
command +1

find --set-root --active
+1

它们俩就是等价的了。找到活动分区后,设置当前工作设备为该分区,然后启动该分区的第一扇区。但问题是,如果不存在活动分区,则 command +1 照样要执行,此时,由于 find 失败,所以,当前工作设备保持为 find 命令之前的值,所以,command +1 就是启动原来的当前设备的第一扇区。您可以对比一下,这与前面所说的 find --set-root --active command +1 的效果是有差别的。

回复

使用道具 举报

11#
 楼主| 发表于 2014-1-1 14:47:02 | 只看该作者
看来我对find命令的理解有问题。参考大师的解释,又把grub4dos及wee帮助文件中关于find命令的说明仔细读了几遍,感觉二者对【condition】的解释都不够透彻:
find 命令的语法允许带条件的查找设备。

find [OPTIONS] [FILENAME] [CONDITION]
       选项      文件名      条件

其中的 CONDITION 是一个返回值是 TRUE 或者 FALSE 的标准 grub 命令。


find是如何带条件查找设备的,言之不详。是不是可以这样理解:
find 命令的语法允许带条件的查找设备。

find [OPTIONS] [FILENAME] [CONDITION]
       选项      文件名      条件

其中的 CONDITION 是一个返回值是 TRUE 或者 FALSE 的标准 grub 命令。当返回值为true时,执行查找操作;返回值为false,不执行查找操作?


如果按照上述理解的话,【condition】所含的grub命令是先于find得到执行的。以下命令的理解就比较费解了:
find --set-root /ntldr /ntldr
1.首先尝试执行当前根设备下的/ntldr,如果成功了,就执行“find --set-root /ntldr”的相关操作。但是,如果成功了,ntldr就被引导起来了,“find --set-root /ntldr”的操作就不可能得到执行了,当然也没有必要执行了。
2.如果/ntldr执行不成功,返回false,(例如,当前设备根目录下没有ntldr文件),就不再执行“find --set-root /ntldr”的操作。
结论:“find --set-root /ntldr”的操作永远无法得到执行。
这样的理解似乎有问题,咋回事呢?
回复

使用道具 举报

12#
 楼主| 发表于 2014-1-1 15:04:16 | 只看该作者
又学习了置顶贴grub4dos帮助文档中关于的find英文解释,感觉也很费解:
find [--set-root[=DIR]] [--devices=DEVLIST] [--ignore-floppies] [--ignore-cd] [FILENAME] [CONDITION]
search for the filename FILENAME if all of partitions and print the list of the devices which contain the file and suffice CONDITION. CONDITION is a normal grub command, which return non-zero for TRUE and zero for FLASE.

琢磨了半天,似乎发现了一个文字小bug:
search for the filename FILENAME in all of partitions and print the list of the devices which contain the file and suffice CONDITION. CONDITION is a normal grub command, which return non-zero for TRUE and zero for FLASE.

,这样修改就相对好理解一些。
如果真是文字错误,该如何通知作者修正帮助文档呢?
回复

使用道具 举报

13#
发表于 2014-1-1 15:21:05 | 只看该作者
你确实是个认真的人,找到了文档的毛病。不过这个含糊的说明文档,责任是在我。

条件命令的执行,是以找到的分区为当前设备的。不是先于 find 执行的。

find 命令每找到一个设备,就把这个设备临时设置为 “当前工作设备”,然后执行条件命令。就是说,当条件命令执行时,当前工作设备已经是那个分区了。执行条件命令之后,如果返回 True,则这个分区就正式被承认是找到了。如果条件的执行返回结果是 False,那么这个分区就要被过滤掉,即,忽略掉在这个分区找到文件的事实,继续在别的分区进行查找。

如果 find 带有 --set-root 参数,则 find 执行后,会把找到的分区设置为当前工作设备。如果没有找到分区,则会恢复以前的当前工作设备。

如果 find 不带 --set-root 参数,则 find 执行之后,会恢复以前的当前工作设备。

就是说,find 在查找过程中,会临时更改当前工作设备。每次去尝试查找一个分区的时候,都会临时设置当前工作设备为该分区。

回复

使用道具 举报

14#
 楼主| 发表于 2014-1-1 16:08:25 | 只看该作者
呵呵,我不是故意挑毛病的,只是心中有疑惑,在学习而已,见谅。
经过大师指点,彻底明白了。感觉还是E文的解释最准确。
命令:find --set-root /ntldr /ntldr的正确解释是:
查找根目录下包含ntldr文件、并且能够正确执行的分区,把它设置为当前设备。这是字面意思。实际上,这条命令所起到的作用,就是找到一个包含ntldr文件(没有损坏)的分区,并引导它。因为在做【condition】条件测试时,就再也不会返回到g4d中了,诚如大师在10楼所言,--set-root参数,是可以省略的。
回复

使用道具 举报

15#
 楼主| 发表于 2014-1-1 18:47:10 | 只看该作者
大师们写代码,极其简练。过于简练,有时不好理解。关于“+1”的不同含义,学习后写在这里备忘:
1.“+1”代表一个扇区,如:(hd0)+1=(hd0)0+1,指硬盘的第一扇区(mbr);(hd0,0)+1=(hd0,0)0+1,指第一分区的第一个扇区(pbr);
2.“+1”代表一个磁盘,如:(rd)+1,代表整个(rd)盘区;(hd32)+1,似乎代表整个虚拟光驱(不太确定);
3.“+1”代表一个可执行文件。这里引用不点大师在其他帖子里的一段说明:
find --set-root /boot/IBM.ICO
+1
此处的 +1 表示一个单扇区的文件,它以 55 AA 结尾,就被认为是精简版 grldr 的一个合法的可执行文件。

不点大师的这点解释,希望能进入到置顶帖wee的help文档中。
回复

使用道具 举报

16#
 楼主| 发表于 2014-1-5 16:45:19 | 只看该作者
本帖最后由 pppfj 于 2014-1-5 16:50 编辑

    经过几天的学习,基本掌握了wee的一些用法,开始着手将wee嵌入硬盘的mbr区域。因为在自己机器上使用,硬件环境比较固定,因此没有追求菜单的通用性。自己编辑的内置菜单如下:
default 0

title    1. Boot from (hd0,0) for Windows 7
root (hd0,0)
command …………(省略)
command +1

title    2. Boot from (hd0,1) for Windows XP
root (hd0,1)
command +1

title    3. Boot from (hd0,2) for Linux-Mint
root (hd0,2)
/vmlinuz /initrd.img root=/dev/sda3 ro quiet splash

title    4. Commandline
commandline

经测试,发现wee的功能确实强大,可以直接执行C大编写的一个外置命令,实现XX。这样的话,grldr一般情况就用不到了,除了map和从iso映象文件直接引导。但上述菜单也发现了几个问题:
    1.省略了timeout命令,本以为会直接执行:default 0,进入第一个菜单项,但实际却是wee停留在菜单界面,必须手动选择一个菜单。why?
    2.知道wee没有commandline命令,但还是在第四个菜单放了一个,本意是想让执行出错,这样自然回到命令行,但实际执行该项菜单时,屏幕闪烁一下后,仍停留在菜单界面。应该执行哪个命令回到命令行?
    3.执行某个菜单的初期时,菜单下包含的命令会显示在屏幕几秒钟,然后才进入被引导的系统。有办法不显示菜单下的命令,清屏直接进入被引导的系统吗?
    谢谢!
回复

使用道具 举报

17#
发表于 2014-1-5 17:19:02 | 只看该作者
1、你在 grub4dos 里面,省略 timeout,是不是也停留在菜单界面呢?

2、菜单命令出错时,会重新显示菜单。要退出菜单而进入到命令行,可以试试 exit 命令。按键盘的 c 键,是不是也可以手动进入命令行?

3、没有办法屏蔽显示信息。因为开发 “屏蔽显示信息” 的这部分代码,也要浪费宝贵的代码空间,属于多余的、没有太大实际应用价值的工作。

回复

使用道具 举报

18#
 楼主| 发表于 2014-1-5 19:14:37 | 只看该作者
经测试:
1.wee和grldr一样,如果菜单中没有timeout命令,则直接显示菜单界面,等待人工选择。
2.在菜单中使用exit命令,可以正确退回到命令行。我把内置菜单改为了:
title 4. Commandline
exit

3.作为使用者,完全接受。无法实现“静默引导”,略感遗憾。总体而言,瑕不掩瑜,Excellent!
回复

使用道具 举报

19#
发表于 2014-2-25 00:13:51 | 只看该作者
我感觉
撸主在title 1   XX的时候可以这样

  1. title    1. Boot from (hd0,0) for Windows 7
  2. command (hd0,0)/XX (hd0,0)/XX.bin
  3. command (hd0,0)/bootmgr
复制代码


这样省掉了一条root
进系统会不会快那么一点点,纯属个人猜想,我的菜单就是这么写的,不知道是好是不好。

点评

可以直接把XX写入磁盘,将XX.bin放在一个特定目录下加载,这样一来,可以完全智能化加载了。  详情 回复 发表于 2014-2-25 00:47
回复

使用道具 举报

20#
发表于 2014-2-25 00:47:00 | 只看该作者
xydche 发表于 2014-2-25 00:13
我感觉
撸主在title 1   XX的时候可以这样

可以直接把XX写入磁盘,将XX.bin放在一个特定目录下加载,这样一来,可以完全智能化加载了。

点评

怎么才能让XX自动运行呢  详情 回复 发表于 2014-2-25 18:07
回复

使用道具 举报

21#
发表于 2014-2-25 18:07:01 | 只看该作者
天使的魔翼 发表于 2014-2-25 00:47
可以直接把XX写入磁盘,将XX.bin放在一个特定目录下加载,这样一来,可以完全智能化加载了。

怎么才能让XX自动运行呢
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-12-1 19:06

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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