找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 2011yaya2007777

[原创] GRUB4DOS for UEFI

   火... [复制链接]
发表于 2020-12-15 08:55:57 | 显示全部楼层
大神辛苦了,手工献花!!!
回复

使用道具 举报

发表于 2020-12-15 13:03:33 | 显示全部楼层
测试:添加 load 命令,可以加载 EFI 驱动。(与 GRUB2 的 efiload 命令,以及 EFI Shell 的 load 命令功能相同)
下载: BOOTX64.zip (144.17 KB, 下载次数: 130)
用法:
          load [-n] /path/to/driver.efi
示例:
          load /boot/ntfs_x64.efi
          加载 NTFS 驱动,之后进 EFI Shell 或者 refind 就可以读 NTFS 上的文件。

          load -n /boot/CrScreenshotDxe.efi
          加载屏幕截图驱动,加载之后可以按 左Ctrl + 左Alt + F12 截图,图片格式为 png,保存在第一个找到的 FAT 分区根目录下。

          load /boot/EfiGuardDxe.efi
          加载破解 Windows 驱动签名验证的驱动。(可能不支持较新的 Windows 版本,如 20H1)
示例驱动下载: drivers.zip (122.07 KB, 下载次数: 209)

点评

试了,ntfs驱动,没有问题。  详情 回复 发表于 2020-12-15 18:20
回复

使用道具 举报

 楼主| 发表于 2020-12-15 13:14:54 来自手机 | 显示全部楼层
不错,又增加新功能了。

点评

强 感觉g4e 的 c 代码多,字节代码少 refind 好像 是edk的项目 看看它对外部设备的分类,(要看的话看英文原版) scanfor internal,external 扫描的媒介(efi分区/非efi分区)及顺序 internal  详情 回复 发表于 2020-12-15 13:23
回复

使用道具 举报

