无忧启动论坛

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

用Grub4Dos获取硬盘活动分区号与最后分区号[2010-11-08]

[复制链接]
跳转到指定楼层
1#
发表于 2010-9-23 21:00:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[2010-12-01]新版WENV已内置GPART命令,使用更简单,以前的方法退休了。 这里下载新版:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=182254&page=100#pid2103878

[2010-11-19]
因为WENV一直在变化,本帖停止更新,以后GPART.BAT将作为一个标准批处理样本随最新的WENV一起打包上传 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=159851&extra=page%3D1

[2010-11-08]
GPARTS.rar (13.62 KB, 下载次数: 237)

使用方式非常简单了,先指定目标硬盘,再调用批处理即可

压缩包中已包含了所需的两个外部命令 WENV, DISKID
配合最新版grub4dos使用,下载地址
http://code.google.com/p/grub4dos-chenall/downloads/list
!BAT 获取 G4D_DISK 指定硬盘的活动分区号与最后分区号
:成功则生成以下4个变量
WENV (reset GP_G4D_A ; reset GP_G4D_L ; reset GP_GH_A ; reset GP_GH_L)
:目标硬盘
WENV get G4D_DISK || WENV (echo variable G4D_DISK not found ; call kernel)
WENV call cat --length=0 (hd${G4D_DISK})+1 || WENV (echo (hd${G4D_DISK}) not found ; call kernel)
:硬盘分区信息
debug status | WENV set -t _G_DEBUG= && WENV set _G_DEBUG=${_G_DEBUG## } && debug 1
WENV call geometry (hd${G4D_DISK}) | WENV set GP_G4D_A= && WENV set GP_G4D_L=${GP_G4D_A}
:截取结果
WENV check "active"<-"${GP_G4D_A}" (set GP_G4D_A=$${GP_G4D_A%%, active} ; set GP_G4D_A=$${GP_G4D_A## })
WENV check "num: "<-"${GP_G4D_L}" (set GP_G4D_L=$${GP_G4D_L##num: } ; set GP_G4D_L=$${GP_G4D_L%%,})
:转换为GHOST格式
WENV get GP_G4D_A && WENV echo (hd${G4D_DISK},${GP_G4D_A}) | DISKID | WENV set -t GP_GH_A= && WENV set GP_GH_A=${GP_GH_A## }
WENV get GP_G4D_L && WENV echo (hd${G4D_DISK},${GP_G4D_L}) | DISKID | WENV set -t GP_GH_L= && WENV set GP_GH_L=${GP_GH_L## }
:恢复环境
WENV (call debug ${_G_DEBUG} ; reset _G_DEBUG)


[2010-11-03]
最新方法见:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=159851&page=68#pid2077571
太简单了,只需要一个Grub4Dos批处理
需要新版的WENV(支持变量子串查找)
需要新版的grldr(支持批处理和菜单中使用管道)

[2010-09-29]更新
GPARTS.rar (2.48 KB, 下载次数: 213)
1.新了解了两个命令的用法
  parttype (hdx,y) 可以获取分区类型
  makeactive --status (hdx,y) 可以判断是否活动分区
  因此,仅就获取分区号而言,不需要指定缓冲区了。
  但我仍然保留了缓冲区,因为……
2.使用了新的返回菜单调用方法
  GP_MENU 变量改为 GP_CMD
  原传递菜单文件
  WENV set GP_MENU=/my_menu.lst
  改为
  WENV set GP_CMD=configfile /my_menu.lst
  
  这样不仅可以传一个菜单文件名进来,甚至可以传一个比较复杂的命令(可以在返回前干一些其它的事件),如
  WENV GP_CMD=clear\ngeometry (hd0)\npause press any key to continue...\nconfigfile /my_menu.lst
  这个命令首先会写入缓冲区(WENV不能直接run configfile命令),所以这条复合命令的长度不能超过缓冲的大小0x50。但用户可以使用的总长是0x50-1个字节,因为不管用户命令是否以\0结束,gparts.lst将写入缓冲区时都会在最后加一个\0字符。


[2010-09-29]
基于GPARTS.LST获取分区号的“一键gohst”演示版及xDOS介绍

[2010-09-26]更新
GPARTS.rar (2.51 KB, 下载次数: 181) [2010-09-26] (忘了上传更新的附件,补上)
1.硬盘未分区时,返回GP_LAST=0,取消返回变量STR_LAST(之前返回X:0,减少无效的变量名占用)
2.活动分区不存在时,GP_ACTI=0,取消返回STR_ACTI变量(之前返回X:0,减少无效的变量名占用)
  经此改动,调用gparts.lst后,肯定会返回的变量是GP_LAST。
  如要防止菜单循环调用,请使用 WENV get GP_LAST || configfile ../gparts.lst
3.精简了内部临时变量,并统一以 "_G_" 为前缀,清理时比较清楚
4.默认 debug off 提高速度


  首先用两分法找到最大的有效分区号,再读取分区表,判断4个表项中有效的主分区数就可以算出总分区数(实际上就是Ghost所用的最后分区号码)。分析主分区表同样可以确定活动分区编号。
  这个有什么用呢?做过“一键ghost”类工具的应该立即能想到吧?

#>>>>>>>>>>>>>>>>>>>>>>>>>>>> 文件注释 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#删除文件注释不影响菜单功能
#文件: gparts.lst
#功能: 查找活动分区、最后分区(ghost)编号

#入口:
# DISK  待查找的硬盘(Ghost)编号,必须指定
# GP_MENU  返回的菜单文件名

#出口:
# GP_ACTI  活动分区号, 同时写入地址ADDR_A(如已指定)
# GP_LAST  最后分区号, 同时写入地址ADDR_L(如已指定)
# STR_ACTI 活动分区字符串(DISK:GP_ACTI)
# STR_LAST 最后分区字符串(DISK:GP_LAST)

#可调整参数
# ADDR_A  活动分区号写入地址, 默认 0x60020
# ADDR_L  最后分区号写入地址, 默认 0x60024
# ADDR_DEF 若设置此变量(任意值),上面2个变量使用默认地址
# ADDR_BUF 指定缓冲区地址, 未设定时默认0x60040(缓冲大小0x50字节)
# GP_PARTS 若设置此变量(任意值),计算出分区数 GP_LAST 就返回
#<<<<<<<<<<<<<<<<<<<<<<<<<<<< 文件注释 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

1.最简单的用法
WENV set DISK=1      // 指定待分析的硬盘号
WENV set GP_MENU=.../yourmenu.lst // 指定返回的菜单文件名
configfilg .../gparts.lst   // 分析磁盘,完成后自动调用 yourmenu.lst
返回后会增加4个环境变量 GP_ACTI, GP_LAST, STR_ACTI, STR_LAST

2.调整参数
  因为 gparts.lst 要分析主分区表,需要 0x50 字节的缓冲区来保存复制的分区表,默认使用 0x60040-0x6008F 内存块,如果跟自己的使用环境冲突,可以指定缓冲区地址
WENV set DISK=1      // 指定待分析的硬盘号
WENV set GP_MENU=.../yourmenu.lst // 指定返回的菜单文件名
WENV set ADDR_BUF=0x60040   // 指定自己的缓冲区首地址
configfilg .../gparts.lst   // 分析磁盘,完成后自动调用 yourmenu.lst

3.显式指定 ADDR_BUF=0x60040 与默认使用 0x60040 的区别
  不论是否指定ADDR_BUF,在 gparts.lst 被调用期,这个变量名都是存在的,但默认返回后会自动清掉。如果用户显式指定ADDR_BUF,则返回会变量名仍然保留。

GPARTS.rar (2.51 KB, 下载次数: 193)

[ 本帖最后由 tuxw 于 2010-12-11 12:28 编辑 ]
2#
 楼主| 发表于 2010-9-23 21:18:24 | 只看该作者
使用此工具时要注意避免循环调用的问题,比如


A.LST
========================
default 0

WENV set DISK=1
WENV set GP_MENU=/A.LST
configfile /gparts.lst

title 0 ...
...

title 1 ...
=============================
上面这种情况会导致循环调用,简单介绍两种避免方法

一、A.LST 可写时
WENV set DISK=1
WENV set GP_MENU=/A.LST
cat --locate=gparts.lst --replace.not /A.LST
configfile /gparts.lst || ECHO

用 write --offset=xx /A.LST # 注释configfile行更精确,但修改文件后要注意偏移量修改

二、A.LST 不可写

WENV set DISK=1
WENV set GP_MENU=/A.LST
WENV get STR_LAST || configfile /gparts.lst

STR_LAST 是 gparts.lst 返回的4个变量之一,用任何一个均可

[ 本帖最后由 tuxw 于 2010-9-23 21:19 编辑 ]
回复

使用道具 举报

3#
发表于 2010-9-24 16:32:47 | 只看该作者
这个不错,感谢楼主分享。。
回复

使用道具 举报

4#
发表于 2010-9-24 23:59:39 | 只看该作者
很详细,谢谢楼主!!
回复

使用道具 举报

5#
发表于 2010-9-25 00:34:40 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

6#
 楼主| 发表于 2010-9-26 18:42:34 | 只看该作者
原帖由 2010weihu 于 2010-9-25 00:34 发表
很伤感,我看不懂,虽然我对一键GHOST很感兴趣,可惜了。。。


有空我会做一个基于它的一键ghost的demo版
回复

使用道具 举报

7#
发表于 2010-9-26 19:30:22 | 只看该作者
又一个grub4dos的达人。
膜拜中。。。
回复

使用道具 举报

8#
发表于 2010-9-26 19:47:48 | 只看该作者
取得这些信息,一般都是用于一键恢复。
对于ghost,image等备份内核而言,grub4dos取得的信息,算不算是第三方工具?
个人倾向于认为,使用备份内核本身取得的信息更符合不依赖第三方工具的提法。
比如,用ghost的话,就用ghost.exe来取得。

当然,楼主高超的技艺,令人佩服之至。
回复

使用道具 举报

9#
 楼主| 发表于 2010-9-26 20:37:41 | 只看该作者
原帖由 lianjiang 于 2010-9-26 19:47 发表
取得这些信息,一般都是用于一键恢复。
对于ghost,image等备份内核而言,grub4dos取得的信息,算不算是第三方工具?
个人倾向于认为,使用备份内核本身取得的信息更符合不依赖第三方工具的提法。
比如,用g ...


当然,要严格的究这个第三方工具几个字的话,这个确实还算是三方工具。我的意思其实现在很多“一键ghost”类的工具都不是单一工具,最终它们还是用Grub4Dos来引导的,所以直接用Grub4Dos来获得这些信息,避免使用其它的工具。
回复

使用道具 举报

10#
发表于 2010-9-26 23:33:40 | 只看该作者
用GRUB4DOS来获得这些信息有一个特点就是速度快,只要算法没有错,就不会有错。
用GHOST来获取速度比较慢,特别是碰到一些问题电脑,要卡好一会儿。

再配合GRUB4DOS的文件读写功能,可以进入DOS后直接运行GHOST。(像QGHO一样)
回复

使用道具 举报

11#
发表于 2010-9-29 06:51:34 | 只看该作者
有没有可能直接在 grub4dos 下进行类似于 ghost 的操作?

首先,制作一个分区的映像,制作映像的时候,要像 ghost 一样,把没用的 pagefile 之类的文件删除掉,这当然比较麻烦。然后,用 gzip 压缩它。最后,用直接拷贝的方式,将其写到用户的分区上。或许还有一个步骤,把引导扇区写入合适的引导代码。这不就是 ghost 的过程吗?
回复

使用道具 举报

12#
 楼主| 发表于 2010-9-29 08:31:48 | 只看该作者
原帖由 不点 于 2010-9-29 06:51 发表
有没有可能直接在 grub4dos 下进行类似于 ghost 的操作?

首先,制作一个分区的映像,制作映像的时候,要像 ghost 一样,把没用的 pagefile 之类的文件删除掉,这当然比较麻烦。然后,用 gzip 压缩它。最后, ...

partnew [--active] PART TYPE START [LEN]
这条命令已经具有恢复分区的能力了
问题是如何产生备份文件,依赖其它工具产生备份文件的话意义不大。如果不考虑效率和空间,dd命令也可以的。
grub4dos本身是支持gzip的,看有没有可能将它独立成一个命令
回复

使用道具 举报

13#
 楼主| 发表于 2010-9-29 16:35:22 | 只看该作者
回复

使用道具 举报

14#
 楼主| 发表于 2010-11-3 23:09:16 | 只看该作者
使用了全新的简化方法,顶起来
回复

使用道具 举报

15#
发表于 2010-11-3 23:59:39 | 只看该作者
获取当前硬盘最后分区还有另一个方法
root endpart
就可以了(在QGHO里面有用过)
当然了得先root 到该硬盘.
比如,获取第2硬盘最后分区
rootnoverify (hd1)
root endpart
回复

使用道具 举报

16#
 楼主| 发表于 2010-11-4 00:17:11 | 只看该作者
@chenall

管道有没有可能改成允许多个串接的?

WENV echo (hd${disk},${active}) | DISKID | WENV set GH_ACTI=

现在不能连续使用2个管道,所以只能从 0x4FF00 获取结果
回复

使用道具 举报

17#
发表于 2010-11-4 00:41:41 | 只看该作者
原帖由 tuxw 于 2010-11-4 00:17 发表
@chenall

管道有没有可能改成允许多个串接的?

WENV echo (hd${disk},${active}) | DISKID | WENV set GH_ACTI=

现在不能连续使用2个管道,所以只能从 0x4FF00 获取结果


这个是有可能的,会麻烦些.明天再试试看.
回复

使用道具 举报

18#
发表于 2010-11-4 11:32:31 | 只看该作者
g4d越来越爽了。。。。
回复

使用道具 举报

19#
发表于 2010-11-4 22:15:01 | 只看该作者
的确很不错。。。有空试试
回复

使用道具 举报

20#
 楼主| 发表于 2010-11-8 15:04:44 | 只看该作者
Grub4Dos 的批处理和多管道连写太棒了,以前很复杂的问题,现在变简单了
回复

使用道具 举报

21#
 楼主| 发表于 2010-11-19 13:58:13 | 只看该作者
因为WENV一直在变化,本帖停止更新,以后GPART.BAT将作为一个标准批处理样本随最新的WENV一起打包上传 http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

22#
 楼主| 发表于 2010-12-11 12:29:04 | 只看该作者
新版WENV已内置GPART命令,使用更简单,以前的方法退休了。 这里下载新版:http://bbs.wuyou.net/forum.php?m ... page=100#pid2103878
回复

使用道具 举报

23#
发表于 2011-10-12 14:03:35 | 只看该作者
如何与GHOST结合起来,加传给GHOST的fd中?
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-27 14:15

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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