无忧启动论坛

标题: 在 windows 下安装 grub4dos 引导代码 [打印本页]

作者: 2011yaya2007777    时间: 2022-4-4 15:50
标题: 在 windows 下安装 grub4dos 引导代码
本帖最后由 2011yaya2007777 于 2022-4-26 11:37 编辑

看了 szwpWIN 下安装 UMBR”的帖子及作品,看了 星语风 的作品,都很好。
grub4dos 内部自带一个安装工具 bootlace.com,感觉有些不太方便。
现在凑热闹,发一个利用 winhex 安装的脚本。抛砖引玉,请懂批处理的大师看看,可否再干练一些。

2022_04_26
1. 前言
通常使用BOOTICE安装GRUB4DOS的引导代码。
由于作者Pauly遗失源码,无法更新嵌入程序内部的引导代码,所以不能同步更新GRUB4DOS。
写这个脚本,一是弥补上述遗憾,二是对WinHex脚本的学习与练手。

2. 脚本功能
在windows下安装GRUB4DOS的引导代码到磁盘或镜像文件。
磁盘或镜像文件的分区类型可以是MBR及GPT。
镜像文件的格式可以是img(ima)及静态vhd。
引导代码的类型可以是grldr.mbr,mbr及pbr(支持的文件系统类型是:FAT12/16/32,EXFAT,NTFS,EXT2/3/4)。
可以备份mbr及pbr。
可以使用备份的文件恢复mbr及pbr。

3. 使用方法
把压缩文件解压到C盘根目录,双击"主程序.cmd"。

4. 温馨提示
复制一个单文件版本的WinHex到本程序目录下,重命名为WinHex64.exe,可以提高运行速度。(注意选择适当版本,有的版本闪退。)
如果本程序目录下没有WinHex64.exe,则会提示输入WinHex64.exe的位置(如 d:\path\),也可以直接回车跳过。
如果跳过,则主程序会搜索电脑上存在的WinHex64.exe,可能需要很长时间,请耐心等待。

数据无价,请及时备份。
若有闪失,本人不予负责。



Install_g4d.rar

16.5 KB, 下载次数: 112, 下载积分: 无忧币 -2


作者: nttwqz    时间: 2022-4-4 16:18
楼主都是大神了,难道还需要我等假大师?直接用C写一个命令行版本?
作者: szwp    时间: 2022-4-4 16:20
俺当时是因为群友有需要才做的,测试的不够多。谢谢提供。
作者: 邪恶海盗    时间: 2022-4-4 16:21
nttwqz 发表于 2022-4-4 16:18
楼主都是大神了,难道还需要我等假大师?直接用C写一个命令行版本?

肯定在装傻,忽悠我们小白...
作者: szwp    时间: 2022-4-4 16:42
当时为了体积小,用过diskrw,结果有反映装错盘了
作者: liuyanjun    时间: 2022-4-4 16:48
感谢大师分享
作者: liuzhaoyzz    时间: 2022-4-4 18:10
感觉winhex有点大,以后如果有人兴趣用c或者c++写一个就好了。

diskrw是个有一定风险的命令,边界条件很重要,搞错了有风险。


作者: wintoflash    时间: 2022-4-4 18:24
本帖最后由 wintoflash 于 2022-4-4 18:27 编辑

凑个热闹
前段时间写的 diskfire 小程序,支持安装 GRUB4DOS MBR/PBR,支持安装到 MBR/GPT 分区表。
由于主要功能都是移植自 GRUB2 的,所以采用 GRUB2 格式的磁盘名。
比如
  1. diskfire.exe mbr -i=GRUB4DOS (hd1)
  2. diskfire.exe pbr -i=GRUB4DOS (hd1,1)
复制代码

具体哪个磁盘对应什么磁盘名,可以使用 ls 来查看
  1. diskfire.exe ls
复制代码

还有其他功能,可以用 diskfire.exe help 进行查看。
此程序仅供测试,可能有很多 bug,如果出现数据丢失,本人不对此负责。
下载: https://github.com/a1ive/diskfire/releases


作者: 481416322    时间: 2022-4-4 18:32
谢谢大神!
作者: 527104427    时间: 2022-4-4 18:32
winhex还能编脚本,太帅了!!
作者: liuzhaoyzz    时间: 2022-4-4 20:42
wintoflash 发表于 2022-4-4 18:24
凑个热闹
前段时间写的 diskfire 小程序,支持安装 GRUB4DOS MBR/PBR,支持安装到 MBR/GPT 分区表。
由于 ...

