无忧启动论坛

标题: 有兴趣的朋友一起来学习chenall的GRUB4DOS ghostid命令 [打印本页]

作者: yjqd    时间: 2016-10-21 16:05
标题: 有兴趣的朋友一起来学习chenall的GRUB4DOS ghostid命令
本帖最后由 yjqd 于 2016-10-21 16:43 编辑

有兴趣的朋友一起来学习chenall的GRUB4DOS ghostid命令

对GRUB4DOS ghostid我还没摸到火门呢

GRUB4DOS ghostid主要是不是用来确定源分区和目标分区的

作者: 红毛樱木    时间: 2016-10-21 18:20
ghostid是外部命令吗?在chenall.net上没搜索到信息。。。
作者: yjqd    时间: 2016-10-21 21:55
红毛樱木 发表于 2016-10-21 18:20
ghostid是外部命令吗?在chenall.net上没搜索到信息。。。

你看看是不是这个:
GRUB4DOS ghostid命令测试(01-15更新)
http://bbs.wuyou.net/forum.php?m ... &fromuid=569633

作者: yjqd    时间: 2016-10-23 19:02
本帖最后由 yjqd 于 2016-10-23 19:04 编辑

下载了grub4dos-0.4.5a-2010-01-04-chenall.rar,这个grldr集成了ghostid命令

在下面的页面中的54楼下载了ghostid外部命令
http://bbs.wuyou.net/forum.php?m ... =ghostid&page=6

测试后获取到的各分区ID完全正确

-----------------------------------------------------------------------------
用ghostid外部命令获取ID并用dd命令写入2.bat
此操作在fat32分区进行的

2.bat内容如下:
@echo off
set p=ghost     t后面没空格 也没换行
dd命令如下:
dd if=(md) of=(hd0,2)/2.bat bs=1 count=5 skip=0x4FF00 seek=0x11

ghostid命令执行后,得到ID为1:3,再执行dd命令
再执行cat (hd0,2)/2.bat  显示如下:
@echo off
怎么没显示set p=1:3
回到win8pe查看2.bat内容如下:
@echo off
set p=1:3
怎么在win8pe下又显示全了呢


修改2.bat内容如下:
@echo off
set p=ghost    t后面没空格,但回车换了行
再执行上述操作后,cat (hd0,2)/2.bat  显示正常

但在windowsxp下查看2.bat  显示如下:

TT截图未命名.jpg (21.49 KB, 下载次数: 78)

TT截图未命名.jpg

作者: 不点    时间: 2016-10-23 19:33
我猜那是正常的。那个黑方块可能是 ghostid 弄出来的一个换行符,不影响程序的逻辑结构。
作者: yjqd    时间: 2016-10-23 22:15
不点 发表于 2016-10-23 19:33
我猜那是正常的。那个黑方块可能是 ghostid 弄出来的一个换行符,不影响程序的逻辑结构。

问一下,ghostid命令执行后,得到的ID值可用dd命令从内存写入指定文件中

那么makeactive --status执行后,比如显示:

(hd0,0) is active

是否也能把(hd0,0)用dd命令从内存写入指定文件中


如果不能,那么怎样才能获得活动分区的设备号
作者: 不点    时间: 2016-10-23 22:23
当前盘号,当前分区号,都是 grub4dos 变量。你不妨先看看置顶的教程。关于如何写文件,也可看置顶教程。
作者: yjqd    时间: 2016-10-24 21:56
不点 发表于 2016-10-23 22:23
当前盘号,当前分区号,都是 grub4dos 变量。你不妨先看看置顶的教程。关于如何写文件,也可看置顶教程。

看了grub4dos-help-2015-02-09.CHM文档

内置变量四
@root ,用来保存当前root的驱动器号

内置变量六
内存变量 @retval (即 0x4cb00处值) ,获取命令的返回值或其他结果


我写了下列命令判断活动分区并用ghosid获取活动分区id

makeactive  --status  % @root %

if  % @retval%==1  (hd0,2)/ghosid  % @root %

作者: yjqd    时间: 2016-10-25 09:03
直接用find --set-root makeactive --status把激活的主分区设为当前根,不管激活分区是哪个分区,这样就不用root每一个分区了

