无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 2011yaya2007777
打印 上一主题 下一主题

[原创] GRUB4DOS for UEFI

    [复制链接]
811#
发表于 2020-12-15 08:55:57 | 只看该作者
回复

使用道具 举报

812#
发表于 2020-12-15 13:03:33 | 只看该作者
测试:添加 load 命令,可以加载 EFI 驱动。(与 GRUB2 的 efiload 命令,以及 EFI Shell 的 load 命令功能相同)
下载: BOOTX64.zip (144.17 KB, 下载次数: 110)
用法:
          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, 下载次数: 190)

点评

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

使用道具 举报

813#
 楼主| 发表于 2020-12-15 13:14:54 来自手机 | 只看该作者
不错,又增加新功能了。

点评

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

使用道具 举报

814#
发表于 2020-12-15 18:20:31 | 只看该作者
wintoflash 发表于 2020-12-15 13:03
测试:添加 load 命令,可以加载 EFI 驱动。(与 GRUB2 的 efiload 命令,以及 EFI Shell 的 load 命令功能 ...

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

使用道具 举报

815#
发表于 2020-12-15 19:43:11 | 只看该作者
这一下RAMOS有的玩了
回复

使用道具 举报

816#
发表于 2020-12-15 21:36:52 | 只看该作者
g4d有类似grub2的编译套装没,编译要两个钟头么

点评

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

使用道具 举报

817#
发表于 2020-12-15 21:44:02 | 只看该作者
江南一根葱 发表于 2020-12-15 21:36
g4d有类似grub2的编译套装没,编译要两个钟头么

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

使用道具 举报

818#
 楼主| 发表于 2020-12-15 22:37:05 来自手机 | 只看该作者
两个小时,太夸张了吧。我2Gb的内存,编译大概10秒。

点评

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

使用道具 举报

819#
发表于 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)
复制代码

执行之后虚拟机报错。



回复

使用道具 举报

820#
 楼主| 发表于 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




回复

使用道具 举报

821#
 楼主| 发表于 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
回复

使用道具 举报

822#
发表于 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)

点评

顺便试了下map也成功,2.5G的VHD,膜拜2011yaya2007777、wintoflash两位大佬  发表于 2020-12-17 00:15
依样画葫芦启动了win10 1909,之前需要分fat启动分区就偷懒没试  发表于 2020-12-17 00:05
好消息!很好的反馈,之前我也是这样子想的,我估计加载这个驱动,就不需要双分区了。  详情 回复 发表于 2020-12-16 17:25
回复

使用道具 举报

823#
发表于 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
回复

使用道具 举报

824#
发表于 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 文件,还是虚拟机报错。
回复

使用道具 举报

825#
发表于 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支持,现在看来不是那么回事。附带对比图:


点评

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

使用道具 举报

826#
 楼主| 发表于 2020-12-16 20:28:41 来自手机 | 只看该作者
wintoflash:我是使用gcc4.8编译的。我编译的时候也报错。不影响使用。

点评

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

使用道具 举报

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

点评

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

使用道具 举报

828#
发表于 2020-12-16 20:43:54 | 只看该作者
2011yaya2007777 发表于 2020-12-16 20:28
wintoflash:我是使用gcc4.8编译的。我编译的时候也报错。不影响使用。

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

使用道具 举报

829#
发表于 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
回复

使用道具 举报

830#
发表于 2020-12-17 10:07:35 | 只看该作者
liuzhaoyzz 发表于 2020-12-16 17:25
好消息!很好的反馈,之前我也是这样子想的,我估计加载这个驱动,就不需要双分区了。

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





点评

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

使用道具 举报

831#
发表于 2020-12-17 10:32:43 | 只看该作者
xianglang 发表于 2020-12-17 10:07
不过磁盘性能,SVBUS 比 PRIMO 差很多啊!而且传统 BIOS 下也比 UEFI 下稍快一些(传统 BIOS 下测速时, ...

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

使用道具 举报

832#
发表于 2020-12-17 12:13:38 | 只看该作者
2011yaya2007777 发表于 2020-12-16 20:37
wuwuzz: g4d支持ntfs,但是启动fixwtg.vhd后,它内部没有ntfs驱动,而UEFI固件也没有提供。

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

使用道具 举报

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

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

使用道具 举报

834#
发表于 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 (50.19 KB, 下载次数: 90)

IMG_20201218_005722.jpg

IMG_20201218_011055.jpg (49.19 KB, 下载次数: 86)

IMG_20201218_011055.jpg

IMG_20201218_004322.jpg (63.72 KB, 下载次数: 86)

IMG_20201218_004322.jpg

点评

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

使用道具 举报

835#
发表于 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的交换磁盘的办法……
回复

使用道具 举报

836#
发表于 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 在最后多一个扇区(估计 是软件进一步识别用的 )

回复

使用道具 举报

837#
 楼主| 发表于 2020-12-18 13:36:21 来自手机 | 只看该作者
grub2的标识是什么?
回复

使用道具 举报

838#
发表于 2020-12-19 12:37:08 来自手机 | 只看该作者
弱弱问一下,支持VHDX差分启动了吗?

点评

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

使用道具 举报

839#
 楼主| 发表于 2020-12-19 12:51:01 来自手机 | 只看该作者
还没有
回复

使用道具 举报

840#
发表于 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, 2024-5-1 19:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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