[原创]QGHO 快速一键恢复程序(2011-01-02更新)

发表于

[说明]
QGHO是一个用于演示GRUB4DOS功能的小程序.
可以快速全自动/手动 备份恢复分区.(使用GHOST内核).
目前为止最快速/最小巧的基于DOS+GHOST的备份恢复程序.
BUG报告或其它资料请移步我的搏客
http://chenall.net/post/qgho/

[注意事项]

  1. 必须安装在硬盘上使用,因为默认是备份第一硬盘第一分区到第一硬盘最后分区的.
    如果U盘启动可能会备份到U盘中
  2. 如果需要修改默认设置请看QGHO.SET文件.里面有详细说明.
  3. 文件列表:(所有文件都是必须的)
    GRUB4DOS.MOD  GRUB4DOS 外命模块(使用GZ压缩过了)
    QGHO.BIN  MSDOS软盘最小化镜像
    QGHO.LST  QGHO启动菜单文件,使用GRUB4DOS调用.
    QGHO.SET  QGHO配置文件,可以修改默认设置.
    QGHO.ZIP  GHOST程序文件,可以替换里面BIN目录下的GHOST.EXE为其它版本.
                                  auto.bat 会在启动的时候自动执行.目前只是简单的备份恢复命令.
    QGHO.TXT  说明文件.
    
  4. 必须使用GRUB4DOS 2010-01-01之后的版本才可以使用.

  5. 转载或修改请保留出处.

主要是为了展示GRUB4DOS的功能,,QGHO更多的扩展功能等待你去挖掘……

[使用方法]

直接复制QGHO目录到某个硬盘的根目录下,在你的GRUB4DOS菜单中添加一个菜单

title QGHO
 find --set-root /QGHO/QGHO.BIN
 configfile /QGHO/QGHO.LST

一般情况下,你不需要修改任何东西即可直接使用.
默认自动备份第一硬盘第一分区数据到第一硬盘最后一个分区上.

你可以自己修改/QGHO/QGHO.SET来实现自定义的备份.
比如设定备份任意分区到任意目录.

没有磁盘限制,只要你定义的分区没有错就可以了.

[其它]

如果你对这个有兴趣的话,也可以编写一个GUI界面来修改QGHO.SET内容.
因为我对GUI不感冒,所以这些事我就不做了.

懂得使用就用,不懂的就不要瞎折腾了,对GRUB4DOS不了解的朋友请直接略过吧….

写给使用QGHO作为系统一键备份恢复的朋友:

如果你已经把GRUB4DOS作为系统的第一引导,只要做如下操作就可以做到一键自动备份/恢复.

并且可以通过在系统中修改QGHO.SET的设置来实现下一次引导时自动进行的操作.

只需要原来的MENU.LST在最前面加一句.

find --set-root --devices=h /QGHO/QGHO.SET && cat --length=2 /QGHO/QGHO.SET > (md)0x300+1 && checkrange 0x3A3A read 0x60000 || configfile /QGHO/QGHO.LST

具体QGHO.SET的设置方法请用记事本打开QGHO.SET查看.

下载地址:

QGHO 最新版下载

[更新内容]

2010-01-02

  1. 添加了选择指定GHO文件恢复到指定分区的功能,具体看后面的图片

2010-12-29 v0.5 元旦版

  1. 弃用之前复杂的菜单转用新版GRUB4DOS的批处理方式,比较直接.
  2. 恢复模式时会自动检测GHO文件的密码.
  3. 其它优化调整.

[截图]

启动界面

显示参数信息.

开始备份.

新功能,菜单3.

选择要恢复的目的分区。

选择要恢复的GHO文件。

[菜单文件]

注:这是老版的,新版已经改用批处理方式,想要查看批处理源码可以打开GRUB4DOS.MOD
查找”!BAT”就可以看到了.(可能需要对GRUB4DOS.MOD进行解压)

供想学习GRUB4DOS的朋友使用,大部份都有注释,有什么不明白的可以提出来.

如果你有发现了错误麻烦通知我,谢谢.

default=0
timeout=5
#设置可执行程序的路径(外部命令)
command --set-path=(fd0)/bin/
debug off

#菜单0
title auto ghost\n\n\t\tQuick Ghost Ver: 0.3\t\t2010-08-16\n\n\tmade by chenall QQ:366840202\t\thttp://chenall.net
write 0x60000 1000 && fallback --go 3
kernel

#菜单1
title ghost_Backup\n\n\t\tQuick Ghost Backup\n\n\tmade by chenall QQ:366840202\t\thttp://chenall.net
write 0x60000 1001 && fallback --go 3
kernel

#菜单2
title ghost_Restore\n\n\t\tQuick Ghost Restore\n\n\tmade by chenall QQ:366840202\t\thttp://chenall.net
write 0x60000 1002 && fallback --go 3
kernel