diskfire.exe mbr -i=GRUB4DOS (hd1)
这个(hd1)能否用盘符代替之啊?比如说:
diskfire.exe mbr -i=GRUB4DOS C:,这样子的命令,可以把C:盘所在的硬盘的MBR修改为g4d,用批处理还要判断很多。

grubinst直接直接盘符调用安装grldr.MBR。
作者: wintoflash    时间: 2022-4-4 21:09
liuzhaoyzz 发表于 2022-4-4 20:42
diskfire.exe mbr -i=GRUB4DOS (hd1)
这个(hd1)能否用盘符代替之啊?比如说:
diskfire.exe mbr -i=GRU ...

不支持。需要用 probe 从分区名反查卷标:diskfire.exe probe --letter

hd0 对应的是 \.\PhysicalDrive0, hd1 对应的是 \.\PhysicalDrive1, 以此类推。
但是分区就没有这种对应关系了:
1. 这个程序是基于 GRUB2 代码的,不好改。
2. 分区不一定会有卷标。
作者: szwp    时间: 2022-4-4 21:26
bootsect是用盘符的.diskrw写错盘可能就是有时和diskpart获取的磁盘号不一致
作者: lhpxs    时间: 2022-4-5 06:09
这么多编程高手在这,我也来点赞
作者: liuzhaoyzz    时间: 2022-4-5 09:18
wintoflash 发表于 2022-4-4 21:09
不支持。需要用 probe 从分区名反查卷标:diskfire.exe probe --letter

hd0 对应的是 \.\PhysicalDriv ...

就按照你上面的截图来说,已知一个盘符C:,就可以判定他位于(hd0)上面;
已知一个盘符D:或E:,就可以判定他位于(hd1)上面。
对于没有盘符的分区,不做要求。

就是说可以通过盘符求(hdx)。
这是单向映射,不是反过来已知(hdx)求盘符呀。
作者: wintoflash    时间: 2022-4-5 10:11
liuzhaoyzz 发表于 2022-4-5 09:18
就按照你上面的截图来说,已知一个盘符C:,就可以判定他位于(hd0)上面;
已知一个盘符D:或E:,就可以判 ...

本身盘符和GRUB2分区的对应关系就是"猜"出来的。我不知道怎么用 windows api 来通过盘符获取它所在的磁盘。
按你这样说的,不好弄。
作者: szwp    时间: 2022-4-5 10:25
deviceiocontrol取出来是否一致难说
作者: szwp    时间: 2022-4-5 10:28
都是一家的gdisk和ghost也遇到过不一致
作者: liuzhaoyzz    时间: 2022-4-5 11:21
wintoflash 发表于 2022-4-5 10:11
本身盘符和GRUB2分区的对应关系就是"猜"出来的。我不知道怎么用 windows api 来通过盘符获取它所在的磁盘 ...

那就靠“猜”吧,即使“猜”错了,也没事吧,因为后续写MBR引导扇区啥的,会进行判断吧,会设置安全边界,不会造成分区的数据损毁吧,顶多也就是写错了盘符,可能导致原本是windows.mbr的,变成了grldr.mbr,只要保证数据安全,写错盘符不是什么大问题。

高大上的c/c++还要搭配批处理通过分区判断(hdx),感觉low了点。

靠盘符定位硬盘(hdx)感觉简单多了,因为windows本来就是通过盘符来定位分区的。可以参考下grubinst或者bootice的效果,当然是在你有兴趣的前提下咯。

网上再找找看有没有什么API能够搞定这个的。不着急,慢慢来吧。

作者: wintoflash    时间: 2022-4-5 11:27
liuzhaoyzz 发表于 2022-4-5 11:21
那就靠“猜”吧,即使“猜”错了,也没事吧,因为后续写MBR引导扇区啥的,会进行判断吧,会设置安全边界 ...

我说了,不合适。

作者: szwp    时间: 2022-4-5 11:45
diskrw只收到一例猜错,不方便复现排除除,不确定是否使用者操作不当,主要还是使用人少,没动力深究
作者: szwp    时间: 2022-4-5 11:48
狠多时候,你还在努力,但提问者已放弃
作者: 2011yaya2007777    时间: 2022-4-5 12:32
@szwp  你说的这个有同感,没有回音了。
作者: 2011yaya2007777    时间: 2022-4-5 12:40
感觉winhex有点大