find --set-root makeactive --status
if  % @retval%==1  (hd0,2)/ghosid  % @root %

作者: yjqd    时间: 2016-10-25 12:40
本帖最后由 yjqd 于 2016-10-25 12:41 编辑
不点 发表于 2016-10-23 22:23
当前盘号,当前分区号,都是 grub4dos 变量。你不妨先看看置顶的教程。关于如何写文件,也可看置顶教程。


问一下grub4dos-help-2015-02-09.CHM文档中变量@retval

是不是有些命令执行后,如果执行失败,@retval值为0,如果执行成功,@retval值为1
------------------------------------------------------------------------------------------------------------------
执行下面命令后:
root (hd0,2)      (hd0,2) 为ntfs分区
root
echo %@@retval%
显示结果为128,  128指的是什么
------------------------------------------------------------------------------------------------------------------
在 map 命令中,(...)+1 的表示法是可以表示设备 (...) 上的 全部扇区”

在cat命令中中内存的全部扇区怎样表示,比如下面 (md)后该怎样写
cat --hex  (md)
------------------------------------------------------------------------------------------------------------------
怎样获取内存的总扇区数

作者: 不点    时间: 2016-10-25 14:38
本帖最后由 不点 于 2016-10-25 14:45 编辑

一般来说,@retval 为 “0” 或 “非0”,表示成功或失败(究竟 0 代表成功还是失败,恐怕也是不统一的)。但究竟是怎样的情况,还要看所执行的命令是哪个。具体究竟是怎样,还要看源代码,或者问问 chenall。

128 可能是指 0x80,表示的是 BIOS 第一个硬盘的号码。

(md) 设备确实也有个 “最大扇区号” 或 “总扇区数”。但是,由于各种主板的内存布局很不统一,所以,这里很可能只计算了第一个连续内存块,其它内存块都没统计上。

cat 命令好像无法表示出 (md) 的全部扇区。

但是,可以用 (rd) 来解决。(rd)+1 永远表示 (rd) 上的全部字节(就是说,甚至可以精确到字节,即,能够考虑到不足一个扇区的那些 “零头”)。

cat --hex (rd)+1 就可以了。不过,你需要事先定义 (rd) 的起始地址和长度。map --rd-base=... 和 map --rd-size=...  可以用来定义 (rd) 的起始地址和长度。

关于主板 BIOS 的内存布局,你可以搜索 Internet 查阅相关信息,或搜索 “int15, E820”。

grub4dos 的 displaymem 命令,可以显示出主板 BIOS 的内存布局。由于内存布局的复杂性(因主板的不同而不同),因此无法直接获取内存的 “总扇区数”。


作者: yjqd    时间: 2016-10-26 08:59
本帖最后由 yjqd 于 2016-10-26 09:06 编辑

不管你在同一分区执行了多少次ghostid,也不管你在几个分区执行了ghostid,它获取的分区ID都是在内存偏移0x4FF00处,换算成10进制是327424字节处,再换算成扇区327424/512=639.5,也就是639个扇区加半个扇区

怎样用cat读取ghostid获取的分区ID

cat --hex (md)0x4FF00+1
这是不能读取到ghostid获取的分区ID的
,因为(md)0x4FF00+1是扇区表示法,0x4FF00转换成10进制是327424,(md)0x4FF00+1表示内存327424扇区开始处的1个扇区,应该用前面得到的分区ID在内存639.5扇区处,也可把639扇区换成16进制为0x27F,cat命令如下:

cat --hex (md)0x27F+1

或者写成:

cat --hex --skip=0x100 (md)0x27F+1

(md)0x27F+1表示从639个扇区开始的1个扇区,由于分区ID在内存639.5扇区处,可以用skip跳过0.5也就是半个扇区256个字节
0x100换算成10进制等于256,cat的skip参数指的是跳过的字节数,也就是跳过256个字节,这样分区ID会显示在屏幕右方的第一行

或者写成:

cat --hex --skip=0x4FF00 (md)+640
cat --hex --skip=0x4FF00 (md)+0x280


(md)+640和(md)+0x280都是表示从0扇区开始的640个扇区

0x4FF00是现成的数字,如果cat命令中有内存的全部扇区表示法,你就可以不用任何换算就可写出这种方式的cat命令




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