#菜单3 隐式菜单
title
#定位QGHO.BIN主程序位置
cat --length=0 /QGHO/QGHO.BIN || find --set-root /QGHO/QGHO.BIN
map --mem /QGHO/QGHO.BIN (fd0)
map --hook

#复制GHOST.ZIP文件到内存盘
fat copy /QGHO/GHOST.ZIP (fd0)/DOS.ZIP

#设置默认变量参数,fallback 4当后续语句执行出错时跳到菜单4.
fallback 4
wenv set mode=pdump
wenv set dst_path=/sys_c.gho
#从文件中读取配置参数,如果文件不存在或读取错误,返回0,根据上面的fallback 3就跳到菜单3去执行
WENV read /QGHO/QGHO.SET

#如果有设置变量dst_chk就执行检测操作.并把找到的分区设置为dst_id
#这里使用了wenv和disk外部命令
wenv get dst_chk && wenv run find --set-root --ignore-floppies --ignore-cd ${dst_chk} && diskid && wenv set dst_id=*0x4ff00
wenv get src_chk && wenv run find --set-root --ignore-floppies --ignore-cd ${src_chk} && diskid && wenv set src_id=*0x4ff00
fallback --go 4

#菜单4 隐式菜单
title
#设置默认参数,默认备份第一个硬盘激活的分区到第一硬盘最后分区.
#find --set-root makeactive --status,定位到第一个激活的分区.
wenv get src_id || find --set-root makeactive --status && diskid && wenv set src_id=*0x4ff00

#没有指定dst_id,使用最后一个分区(第一个激活分区所在硬盘)
wenv get dst_id || find --set-root makeactive --status && root endpart && diskid && wenv set dst_id=*0x4ff00

wenv set dst=${dst_id}${dst_path}
#根据内存位置0X60000的值来确定是还原状态或者备份状态。(当使用菜单启动时) 

#以下两句用于定位目标分区.
wenv run write (md)0x301+1 ${dst_id}\0

#diskid 命令gid=XX:YY 设定XX:YY对应的分区为当前root.XX:YY可以从内存中提取.这里取的是上一句写入的内存
diskid gid=*0x60200

#自动判断模式.
checkrange 1000 read 0x60000 && WENV run cat --length=0 ${dst_path} && WENV set mode=pload
checkrange 1001 read 0x60000 && wenv set mode=pdump
checkrange 1002 read 0x60000 && wenv set mode=pload

#写文件
wenv run write (fd0)/SETENV.BAT set mode=${mode}\r\n
#从指定位置开始写入0x10
wenv run write --offset=0x10 (fd0)/SETENV.BAT \r\nset src=${src_id}\r\n
wenv run write --offset=0x20 (fd0)/SETENV.BAT \r\nset dst=${dst}\r\n
#替换文件中路径的符号"/"为"\"
cat --skip=0x28 --locate=/ --replace=\\ (fd0)/SETENV.BAT
wenv run echo QGHO:${mode} ${src_id} <==> ${dst}
pause --wait=6 && chainloader (fd0)/io.sys
#直接启动DOS,也可以使用rootnoverify (fd0) 和 chainloader +1

[GRUB4DOS] GRUB4DOS 批处理脚本示范

发表于

GRUB4DOS是什么东西,我这里就不解释了.

本脚本可以简化GRUB4DOS菜单编写的难度.

适用在合盘或需要选择启动多种镜像的情况.

使用方法非常简单. 具体见里面的例子:

附上两个增强的版本:

zxw版: 自动列表.数字启动

sratlf版: 198#新版测试;简单菜单,实现grub加载任意ISO/IMG/RAMOS/引导文件等

!BAT
::GRUB4DOS 简易批处理脚本.
::用途: 在合盘时省去写大量菜单的麻烦.
::用法:
::     1.直接启动.
::        例子:
::            default 0
::            timeout 5
::            title 1.Windows NT/2k/XP/Vista Change Password / Registry Editor
::            RUN NT-PASS.ISO
::            boot
::             tile 2.MAXDOS Tools Box
::             RUN MAXDOS.IMG
::             boot
::  注意: 1. 扩展名为gz/img/ima 默认都当成软盘来启动.ISO作为一个光盘镜像来启动.
::        2. 本脚本默认镜像文件路径是(bd)/BOOT/IMGS/,可以自己修改成其它路径.
::     2.自动根据/BOOT/IMGS/目录下的文件生成菜单.(固定用法)
::           title auto make menu for /BOOT/IMGS/
::                 RUN .automenu
::                 configfile (md)0x3000+0x10
::  本脚本需要GRUB4DOS 2010-12-14 以上的版本.
::  需要的文件WENV:(使用动态菜单才需要)
::  下载地址: http://bbs.wuyou.com/viewthread.php?tid=182254
::  更多信息访问 http://chenall.net/post/grub4dos_run/
::==============================================================================
debug off
checkrange 20101214:-1 read 0x8278 || echo Err.version && exit 1
goto %~x1
exit