发表于 2020-12-15 18:20:31 | 显示全部楼层
wintoflash 发表于 2020-12-15 13:03
测试:添加 load 命令,可以加载 EFI 驱动。(与 GRUB2 的 efiload 命令,以及 EFI Shell 的 load 命令功能 ...

试了,ntfs驱动,没有问题。
回复

使用道具 举报

发表于 2020-12-15 19:43:11 | 显示全部楼层
这一下RAMOS有的玩了
回复

使用道具 举报

发表于 2020-12-15 21:36:52 | 显示全部楼层
g4d有类似grub2的编译套装没,编译要两个钟头么

点评

啪一下就编译完了,很快啊。  详情 回复 发表于 2020-12-15 21:44
回复

使用道具 举报

发表于 2020-12-15 21:44:02 | 显示全部楼层
江南一根葱 发表于 2020-12-15 21:36
g4d有类似grub2的编译套装没,编译要两个钟头么

啪一下就编译完了,很快啊。
回复

使用道具 举报

 楼主| 发表于 2020-12-15 22:37:05 来自手机 | 显示全部楼层
两个小时,太夸张了吧。我2Gb的内存,编译大概10秒。

点评

外部命令怎么弄? 我是这样的: 把你的 grub4dos.h 和 grubprog.h 改名 grub4efi.h 和 g4eprog.h。 写个最简单的外部命令: 编译: 执行之后虚拟机报错。 [attachimg]470787[/attachimg]  详情 回复 发表于 2020-12-16 10:36
回复

使用道具 举报

发表于 2020-12-16 10:36:10 | 显示全部楼层
2011yaya2007777 发表于 2020-12-15 22:37
两个小时,太夸张了吧。我2Gb的内存,编译大概10秒。

外部命令怎么弄?
我是这样的:
把你的 grub4dos.h 和 grubprog.h 改名 grub4efi.h 和 g4eprog.h。
写个最简单的外部命令:
  1. #include "grub4efi.h"
  2. /* this is needed, see the comment in grubprog.h */
  3. #include "g4eprog.h"
  4. /* Do not insert any other asm lines here. */

  5. int main(char *arg,int flags)
  6. {
  7.         return printf ("%s\n",arg);
  8. }
复制代码

编译:
  1. gcc -nostdlib -DASM_BUILD_DATE=\"".long 20201216"\" -fno-reorder-functions -fno-strict-aliasing -fno-exceptions -fno-asynchronous-unwind-tables -fno-unwind-tables -fno-zero-initialized-in-bss -fno-function-cse -fno-jump-tables --entry main -Wl,-N -Wl,--build-id=none -m64 -mno-sse -Wl,-Ttext -Wl,0 -fPIE -I../include/ echo.c -o echo.o
  2. objcopy -O binary echo.o echo.tmp
  3. sed -e '$s/\x00*$//' echo.tmp > echo.mod
  4. mv echo.mod bin/$(basename -s .mod echo.mod)
复制代码

执行之后虚拟机报错。
1.png


回复

使用道具 举报

 楼主| 发表于 2020-12-16 15:07:41 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2020-12-16 15:15 编辑

[code]/*
* compile:
*
* gcc -Wl,--build-id=none -m64 -mno-sse -nostdlib -Wno-int-to-pointer-cast -fno-zero-initialized-in-bss -fno-function-cse -fno-jump-tables -Wl,-N -fPIE g4e_wb.c -o g4e_wb.o 2>&1|tee build.log
* generate executable:         objcopy -O binary g4e_wb.o g4e_wb
*
*/

#include "grub4dos.h"

//在此定义静态变量、结构。不能包含全局变量,否则编译可以通过,但是不能正确执行。
//不能在main前定义子程序,在main后可以定义子程序。

static void get_GRUB_IMGE (void);

/* 这是必需的,请参阅grubprog.h中的注释 */
#include "grubprog.h"
/* 请勿在此处插入任何其他asm行 */
//不能包含子程序,不能包含全局变量,否则编译可以通过,但是不能正确执行。

int main(char *arg,int key)
{
  get_GRUB_IMGE();
  if (!GRUB_IMGE)
    return 0;

  return printf ("g4e_wb_func,%s",arg);
}

//在内存0-0x9ffff, 搜索特定字符串"$INT13SFGRUB4DOS",获得GRUB_IMGE
static void get_GRUB_IMGE (void)
{
  int i, j;
for(i = 0x9F000; i >= 0; i -= 0x1000)
{
    for(j = 0; j < 0x1000 ; j += 16)
    {
      char *p = (char *)(unsigned long long)(int)(i+j);
      if (p[11]=='G' && p[12]=='R' && p[13]=='U' && p[14]=='B' && p[15]=='4' && p[16]=='D' && p[17]=='O' && p[18]=='S') //比较数据
      {
        GRUB_IMGE = *(unsigned long long *)(unsigned long long)(int)(i+j+32); //GRUB4DOS_for_UEFI文件地址
        return;;  //查到
      }
  }
}
  return;
}

菜单:
title g4e_wb
g4e_wb abcdef
pause




回复

使用道具 举报

 楼主| 发表于 2020-12-16 15:14:09 | 显示全部楼层
记得以前上传了一个外部命令编译环境,附带修改后的热键代码,怎么找不到了。
再上传一次。

g4e_wb.rar

8.95 KB, 下载次数: 25, 下载积分: 无忧币 -2

点评

还是不行啊。 报警: /usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8 虽然能出来文件,但是还是一样的,虚拟机报错关闭。 gcc 加上 --entry main 不报警了,但还是  详情 回复 发表于 2020-12-16 18:25
回复

使用道具 举报

发表于 2020-12-16 15:23:06 | 显示全部楼层
使用 G4E 2020-12-15 版本,使用以下菜单项成功启动单 NTFS 分区 VHD 格式的 Windows 7 RAMOS!至此,G4E 对于我来说,具备实际使用价值了!

title  Windows 7 x64 @ RAM \n 启动硬盘上的 Windows 7 x64 @ RAM 系统
  load /EFI/GRUB/NTFS_x64.efi
  map --mem --top (hd1,1)/VDF/Win7x64.vhd (hd)
  rootnoverify (hd-1,0)
  chainloader (hd-1)

点评

好消息!很好的反馈,之前我也是这样子想的,我估计加载这个驱动,就不需要双分区了。  详情 回复 发表于 2020-12-16 17:25
回复

使用道具 举报

发表于 2020-12-16 17:25:28 来自手机 | 显示全部楼层
xianglang 发表于 2020-12-16 15:23
使用 G4E 2020-12-15 版本,使用以下菜单项成功启动单 NTFS 分区 VHD 格式的 Windows 7 RAMOS!至此,G4E  ...

       好消息!很好的反馈,之前我也是这样子想的,我估计加载这个驱动,就不需要双分区了。

点评

不过磁盘性能,SVBUS 比 PRIMO 差很多啊!而且传统 BIOS 下也比 UEFI 下稍快一些(传统 BIOS 下测速时,开了同花顺和国信通达信两个股票软件下测试的,会有所影响。) [attachimg]470860[/attachimg] [attachimg  详情 回复 发表于 2020-12-17 10:07
回复

使用道具 举报

发表于 2020-12-16 18:25:34 | 显示全部楼层
本帖最后由 wintoflash 于 2020-12-16 18:33 编辑
2011yaya2007777 发表于 2020-12-16 15:14
记得以前上传了一个外部命令编译环境,附带修改后的热键代码,怎么找不到了。
再上传一次。

还是不行啊。
  1. gcc -Wl,--build-id=none -m64 -mno-sse -nostdlib -Wno-int-to-pointer-cast -fno-zero-initialized-in-bss -fno-function-cse -fno-jump-tables -Wl,-N -fPIE g4e_wb.c -o g4e_wb.o 2>&1|tee build.log
  2. objcopy -O binary g4e_wb.o g4e_wb
复制代码

报警:
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8
虽然能出来文件,但是还是一样的,虚拟机报错关闭。
gcc 加上 --entry main 不报警了,但还是虚拟机报错。

-------------------------------------------------------------------
我发现直接用你编译好的 g4d_wb 文件,还是虚拟机报错。
回复

使用道具 举报

发表于 2020-12-16 19:45:04 | 显示全部楼层
wuwuzz 发表于 2020-12-10 18:28
对G4E,grub2 同步测试svbus。
结果迷乱(遇到兼容性问题,可能涉及到UEFI版本、U盘固件、SVBUS、grub*多种 ...

问题1: G4E在AMI UEFI V2016下会出现boot_image_handle not found已解决。

先load ntfs_x64.efi,再map存放在NTFS分区的fixwtg.vhd,就可以找到并loadimg了。
这台笔记本所配AMI UEFI V2016未带NTFS驱动。我原以为ls、map已经成功看到fixwtg.vhd,
就表明G4E本身已内置NTFS支持,现在看来不是那么回事。附带对比图:
NTFS.jpg

点评

GRUB2/GRUB4DOS的各种文件系统驱动都只能在它们内部使用。 这个 NTFS 驱动是给 UEFI 固件用的。map 的时候启动 bootx64.efi 用的是 UEFI 启动服务 LoadImage,固件读文件要用 UEFI 的驱动。  详情 回复 发表于 2020-12-16 20:54
回复

使用道具 举报

 楼主| 发表于 2020-12-16 20:28:41 来自手机 | 显示全部楼层
wintoflash:我是使用gcc4.8编译的。我编译的时候也报错。不影响使用。

点评

我也是GCC4.8。就算直接执行你编译好的 g4d_wb,也是死机。  详情 回复 发表于 2020-12-16 20:43
回复

使用道具 举报

 楼主| 发表于 2020-12-16 20:37:30 来自手机 | 显示全部楼层
wuwuzz: g4d支持ntfs,但是启动fixwtg.vhd后,它内部没有ntfs驱动,而UEFI固件也没有提供。

点评

谢谢老大指点、确认。  详情 回复 发表于 2020-12-17 12:13
回复

使用道具 举报

发表于 2020-12-16 20:43:54 | 显示全部楼层
2011yaya2007777 发表于 2020-12-16 20:28
wintoflash:我是使用gcc4.8编译的。我编译的时候也报错。不影响使用。

我也是GCC4.8。就算直接执行你编译好的 g4d_wb,也是死机。
回复

使用道具 举报

发表于 2020-12-16 20:54:23 | 显示全部楼层
wuwuzz 发表于 2020-12-16 19:45
问题1: G4E在AMI UEFI V2016下会出现boot_image_handle not found已解决。

先load ntfs_x64.efi,再m ...

GRUB2/GRUB4DOS的各种文件系统驱动都只能在它们内部使用。
这个 NTFS 驱动是给 UEFI 固件用的。map 的时候启动 bootx64.efi 用的是 UEFI 启动服务 LoadImage,固件读文件要用 UEFI 的驱动。

点评

谢谢W大解释,这就清晰多了,不同阶段加载不同的NTFS驱动,以前我有模糊认识。  详情 回复 发表于 2020-12-17 12:15
回复

使用道具 举报

发表于 2020-12-17 10:07:35 | 显示全部楼层
liuzhaoyzz 发表于 2020-12-16 17:25
好消息!很好的反馈,之前我也是这样子想的,我估计加载这个驱动,就不需要双分区了。

不过磁盘性能,SVBUS 比 PRIMO 差很多啊!而且传统 BIOS 下也比 UEFI 下稍快一些(传统 BIOS 下测速时,开了同花顺和国信通达信两个股票软件下测试的,会有所影响。)

Primo 驱动 UEFI 方式

Primo 驱动 UEFI 方式

SVBUS 驱动 UEFI 方式

SVBUS 驱动 UEFI 方式

SVBUS 驱动 BIOS 方式

SVBUS 驱动 BIOS 方式


点评

是的,svbus驱动速度跟primo驱动速度没法比,正版primo6.3.1速度是svbus速度的4倍多。  详情 回复 发表于 2020-12-17 10:32
回复

使用道具 举报

发表于 2020-12-17 10:32:43 | 显示全部楼层
xianglang 发表于 2020-12-17 10:07
不过磁盘性能,SVBUS 比 PRIMO 差很多啊!而且传统 BIOS 下也比 UEFI 下稍快一些(传统 BIOS 下测速时, ...

        是的,svbus驱动速度跟primo驱动速度没法比,正版primo6.3.1速度是svbus速度的4倍多。
回复

使用道具 举报

发表于 2020-12-17 12:13:38 | 显示全部楼层
2011yaya2007777 发表于 2020-12-16 20:37
wuwuzz: g4d支持ntfs,但是启动fixwtg.vhd后,它内部没有ntfs驱动,而UEFI固件也没有提供。

谢谢老大指点、确认。
回复

使用道具 举报

发表于 2020-12-17 12:15:26 | 显示全部楼层
wintoflash 发表于 2020-12-16 20:54
GRUB2/GRUB4DOS的各种文件系统驱动都只能在它们内部使用。
这个 NTFS 驱动是给 UEFI 固件用的。map 的时 ...

谢谢W大解释,这就清晰多了,不同阶段加载不同的NTFS驱动,以前我有模糊认识。
回复

使用道具 举报

发表于 2020-12-18 07:34:43 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2020-12-18 14:45 编辑
2011yaya2007777 发表于 2020-11-2 11:04
bios 版本就可以实现上述功能。测试了一下,uefi 版本同样可以实现。
vdf静态:map xxx.vdf (hd)
vdf动 ...

        我试过了直接map vdf,vdf里面内置了primo驱动,删除了svbus驱动,不带mem的这种,启动到BCD这里,如果采用NTFS单分区就会报0xc0000225错误。

如果采用激活的FAT32+NTFS双分区,则会报0xc000000f错误。这样子的问题跟我们在
697等楼层预想的结果一样,我们已经困扰在UEFI-RAMOS-BCD加载这个环节上很多年了。primo驱动启动原理在183楼

用grub2最新版直接map vdf结果一样,加不加--rt结果一样。
我不知道这个vdf是动态还是静态的,怎么看?

晚点我把菜单贴上来。
1.g4e菜单
title WIN7X64-primo (/vdf/SX7.vdf)
load /EFI/grub/ntfs_x64.efi
find --ignore-floppies --ignore-cd --set-root /vdf/SX7.vdf
map /vdf/SX7.vdf (hd)
chainloader (hd-1)

2、grub2菜单
menuentry "SX7.vdf" "/vdf/SX7.vdf" {
        efiload /EFI/grub/ntfs_x64.efi
        search --no-floppy --set --file $2
        map $2
}
晚点我会在再次上传个小点的vdf在wintoflash大神的grub2那个帖子,用于启动测试,之前上传的没有EFI引导文件,不便于测试。因为vdf是面向机器的,不同的电脑驱动不同,即使在我的电脑成功启动,在你的电脑也不能启动,所以vdf只能用于g4e/grub2加载测试。我现在在外面,手机回帖。

根据前面的
705楼微软知识库,是否是map的磁盘类型微软不认识?能否像707楼那样子改下类型让我测试下?(我不懂瞎问的,不知道与--mem是否一样)

从之前svbus-VHD-RAMOS成功的经验来看,g4e/grub2需要在底层磁盘驱动层面进行对接,svbus是开源的,primo驱动是闭源的商业软件(收费软件),这是个问题。primo驱动位于前期SCSI class group服务组启动,通过磁盘签名来查找vdf所在的磁盘,然后把vdf加载到内存中,g4e/grub2需要获得怎样的接口以确保能够顺利与primo驱动对接,我可以去primo驱动官方论坛发个帖子咨询下他们,看看他们是否愿意提供相关的接口,我不能很明确地表达在与之对接方面的需求,sunsea可能表达下?

有没有这种可能,直接map启动模式根本不需要g4e/grub2与primo驱动对接?因为直接map模式下g4e/grub2根本不需要创建内存盘,创建内存盘是由primo驱动加载vdf之后创建的。

当前似乎不是卡在g4e/grub2与primo驱动对接的这个环节上,似乎卡在直接map后bootmgfw.efi,BCD,Winload.efi这些引导前期相关文件不能识别g4e/grub2仿真磁盘的这个环节上。这个需要有懂得启动流程的高手帮忙看看,甚至需要反汇编下bootmgfw.efi,看他做了哪些事情。

我分析,可能的原因是,g4e/grub2 map xxx.vdf之后,在UEFI环境仿真出来的磁盘,在进入windows保护模式后,没有被分配一个盘符,而BCD中加载winload.efi需要采用盘符+路径的方式才能正常找到winload.efi并加载。但是为什么vdf里面的BCD能够被正常找到并加载?没道理呀?

我为什么有这个推测呢?因为用diskgenius加载vdf以后,似乎vdf里的分区就是没有被分配盘符的,而vhd文件加载后直接就分配了盘符,BCD指向的是系统盘的winload.efi,所以能够启动。primo几年前说会支持保存为vhd格式,但是几年过去了保存为vhd格式这个功能一直没有被开发出来。

另外,一个vdf文件放在ssd上面,用g4e加载显示有碎片(忘了截图),我用wincontig整理后显示没有碎片,但是g4e仍然无法直接map,提示有碎片,但我在g4e环境下用blocklist查看该文件,却没有反馈结果。

IMG_20201218_005722.jpg
IMG_20201218_011055.jpg
IMG_20201218_004322.jpg

点评

Primo的东西不知道不清楚,但是g4e的用户群也不会给他带来多少利润…… 其实我现在在怀疑都UEFI时代了bootmgfw.efi还只认0x80……不知道有没有类似的办法能够类似于g4d时代的这段代码一样: 来正确传递磁盘相  详情 回复 发表于 2020-12-18 11:58
回复

使用道具 举报

发表于 2020-12-18 11:58:04 | 显示全部楼层
liuzhaoyzz 发表于 2020-12-18 07:34
我试过了直接map vdf,vdf里面内置了primo驱动,删除了svbus驱动,不带mem的这种,启动到BCD这 ...

Primo的东西不知道不清楚,但是g4e的用户群也不会给他带来多少利润……

其实我现在在怀疑都UEFI时代了bootmgfw.efi还只认0x80……不知道有没有类似的办法能够类似于g4d时代的这段代码一样:
  1. chainloader /bootmgr
  2. root (hdX,Y)
  3. boot
复制代码

来正确传递磁盘相关信息或者类似于g4d的交换磁盘的办法……
回复

使用道具 举报

发表于 2020-12-18 12:46:54 | 显示全部楼层
本帖最后由 2011whp 于 2020-12-20 13:30 编辑

bootmgfw问题

g4e 在 注册 引导器时,是不是    不是grub2的标识了,是无名引导器。

引导器,都有 exit 肯定内部有 共同 的数据栈 。  从认可方面,考虑 (因为bootmgfw有时候,也不是一点也没有得到执行),为什么grub2可以呢
上面是  瞎猜呢

试了  map --mem --top 后 ,img和vhd差别  不大
       也许是 对于UEFI来说,MBR的代码部分已经,没什么用了


名称: Wind400.vhd
大小: 419430912 字节 (400 MiB)
CRC64: 8BCBE261DD80F196

名称: Wind400.img
大小: 419430400 字节 (400 MiB)
CRC64: 71E5D436910D94C0


结果: vhd 比 img 在最后多一个扇区(估计 是软件进一步识别用的 )

回复

使用道具 举报

 楼主| 发表于 2020-12-18 13:36:21 来自手机 | 显示全部楼层
grub2的标识是什么?
回复

使用道具 举报

发表于 2020-12-19 12:37:08 来自手机 | 显示全部楼层
弱弱问一下,支持VHDX差分启动了吗?

点评

我现在也是用差分系统,等待中。  详情 回复 发表于 2020-12-19 18:04
回复

使用道具 举报

 楼主| 发表于 2020-12-19 12:51:01 来自手机 | 显示全部楼层
回复

使用道具 举报

发表于 2020-12-19 18:04:32 | 显示全部楼层
kenddy 发表于 2020-12-19 12:37
弱弱问一下,支持VHDX差分启动了吗?

我现在也是用差分系统,等待中。

点评

GRUB4DOS BIOS 版就不支持差分 VHD 啊,更别说 VHDX 了。 你是不是 BIOS 下用的 NTBOOT? https://github.com/chenall/grub4dos/blob/0da21fe58ac4df19ecb84608a6aa81b14326a9fb/stage2/dec_vhd.c#L199  详情 回复 发表于 2020-12-19 19:02
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-19 13:38

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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