在批处理区搜索到一个帖子,可以使用脚本查找winhex.exe,然后使用它。这样文件体积小了不少。但是搜索需等待数秒。最好还是在当前目录复制一个单文件winhex.exe比较好。
作者: xianglang    时间: 2022-4-5 12:52
本帖最后由 xianglang 于 2022-4-6 14:38 编辑

现在都不大喜欢用命令行了,只喜欢用图形界面的。

另外,在“此处打开命令行提示符”这个右键功能,以前是可以直接到指定目录下的,现在全到Windows目录下了,不知道是怎么回事,要输入一次盘符转才到。


作者: szwp    时间: 2022-4-5 15:59
xianglang 发表于 2022-4-5 12:52
现在都不大喜欢用命令行了,只喜欢用图形界面的。

另外,在“此处打开命令行提示符”这个右键功能,以前 ...

𦀣 长啥样的?
作者: szwp    时间: 2022-4-6 10:45
liuzhaoyzz 发表于 2022-4-5 11:21
那就靠“猜”吧,即使“猜”错了,也没事吧,因为后续写MBR引导扇区啥的,会进行判断吧,会设置安全边界 ...

api可以用上面说的DeviceIoControl试。下面的代码可以去pecmd里测下。

CALL $--qd --ret:&R Kernel32.dll,CreateFileW,$\\.\C:,#0,#3,#0,#3,#0,#0
ENVI$ &C=*12 0
CALL $--qd Kernel32.dll,DeviceIoControl,#%&R%,#2953344,#0,#0,*&C,#12,#0,#0
GETF &C,4#1,&P
MESS %&P%
作者: wintoflash    时间: 2022-4-6 11:25
szwp 发表于 2022-4-6 10:45
api可以用上面说的DeviceIoControl试。下面的代码可以去pecmd里测下。

CALL $--qd --ret:&R Kernel32. ...

看不懂pecmd代码。有c/c++的吗?
作者: szwp    时间: 2022-4-6 11:30
wintoflash 发表于 2022-4-6 11:25
看不懂pecmd代码。有c/c++的吗?

https://blog.csdn.net/li740207611/article/details/52122776

看看这个,俺也不知道这是啥代码。没玩过C。
作者: 527104427    时间: 2022-4-6 12:45
szwp 发表于 2022-4-6 10:45
api可以用上面说的DeviceIoControl试。下面的代码可以去pecmd里测下。

CALL $--qd --ret:&R Kernel32. ...


强!不过有个小问题,运行崩溃了,能修正一下吗?



作者: szwp    时间: 2022-4-6 13:02
527104427 发表于 2022-4-6 12:45
强!不过有个小问题,运行崩溃了,能修正一下吗?

俺不太会玩PECMD,手里的是2018年或2020年。你用老版本的pecmd试下吧。
作者: szwp    时间: 2022-4-6 13:07
测了这二个版本

QQ截图20220406130433.png (66.8 KB, 下载次数: 172)

QQ截图20220406130433.png

作者: 527104427    时间: 2022-4-6 13:11
szwp 发表于 2022-4-6 13:07
测了这二个版本

我去反馈一下
作者: dfw9    时间: 2022-4-6 14:06
xianglang 发表于 2022-4-5 12:52
现在都不大喜欢用命令行了,只喜欢用图形界面的。

另外,在“此处打开命令行提示符”这个右键功能,以前 ...

图形界面的可试grubfm
作者: xianglang    时间: 2022-4-6 14:43
szwp 发表于 2022-4-5 15:59
𦀣 长啥样的?

五笔打错码,变成大字符集的了,是Windows目录。

又试了下,似乎是 CD 转路径,只能在系统本分区才直接转到,非系统分区要再输入一下盘符才行。哪个大神能改下 "cmd.exe /k \"cd %L\" " 这个命令,可以直接跨分区转到指定目录?

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Classes\Folder\shell\cmd]
@="命令提示符"
[HKEY_LOCAL_MACHINE\Software\Classes\Folder\shell\cmd\command]
@="cmd.exe /k \"cd %L\" "

作者: szwp    时间: 2022-4-6 14:52
xianglang 发表于 2022-4-6 14:43
五笔打错码,变成大字符集的了,是Windows目录。

又试了下,似乎是 CD 转路径,只能在系统本分区才直 ...