:.img
:.ima
:.gz
map --mem (bd)/BOOT/IMGS/%1 (fd0)
map --hook
rootnoverify (fd0)
chainloader +1
exit

:.iso
map --mem (bd)/BOOT/IMGS/%1 (0xff)
map --hook
chainloader (0xff)
exit

:.automenu
delmod -l wenv || insmod WENV
delmod -l %~nx0 || insmod %0
WENV dir (bd)/BOOT/IMGS/ > (md)0x3800+0x80
echo -e default 0\ntimeout 10\n > (md)0x3000+0x10
WENV for /f %i in ( (md)0x3800+0x80 ) do exec %~nx0 .makemenu %i
echo -e \ntitle Back to main menu(configfile (md)4+8)\nconfigfile (md)4+8 >> (md)0x3000+0x10
goto :eof

:.makemenu
WENV check "#.txt#"=="#%~x2#" && goto :eof
cat --length=0 (bd)/BOOT/IMGS/%~n2.TXT && cat (bd)/BOOT/IMGS/%~n2.TXT >> (md)0x3000+0x10 ! echo title %2 >> (md)0x3000+0x10
echo -e \n%~nx0 %2\nboot >> (md)0x3000+0x10

效果截图.

以下菜单为自动生成,

其中Windows NT/2k/Xp/V….菜单对应的文件是NT-PASS.ISO

同目录下NT-PASS.TXT的内容如下.

title Windows NT/2k/XP/Vista Change Password / Registry Editor\nhttp://pogostick.net/~pnh/ntpasswd/

[原创] 利用GRUB4DOS安装SRS(SCSI,RAID,SATA)驱动免按F6,免软驱.

发表于

这个在配合使用U盘安装系统碰到SCSI/RAID硬盘时特别有用,不需要在安装光盘上集成那个驱动了.

2014-01-03 PS: 目前已经有很多工具根据此原理实现了自动化操作,本文作为实现的原理,只提供参考

以下是一个实现方法的例子(具体如何使用可根据实际情况):

  1. 先制作一个需要的驱动软盘(IMG文件,可用GZIP压缩后一般1XXKB左右).
  2. 将以上文件放到U盘根目录下名为SCSI.IMG.
  3. 把GRUB4DOS引导写入U盘.(只要使用U盘启动时可以用GRUB即可)
  4. GRUB4DOS的启动命令

    相关文章:

    http://bbs.wuyou.com/viewthread.php?tid=121630&extra=page%3D1
    http://bbs.wuyou.com/viewthread.php?tid=121630&page=5#pid1349207
    http://bbs.znpc.net/viewthread.php?tid=4562

    GRUB4DOS菜单内容

    title 从光盘安装系统并自动加载S&amp;R&amp;S软盘驱动.
    find --set-root /SCSI.IMG
    map --mem (md)+2880 (fd0)
    map --mem /SCSI.IMG (fd1)
    cdrom --init
    map --hook
    dd if=(fd1)+1 of=(fd0)+1
    chainloader (cd0) </div>
    

    注:以下两句是为了生成一个空白的(fd0),即A:

    map --mem (md)+2880 (fd0)
    dd if=(fd1)+1 of=(fd0)+1
    

    可以使用其它软盘镜像代替,但是不可以用你要安装的SRS镜像,否则安装时会提示插入软盘. 这个(fd0),如果使用firadisk驱动代替,那就可以直接用ISO镜像来安装系统.

  5. 现在就可以试下了,在光驱中放入XP/2003的安装盘.插上U盘,选择从U盘启动.

    这时就会自动加载U盘上的驱动,然后再开始安装系统,安装过程不需要按F6等,可以自动识别驱动.

    以上在安装系统时的实现方法.
    注:由于GRUB4DOS对光驱的支持不是很好,以上方法并不适用所有电脑,为了解决这个问题可以制作一张使用GRUB4DOS作为引导的光盘,
    启动后直接加载驱动并换掉光盘再进行安装就可以了.
    菜单例子

    title 加载F6软盘镜像
    find --set-root /SCSI.IMG
    map --mem (md)+2880 (fd0)
    map --mem /scsi.img (fd1)
    map --hook
    dd if=(fd1)+1 of=(fd0)+1
    pause 请更换光盘后按任意键继续.
    chainloader (cd)
    

再说下基于PE 1.X的实现方法和上面差不多,但目前的PE大多没有此功能.

添加此功能需要在DRIVERS目录下添加一个VOLSNAP.SY_,然后修改TXTSETUP.SIF文件即可.TXTSETUP.SIF的修改方法

 [HardwareIdsDatabase]
 STORAGE\Volume = "volsnap",{71A27CDD-812A-11D0-BEC7-08002BE2092F}

 [BusExtenders.Load]
 volsnap= volsnap.sys

 [BusExtenders]
 volsnap= "Volume Shadow Copy Manager",files.none,volsnap`

添加了以后就可以在启动PE之前将对应的驱动加载到fd1上然后再启动PE就可以自动识别了.

从此不再需要集成驱动的系统安装盘/PE了….

后记:此方法用于PE启动时使用(fd0)就可以加载了,用于系统安装时,一般使用(fd1)以实现免按F6安装.

其中TXTSETUP.OEM里面的[default]字段下SCSI的值必须是你本机对应的驱动,否则不会自动加载.

还有一种方式,使用GHOST像绿茶网吧版的.虽然也是GHOST方式,但是属于全新安装的.安装的时候如果出现7B蓝屏说明没有对应驱动,这时也可以使用这个方法来加载驱动后再重新启动安装就不会蓝屏了.(需要加载到(fd0)并按F6选择正确的驱动,最好同时加载到(fd1))

从此不再需要集成驱动的系统安装盘/PE了….

2010-11-22 更新一些说明.

2009-07-09 注:如果使用(fd0)不成功的朋友,可以尝试再加载一个非OEM F6镜像的IMG到(fd0),也就是(fd0)不要有TXTSETUP.OEM文件,一般就可以了.

[GRUB4DOS] 外部命令WENV [2010-10-17]

发表于

[功能说明]

GRUB4DOS菜单脚本命令增强.
在GRUB4DOS还没有支持变量之前可以暂时代替着使用变量的功能.
可以让GRUB4DOS内部命令支持变量或动态参数(WENV run)功能
目前已经增加了许多的强大功能.具体见后面的介绍.
推荐使用高级GRUB4DOS应用菜单必备,可以简化许多命令.

注: 由于新版的GRUB4DOS的功能已经得到了增强,基本上WENV的功能GRUB4DOS都可以实现了,所以本程序已经不再维护更新,建议使用GRUB4DOS内置功能代替

[下载地址]

http://grubutils.googlecode.com

WENV 是一个基于GRUB4DOS的程序,可以用它来增强GRUB4DOS的脚本能力,来现一些不可思议的功能。
WENV 最初只支持简单变量和运行GRUB4DOS命令。到了现在已经支持各式各样的处理。 可以把让它当成是GRUB4DOS的增强形SHELL,方便各位grub4dos fans编写高效强大的菜单。 在这里要感谢无论启动论坛上众多朋友的支持,如果没有你们,WENV还只是一个小玩具。
http://bbs.wuyou.com/viewthread.php?tid=159851 取之于网络,共享于网络。 本说明文件来源于无忧论坛zhaohj提供的README.TXT,我经过修改整理而成。
http://bbs.wuyou.com/viewthread.php?tid=159851&page=46#pid2056205 如有发现错误,请通知我,谢谢。 WENV目前支持的命令列表(wenv-commands):

  • SET 设置/修改/新增/删除变量
  • GET 显示变量/判断变是是否存在
  • FOR 类似于CMD的FOR命令,具体见后面介绍
  • CALL 执行一个GRUB4DOS内部命令
  • CALC 简易计算器(没有优先级从左往右计算,不支持括号)
  • ECHO 在屏幕上显示信息
  • READ 分析一个文件并执行里面的命令(必须是WENV支持的命令),并且支持参数。
  • CHECK 判断/检测相当于if命令,后面可以跟WENV-COMMAND(当判断的返回值为真时执行)

其它介绍,还有使用示例见文章尾。

两个内置变量:
?_WENV 保存上一次wenv call运行的返回值
?_GET 保存上一次wenv get variable变量的长度


一:SET 设置/修改/新增/删除变量

  1. WENV SET [variable=[string]]
    variable 指定环境变量名,区分大小写 (目前最多允许用户定义60个变量)
    不超过8个字符.可以使用字母(a-z/A-Z)、数字(0-9)、下划线(_)。不可以使用数字开头。
    string 指定要指派给变量的一系列字符串。不能超过512字节。

    无等号时显示指定名称的所有变量的值。 SET P

    会显示所有以字母 P 打头的变量

  2. 等号后面可以跟”$U,”或”$L,”
    $U,全转变为大写;
    $L,全转变为小写;

    例子: WENV SET a=$U,aBcDeF 得到 a=ABCDEF

  3. 关键字 $input,来获取从键盘输入的字符。
    例子:获取从键盘输入的字符串,并转换为大写赋值给srspath
    WENV set srspath=$u,$input,please input SRS driver path:

  4. 一些组合例子: WENV SET variable=$U,string
    WENV SET variable=$U,$input,Prompt

二、 GET 显示变量/判断变是是否存在 GET 命令可以显示指定的变量,并设置?_GET为该变量的字符串长度。

WENV get xxx  返回变量xxx的值的字符串长度.

注: 如果变量不存在会返回一个失败的值0,可以用于判断变量是否存在
如: 当变量abc不存在时显示字符串"VARIABLE abc not defined"
wenv get abc || echo VARIABLE abc not defined

三、FOR 类拟于CMD的for

比较强大的一个命令,可以分析字符串,文本文件。
语法:
FOR /L %variable IN (start,step,end) DO wenv-command
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)

FOR /F ["options"] %variable IN ( file ) DO wenv-command
FOR /F ["options"] %variable IN ("string") DO wenv-command
如果有 usebackq 选项:
FOR /F ["options"] %variable IN (`string`) DO wenv-command
options
eol=c - 指一个行注释字符的结尾(就一个)
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。
usebackq - 反向引号

几个例子 分析myfile.txt的每一行,使用";"作为注释符,使用","分隔字符串,显示每行的第二和第三个字符串
FOR /F "eol=; tokens=2,3 delims=," %i in ( myfile.txt ) do echo %i %j

显示从1-10的数字
FOR /L %i in (1,1,10) do echo %i

以下语句会显示 1 2 3 6
FOR /f "tokens=1-3,6" %i in ("1 2 3 4 5 6 7 8 9 0") do echo %i %j %k %l

可以参考CMD的for命令帮助说明.

四、CALL 命令

WENV call grub4dos-builtincmd  CALL 命令用于执行GRUB4DOS内部命令,使得可以动态执行一些GRUB4DOS的命令.

可以使用变量或$*ADDR代替命令的任意部份。
例子:

wenv set a=(hd0)
wenv call map ${a} (hd1)
扩展了变量${a} 相当于执行map (hd0) (hd1)
wenv call write (fd0)/aa.txt *0x60000$  这个会扩展*0x60000$,把从内存地址0X60000处的字符复制到命令行

如果内存地址0x60000处有字符串abcdef

那扩展后就是write (fd0)/aa.txt abcdef  甚至还可以直接 wenv call ${mycmd}
会扩展变量mycmd,如果它是一个GRUB4DOS内部命令,则会得到执行,否则返回失败值。
call 可以连续运行多条内部命令,命令与命令之间使用以下字符隔开
]]] 无条件执行
]]& 当前一条命令返回真时执行后面的语句.否则直接返回
]]| 当前一条命令返回假时执行后面的语句.否则直接返回. 

五、calc 命令 用于grub4dos的简单计算,从左到右计算,不支持优先级

WENV calc [[VAR | [*]INTEGER]=] [*]INTEGER OPERATOR [[*] INTEGER]

calc 命令可以直接操作内存中的数据,请使用*ADDR的形式。  =前面如果是一个非数字字符串,则会把计算结果赋值给变量;
OPERATOR:包含+、-、*、/、&(与)、|(或)、^(位异或)、>>、<<
*INTEGER表示内存地址的值;
如:
WENV calc a=*60000+1 表示把内存地址0x60000的值再加1赋值给变量a
WENV calc a=1<<10 左移10位,即2的10次方,等于1024
WENV calc a=b++ a=b,b=b+1
WENV calc a=++b b=b+1,a=b
WENV calc a=b-- a=b,b=b-1
WENV calc a=--b b=b-1,a=b  WENV calc a++ 变量a的值加1;

注:calc可以对变量进行计算,但一般情况下请使用如下的例子获得更快的运算速度。
wenv calc a=${b}+${c}
以上的例子不会对变量b和c进行修改。

wenv calc a=${b}+c++
这个例子会修改变量c的值 

六、echo 命令

WENV ECHO strings

用于显示一个字符串,支持`\x`转义符。比如`\n`是一个回车。

七、READ 命令

WENV READ wenv-bat-file parameters

用于执行一个WENV的批处理文件,该批处理文件里面必须是 wenv-commands。
忽略以冒号":"开头的行。

在批处理中可以使用参数$0-$9
其中: $0 代表批处理文件自身。$1-$9 分别代表第一个参数到第九个参数。

参数之间使用空格分隔。

一个例子:
wenv.bat文件内容如下
echo $0
echo $1
echo $2
使用命令WENV READ /wenv.bat abcd 12345
将会在屏幕上显示如下内容
/wenv.bat
abcd
12345 

八:CHECK 判断命令相当于IF命令

1.WENV check string1 compare-op string2 wenv-command

比较符号可以使用其中一个: ==、<>、>=、<=

where compare-op may be one of:
== – equal
<> – not equal
<= – less than or equal
>= – greater than or equal  注: 注意比较时,后面的字符串忽略小写对比.
如:
abc==ABC 值为真
aBc==abc 值为假
abc==aBc 值为真.
只要前面部分某个字符是大写,后面部分对应的一定要大写才能匹配 其它说明:  
1. 要使用命令序列,可以把要执行的命令放在()之内,使用" ; "分隔每个命令。
  格式: (wenv-command1 ; wenv-command2 ; wenv-command3)
  应用的例子:
      wenv (set a=1 ; set b=2 ; set c=3)
  wenv for /l %i in (1,1,5) do (set a=%i ; echo %i)
2. 从内存中复制字符串 *ADDR$
  说明:程序执行时会从内存地址ADDR处复制一个字符串替换命令行的*ADDR$
  例子:显示内存地址0x60000处的字符串信息
  wenv echo *0x60000$
  执行时先复制内存0x60000处的字符串到命令行替换后再执行。 

通用字符串处理(以下方法可以应用于任何地方)

1: ${VAR:X:Y}

提取第X个字符后面的Y个字符,如果X为负数则从倒数第X个开始提取Y长度的字符;
如果Y的值为空则提取第X个字符后面的所有有字符;
如果Y的值为负数,则去掉倒数Y个字符;
  WENV set a=ABCDabcd1234
  WENV set b=${a:4:4} 得到b=abcd
  WENV set b=${a:-8:4} 得到b=abcd
  WENV set b=${a:4:-4} 得到b=abcd
  WENV set b=${a:-8:-4} 得到b=abcd

2: ${VAR#STRING}删除STRING前面的字符.

  WENV set a=ABCD;abcd;1234
  WENV set b=${a#;} 得到b=abcd;1234

3: ${VAR##STRING}删除STRING前面的字符,贪婪模式

  WENV set a=ABCD;abcd;1234
  WENV set b=${a##;} 得到b=1234

4: ${VAR%STRING}删除STRING后面的字符.

  WENV set a=ABCD;abcd;1234
  WENV set b=${a%;} 得到b=ABCD;abcd

5: ${VAR%%STRING}删除STRING后面的字符,贪婪模式

  WENV set a=ABCD;abcd;1234
  WENV set b=${a%%;} 得到b=ABCD

一些应用举例:
1) 根据提示从键盘输入,全转为大写后保存给srspath变量

WENV set srspath=$u,$input,please input SRS driver path:

2) 设置变量a,并把值全转为大写

WENV set a=ABCDabcd1234
WENV set a=$u,${a}
得到a=ABCDABCD1234

3) 清除某个变量

WENV set a= =后为空,清除变量a

4)清除某些字符开头的所有变量

WENV reset a* 清除a开头的所有变量
WENV reset sr* 清除sr开头的所有变量

5)清除所有变量

WENV reset

6)显示所有变量信息(不包括内置变量)

WENV set

7)显示所有以prefix开头的变量

WENV set prefix wenv call 的例子:

如:

    WENV set imgpath=/SRS_f6/srs_f6.IMG
    WENV set imgpath=$u,${imgpath}
    WENV call map --mem ${imgpath} (fd0)
    map --hook  可以动态执行命令,如:
    write (md)0x300+1 map --status\0
    WENV call *0x60000$

    wenv check 的例子:
    如:WENV set a=abc
    WENV check ${a}==abc && echo ${a}=abc
    WENV calc a=123
    WENV check ${a}==123 && echo ${a}=123
    WENV check ${a}<=150 check ${a}>=100 && echo ${a}>=100.and.${a}<=150

上面实现了IF语句功能. 一些图片。






C语言的基础函数大小写转换

发表于

在程序中经常会需要对字母的大小写进行转换,虽然有现成的upper/lower函数,但是有时因为各种原因,或想减小程序的体积,需要自己编写函数来实现。

这里来讨论一下各种转换的方法。

根据ASCII码我们可以知道大写字母和小写字母相差32(20H)=100000B(二进制).

根据这个原理我们可以方便的进行大小写的转换。如是是大写字母+32就变成小写。

例子: 大写字母’A’ 它的ASCII码是65. ‘a’的ASCII码是97,看下面的等式。

‘A’+32=65+32=97 = ‘a’

另外:

  • ‘a’的二进制是01100001B
  • ‘A’的二进制是01000001B

也就是说小写和大写的区别就是100000B ,也就是bit 5的区别。

所以还可以通过与运算修改bit 5的值也可以达到转换的目的。

把第5位置为1可以按位”或”操作,置为0 可以按位”与”操作
00100000B = 32 = 20H
11011111B = 223 = DFH

‘a’ & 223 = ‘A’ ‘A’ | 32 = ‘a’

其实也就是字母的第5位(二进制位),如果它是1就是小写的,如果是0就是大写。

另外在使用经典的代码比较时

小写转大写 >=’a’ 并且 <=’z’
大写转小写 >=’A’ 并且 <=’Z’
可以把这两个比较的顺序对换一下。
改成<=’Z’ 并且 >=’A’ ,看起来没有什么区别,但是实际运行中效率会更高。

原理: 因为比较时,只要第一个条件不符合,那就不会去比较第二个条件了,利用这一点可以加快比较速度。
小写字母都是大于’Z’的,当然也大于’A’。
比如转换aBCD为小写,a已经是小写了,如果按原来的方法比较>=’A’ && <=’Z’ 需要比较两次。
用后面的方法只需要比较一次。

下面是实现的代码.有两种方式。(转大写的)

 void upper(char string)
{
  while(string)
  {
    #if 0
    //第一种方式比较经典的方法
      if (string >='a' && string <='z')
        string &= 0xDF;
    #else
    /*
    好像网上还没有见过这种用法,算是一个意外发现吧.
    减去'a',如果它的值在0-25之前则它肯定是小写字母。因为是无符号数.
    如果这个字符小于a那会得到负数(>128)
    */
      if ((unsigned char)(string - 'a') < 26)
          string -= 32;
    //大写转小写只要把'a'改为'A',转换的方式为`+= 32`或` |= 32`
    #endif
      ++string;
  }
  return;
}

两种不同的方式的汇编代码比较,用经典的方法执行效率可能会高一点儿。
用新的方法生成的文件小一点(少几个字节,在程序空间比较紧张的情况下可以用).

[GRUB4DOS] GRUB4DOS 的第一个游戏程序

发表于

经典的游戏贪吃蛇,GRUB4DOS版.比较简单的一个游戏.

嘻嘻,界面不是很好看,没有使用图形模式,只是一个试验品.抛砖引玉.^_^

关于这个游戏的相关信息请看搏客贴子:
http://chenall.net/post/snake_idea/

只是在学习过程中偶然想到的就尝试着去实现了它.

重温经典,有兴趣可以下载玩玩看.

下载:

需要最新版本(如果有更新)还有源码(GRUB4DOS版)在这里找.
http://code.google.com/p/grubutils/source/checkout

一些说明:

  • GRUB4DOS下只能在文本模式下运行.(TEXT MODE only).
  • 使用四个方向键控制.
  • 按ESC键退出游戏.
  • 按P键暂停游戏.
  • 按S键开始游戏.

    附在GRUB4DOS下运行的截图.

[原创] 也来谈谈经典游戏贪吃蛇的简易设计思路

发表于

注:原创方案,如有雷同纯属巧合.

本人对图形系统并不感冒.不喜欢也不会设计图形.所以本文介绍的也只会有简单的界面.

突然有了一些灵感,所以就把它记录下来,并尝试用代码来实现它.

当然了它不是拿来玩的而是用于学习,呵呵.

程序不使用图形系统,所以界面当然是比较粗糙了(看后面的截图).

目前使用的是WIN-TC,有空再试试把它弄成GRUB4DOS的外部命令,嘻嘻,让GRUB4DOS也有游戏程序.

  1. 使用环形链表设计蛇的身体.
     struct snakes
      {
           int pos; //节点在屏幕上的位置
           struct snakes *up; //上一个节点指针.(第一个链表指向最后一个,形成循环)
      };
     struct snakes *snake_head;//指向当前蛇头的链表.snake_head->up 就是蛇尾.
    
  2. 蛇的移动处理.
    由于使用了环形的链表,像车轮一样走,只要把最后一个链表作为蛇头就可以了.
    实际操作过程.

    1. 首先确位移动的位置
    2. 在屏幕上清除当前蛇尾的显示.
    3. 修改蛇尾的POS为新的位置,并显示.
    4. 把蛇尾作为新的蛇头.snake_head = snake_head->up;

    这里还有一个需要注意处理的:
    根据按键处理移动时不可以反方向移动.也就是说不可以直接后退.

  3. 碰壁或者蛇头碰到蛇身就算失败.
    处理方法:
    墙壁可以随便使用表格线划出来,蛇可移动的区域全部放空白.

    只要判断前面不是食物也不是空白,就算Game Over了.

    部份代码:
    以下是使用直接写屏的方法处理vga指向显存的指针(short类型).

     while(delay())
    
     {
         //处理按键和移动方向的代码.
    
         if (vga[pos] == FOOD)
         {
             //如果是食物就在蛇头上添加一个节点.并继续.
             continue;
         }
         else if ((char)(vga[pos] & 0xff) != 0x20)
         {//如果该地方不是空白的就结束游戏.
             break;
         }
         snake_head = snake_head->up;//使当前的蛇尾作为蛇头进入下一个顺环
         vga[snake_head->pos] = 0x720;//清除蛇尾的显示(显示一个黑色空格);
         snake_head->pos = pos;//新的屏幕位置
         vga[snake_head->pos] = SNAKE;//画新的蛇头;
    
     }
    
  4. 食物放置,这个就没有什么可说的了,使用一个随机数放置FOOD.并且不能放在蛇的身上.

  5. 其它细节,像分数系统.都是差不多的比较简单这里就不介绍了.

新的截图:(HOH,有兴趣可以下载玩玩看,看看你能挺多久.)

WIN下可玩,用DOS效果会比较好(可以试试DOSBOX)

[GRUB4DOS] 测试功能增强版ECHO

发表于

搞了一个增强版的ECHO命令,看看效用还有反应如何.可以在屏幕任意位置显示字符并且可以指定颜色.

颜色设置只支持console模式(文本模式).

使用方法(具体请下载附件研究)

注: 最新版本的GRUB4DOS已经内置此功能,并且功能得到了增强,想要编写GRUB4DOS扩展的可以下载源码研究一下

本站所有GRUB4DOS扩展的源码都可以从这里下载: https://code.google.com/p/grubutils/

echo [-n] [-P:XXYY] MESSAGE
其中MESSAGE中可以使用$[ABCD]来指定后面显示的字符使用的颜色.
A 值为1时闪烁 (blinking foreground color).
B 值为1时高亮(light)
C [0-7]背景色(background color)
D [0-7]前景色-字体颜色(foreground color)

截图效果.(随便弄的,对外观不是很感冒)_:)

注:图片就是附件执行的效果,未修改添加.
嘻嘻,对于某些喜欢修改XXXX的爱好者来说可能会有用,因为你可以自定义整个屏幕上显示的信息.

[原创] 无聊贴一段代码

发表于

快速计算某个POS软件的员工密码…

使用批处理计算快速简单.

^_^ 至少有N+X个密码可以用哦.

不想解释.

谁用谁知道 .

嘿黑,别做坏事哦.

==================================================

保存为BAT或CMD文件,运行按提示输入就可以了…(注:如果复制下来是全角的引导需要替换成半角的)

@echo off
set /p se=se:
set /p yx=yx#:
set /a "se &= 0xffff"
set yy=0
echo.
:loop
set /a xx=(se+3203+2*yx+yy*0x10000 )*2/3
set /a "zz=(xx*3/2-3203-2*yx)&0xffff"
if "%zz%"=="%se%" set/p=%xx%,<nul
set /a yy += 1
if %yy% LEQ 20 goto :loop

:ok
echo.
echo.You can use any of the above password,,(⊙o⊙)
echo.
pause

运行的结果演示:

[GRUB4DOS] chkpci for grub4dos

发表于

[用途]

  1. 在GRUB4DOS下直接检测PCI设备信息.

  2. 待定…….

[用法]

直接在GRUB4DOS下运行,可以加一个PCI信息库文件参数.PCI信息库文件

另: 因为GRUB4DOS是支持自动解压的.所以这个信息库文件可以使用GZIP压缩再调用(加快读取速度).

注意: 目前库文件限制在1MB以内(一般来说也够用了)

其它说明: 使用库文件时,会把库文件读取到内存6M-8M之间,使用时请注意不要冲突

[下载]

CHKPCI(带源码)

http://code.google.com/p/grubutils/downloads/list

更新信息(changelog):

  1. 尝试添加新的PCI信息显示格式(类似CHKPCI).

    文件内容格式:

     第一行固定`PCI$`
     固定输出内容(可选)
     $PCI设备信息1 匹配后显示内容1
     $PCI设备信息2  匹配后显示内容1
     匹配后要显示的内容1
     $pci设备信息3
     匹配后要显示的内容3
    

    一个例子:

     ===========CHKPCI.PCI=============
     PCI$
     $PCI\VEN_8086&DEV_7113
     Intel
     test
     $PCI\VEN_8086&DEV_7000&CC_020000&REV_00
     fat copy /IASTOR.SYS (fd0)/
     fat copy /iastor.inf (fd0)/
     fat copy /txtsetup.oem (fd0)/
     ===========CHKPCI.PCI=============
    

2010-08-28

  1. 添加帮助信息 -h 参数.

  2. 添加参数 -cc:CC,用于显示指定设备.

2010-08-27

修正在实机使用时会造成卡机的问题.

2010-08-26

添加读取PCIDEVS.TXT按格式显示设备信息的功能.

2010-08-25

第一版,只能显示PCI信息.

【相关资料】

一些资料请看这里.

http://chenall.net/post/scanpci/

Class Codes

ClassDescription
0x00Devices built before class codes
0x01Mass storage controller
0x02Network controller
0x03Display controller
0x04Multimedia device
0x05Memory Controller
0x06Bridge Device
0x07Simple communications controllers
0x08Base system peripherals
0x09Inupt devices
0x0ADocking Stations
0x0BProcessorts
0x0CSerial bus controllers
0x0D-0xFEReserved
0xFFMisc

更多资料请点这里查看

https://docs.google.com/document/pub?id=1peDTGBLgsGa-qaX0JSeZUuI2Pu9Sl0FkCCk27cNi-wk

[截图]

首先是帮助信息

不加参数,只列出PCI设备信息.

指定PCI信息库文件,按这个库文件显示详细的信息(呵呵,也不是很详细).

只显示指定类型设备.

新的PCI格式截图