可去cmd下打cd /?看下帮助,换盘符需要加 /d参数。


作者: 527104427    时间: 2022-4-6 18:32
szwp 发表于 2022-4-6 13:07
测了这二个版本

有回复了
http://bbs.wuyou.net/forum.php?m ... =205402&pid=4534189


CALL $--qd --ret:&R Kernel32.dll,CreateFileW,$\\.\C:,#0,#3,#0,#3,#0,#0
ENVI$ &C=*12 0
ENVI$ &n=*4 0    //返回字节数
CALL $--qd Kernel32.dll,DeviceIoControl,#%&R%,#2953344,#0,#0,*&C,#12,*&n,#0
                                                                                                                ==  非0(非空指针)
GETF &C,4#1,&P

ENVI?long &C=&&DeviceNumber:4
ENVI?long &N=&nx
MESS nx:[%&nx%]=n:[%&n?long%] DeviceNumber[%&DeviceNumber%]=C[1]:[%&C?long:~1%]=P:[%&P%]
//nx:[0xC]=n:[0xC] DeviceNumber[0x0]=C[1]:[0x0]=P:[0x00]


========================
2953344 也不说下是什么。 分析了好久 才知道是   IOCTL_STORAGE_GET_DEVICE_NUMBER


点评


作者: szwp    时间: 2022-4-6 18:37
上面链接里有IOCTL_STORAGE_GET_DEVICE_NUMBER,pecmd方便大家试结果,真不熟,mess里的看不懂
作者: xianglang    时间: 2022-4-7 08:56
szwp 发表于 2022-4-6 14:52
可去cmd下打cd /?看下帮助,换盘符需要加 /d参数。

谢谢!一直没注意 CD 命令的参数解析,加上 /D 参数后,可以转盘符了。

作者: szwp    时间: 2022-4-7 08:56
xianglang 发表于 2022-4-7 08:56
谢谢!一直没注意 CD 命令的参数解析,加上 /D 参数后,可以转盘符了。

好奇的是以前怎么没问题的呢?
作者: xianglang    时间: 2022-4-7 09:12
szwp 发表于 2022-4-7 08:56
好奇的是以前怎么没问题的呢?

这个我也想不明白,不知道什么地方出了问题。

作者: szwp    时间: 2022-4-7 09:13
xianglang 发表于 2022-4-7 09:12
这个我也想不明白,不知道什么地方出了问题。

CD不算复杂的命令啊。
作者: xianglang    时间: 2022-4-7 09:20
本帖最后由 xianglang 于 2022-4-7 09:57 编辑
szwp 发表于 2022-4-7 09:13
CD不算复杂的命令啊。

注册表里面这个命令行参数,没变,以前是一直都是没有 /D 参数的,不知道会不会是其他设置造成——都是装的 DNNN WES7 V8 或者三烦的。两年多前换硬盘新装过系统之后,就不能转盘符了;基于IE 的浏览器证书也出了问题。

作者: szwp    时间: 2022-4-7 09:45
xianglang 发表于 2022-4-7 09:20
注册表里面这个命令行参数,没变,以前是一直都是没有 /D 参数的,不知道会不会是其他设置造成——都是装 ...

打cd/?看下,7有/d参数。这个参数早就有了。
作者: xianglang    时间: 2022-4-7 09:59
szwp 发表于 2022-4-7 09:45
打cd/?看下,7有/d参数。这个参数早就有了。

WIN7 的 CD 有 /D 参数,我说没有这个参数,是指资源管理器右键“打开命令行提示符”这条命令,没有写上这个参数。

作者: 2011yaya2007777    时间: 2022-4-7 10:00
echo abc > 123.txt
执行后,123.txt 内部保存的是:61 62 63 20 0d 0a
问题是,怎么多了一个空格?
就是这样的?有没有办法去掉这个空格?
作者: szwp    时间: 2022-4-7 10:26
2011yaya2007777 发表于 2022-4-7 10:00
echo abc > 123.txt
执行后,123.txt 内部保存的是:61 62 63 20 0d 0a
问题是,怎么多了一个空格?

echo abc> 123.txt
作者: szwp    时间: 2022-4-7 10:27
xianglang 发表于 2022-4-7 09:59
WIN7 的 CD 有 /D 参数,我说没有这个参数,是指资源管理器右键“打开命令行提示符”这条命令,没有写上 ...

加上去不难的。/?看下就行。
作者: 2011yaya2007777    时间: 2022-4-7 10:55
我刚才是测试
set /p u=请输入对应的数字://abc
echo %u% > 123.txt
发现abc后面有空格,后来再测试
echo %u%>123.txt
后面也有空格。

现在测试没有了。真是奇怪了。
作者: 21878526    时间: 2022-4-13 08:39
留着学习一下
作者: 2011yaya2007777    时间: 2022-4-26 11:36
今天更新完善了一下。
作者: djog    时间: 2022-4-27 21:56
好象前面 是不是还发过一个版本?? 2个版本哪个是最新的?
作者: goyou    时间: 2022-4-28 19:05
本帖最后由 goyou 于 2022-4-28 19:10 编辑

不知grldr.mbr安装到哪里,我的是gpt磁盘,需要避开1-33扇区,所以想在vhd文件上先试试,vhd我也是做成gpt,先装的是mbr,但安装不了,winhex跳出提示窗口:文件不包含偏移1be。
作者: goyou    时间: 2022-4-29 08:24
再反馈一个问题:除了vhd镜像不能安装,gpt磁盘也不能安装。
作者: 2011yaya2007777    时间: 2022-4-29 08:30
gpt分区格式的磁盘和镜像文件,不能安装mbr,只能安装grldr.mbr。
作者: goyou    时间: 2022-5-9 18:31
2011yaya2007777 发表于 2022-4-29 08:30
gpt分区格式的磁盘和镜像文件,不能安装mbr,只能安装grldr.mbr。

多谢。我一直以为mbr跟grldr.mbr事实上同一个东西。
作者: 481416322    时间: 2022-5-9 18:41
谢谢分享
作者: blank007    时间: 2022-5-9 19:05
请问大侠,与 grubinst 1.4 相比,您的脚本安装的是最新的引导代码吗?
作者: 2011yaya2007777    时间: 2022-5-9 19:19
本帖最后由 2011yaya2007777 于 2022-5-9 19:58 编辑

是。时间久了的话,可以自己更新文件夹里面的grldr.mbr及grldr.pbr。

作者: 481416322    时间: 2022-5-9 19:40
我把启动分区用nt6格式化后,用grldr改名bootmgr冒充一下来用,这样不会出故障吧?
作者: 2011yaya2007777    时间: 2022-5-9 19:54
应该没事
作者: chenall    时间: 2022-5-15 19:21
xianglang 发表于 2022-4-5 12:52
现在都不大喜欢用命令行了,只喜欢用图形界面的。

另外,在“此处打开命令行提示符”这个右键功能,以前 ...

直接在资源管理器的地址栏输入 cmd.exe 回车打开 也挺方便的.
作者: haxc981    时间: 2022-6-13 21:26
没有权限下载怎么回事?
作者: 2011yaya2007777    时间: 2022-6-14 11:08
没有权限下载怎么回事?

多发发言就有积分了。
作者: dcdsyzc    时间: 2022-10-3 04:56
脚本是个好东西
作者: 879792799    时间: 2022-10-4 19:22
本帖最后由 879792799 于 2022-10-4 19:23 编辑

我也发现一个批处理  不太懂

诸位大大说说这个批处理靠谱吗????能用吗??要具备哪些条件才能正确运行???


@echo off
BOOTICEx86 /DEVICE=0 /mbr /install /type=GRUB4DOS /v045 /boot_file=grldr /quiet
echo n|copy /-y %~dp0grub\grldr.* %systemdrive%\
echo n|copy /-y %~dp0grub\menu.lst %systemdrive%\
attrib +h %systemdrive%\grldr.*
attrib +h %systemdrive%\menu.lst
ECHO ┌─────────────────────────────────┐
ECHO │已经把grub4dos写入硬盘MBR! 按任意键退出。                                           │
ECHO └─────────────────────────────────┘
pause >nul


作者: yjkl    时间: 2022-10-8 09:17
学习学习。
作者: dna2jm    时间: 2022-10-13 09:15
感谢大师分享
作者: ZMLoveLH    时间: 2022-10-13 19:15
看看如何在WIN 下安装 UMBR啊
作者: aaa1942    时间: 2022-11-6 21:19
非常有用感谢
作者: laonat    时间: 2022-11-20 03:07
过来看看,学习一下
作者: gaohuagxc    时间: 2022-11-25 20:33
感谢大师分享




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