2011yaya2007777 发表于 2020-11-7 11:14:14

(其实我没看懂你这个问题……
你已经说明白了,两种情况都可以挂载。不过第二种情况比较复杂,不像BIOS环境0x80就是第一块硬盘,在UEFI环境其实没有0x80的概念,它能不能分析,分析对不对是未知数,恐怕修改代码。没有测试,只是瞎猜想,第一种情况相对简单。
我原来是想,如果不能挂载第二种情况,我复制插槽时,就把它滤除了。

slore 发表于 2020-11-7 11:16:42

本帖最后由 slore 于 2020-11-7 11:19 编辑

2011yaya2007777 发表于 2020-11-7 11:05
之所以没有尽快上传代码,一是还有些已知遗留问题需要处理,还要清除众多的内部调试代码。二是不知道怎么 ...
GRUB4DOS的BIOS分支、UEFI分支在一起,即有继承性,又方便浏览下载。


克隆生成一个新仓库,再新开分支提交就行了。同源,代码很容易在多仓库间合并。开发履历会保留了。
代码也都在一起,也会连接到原仓库。

wintoflash 发表于 2020-11-7 11:36:07

本帖最后由 wintoflash 于 2020-11-7 11:54 编辑

2011yaya2007777 发表于 2020-11-7 10:41
终于搞明白了,是启动 Windows 时只认第一光驱!我的电脑内存小,平时只是测试个小空壳iso,所以老是不能重 ...
我知道uefi有引导服务和运行服务性质的代码、数据。那什么时候引导服务数据被清除?是执行了启动镜像(b->start_imag)服务后,由uefi清除的吗?
boot services 里面有个 ExitBootServices。bootloader或者os kernel调用了这个之后,uefi就释放所有的boot services数据。
这个是在转圈之后调用的,应该在winload.efi里面。
我看grub2好像在引导镜像前释放了自己的内存。W大好像没有什么动作。
没有吧。uefi下grub2都是要通过boot services申请内存的,反正到系统启动的时候uefi就会自己放掉。

wintoflash 发表于 2020-11-7 11:59:21

sunsea 发表于 2020-11-7 10:45
第一个问题盲猜是UEFI只告诉Windows这块内存没人用了,然后Windows把它加入可用内存列表分配使用,仅此而 ...

我觉得yaya想弄清楚的是,如果不加--mem,
根据slot找到【镜像所在的】【磁盘位置】,然后直接【读写磁盘】
svbus是怎么把bios下的磁盘和windows下的磁盘对上号的?
比如 (hd0,1)/xxx.vhd,是怎么对应到 E:\xxx.vhd 的。

sunsea 发表于 2020-11-7 11:59:41

2011yaya2007777 发表于 2020-11-7 11:14
你已经说明白了,两种情况都可以挂载。不过第二种情况比较复杂,不像BIOS环境0x80就是第一块硬盘,在UEFI ...

先复制吧,我过会回宿舍再阅读一下代码看看具体它怎么找硬盘的。

sunsea 发表于 2020-11-7 12:00:38

wintoflash 发表于 2020-11-7 11:59
我觉得yaya想弄清楚的是,如果不加--mem,

svbus是怎么把bios下的磁盘和windows下的磁盘对上号的?


好的,我下午晚上再看看,争取写个分析帖子出来。

hyde777 发表于 2020-11-7 12:18:57

将原版win10pe iso解压到FAT32分区的优盘,可以启动

然后将/EFI/Boot/bootx64.efi改名为/EFI/Boot/winpe.efi使用GRUB4DOS for UEFI无法引导

菜单:
title winpe
chainloader /EFI/Boot/winpe.efi

提示Press any key to continue...

求教怎么回事?

tulongwa 发表于 2020-11-7 12:42:00

恭喜,终于支持EFI启动了,开始搞起来

wintoflash 发表于 2020-11-7 14:45:41

2011yaya2007777 发表于 2020-11-7 11:05
之所以没有尽快上传代码,一是还有些已知遗留问题需要处理,还要清除众多的内部调试代码。二是不知道怎么 ...

你要是不会操作,要不先把代码传给我,我研究一下。

sunsea 发表于 2020-11-7 17:09:16

本帖最后由 sunsea 于 2020-11-7 17:13 编辑


        // get list of disk class devices
        Status = IoGetDeviceInterfaces(&GUID_DEVINTERFACE_DISK,NULL,0,&SymbolicLinkList);
        if(!NT_SUCCESS(Status))
        {
                return Status;
        }

        // allocate memory for read buffer
        // the minimum buffer size should be 2048 bytes for one CD/DVD-ROM sector
        size = 0x800;
        buf = (PUCHAR)ExAllocatePoolWithTag(PagedPool,size,SVBUS_POOL_TAG);
        if(buf == NULL)
        {
                return STATUS_INSUFFICIENT_RESOURCES;
        }

        // do this for every disk in the Unicode string list
        for(p = SymbolicLinkList; *p != UNICODE_NULL; p += len)
        {
                // do not check our own SVBus, this can BSOD with the error "System Thread Exception not handled" if we send IRP_MJ_READ in IoCallDriver of ReadWritePhysicalDisk
                /*lint -save -e585 Warning 585: The sequence (??\) is not a valid Trigraph sequence */
                if(RtlCompareMemory(p,L"\\??\\SVBus",(SIZE_T)0x12) != 0x12)
                /*lint -restore */
                {
                        // initialize device name unicode string
                        RtlInitUnicodeString(&deviceNameUnicodeString,p);

                        // get a pointer to the top object in the named device object's stack and a pointer to the corresponding file object
                        Status = IoGetDeviceObjectPointer(&deviceNameUnicodeString,FILE_ALL_ACCESS,&FileObject,&FileDeviceObject);
                        if(NT_SUCCESS(Status))
                        {
                                // CDROM
                                if(DeviceExtension->Disk.VirtualDeviceType == CDROM)
                                {
                                        // read possible CD001 location of virtual ISO file on physical disk
                                        ByteOffset.QuadPart = (LONGLONG)DeviceExtension->Disk.ImageStartOffsetInBytes + 0x8000; //算出镜像文件首地址,然后求出特征标记所在地址
                                }
                                // HDD and FLOPPY
                                else
                                {
                                        // read possible MBR location of virtual hard disk file on physical disk
                                        ByteOffset.QuadPart = (LONGLONG)DeviceExtension->Disk.ImageStartOffsetInBytes;//算出镜像文件首地址,然后求出特征标记所在地址
                                }

                                // zero read buffer memory
                                RtlZeroMemory(buf,size);

                                // read / write physical disk
                                Status = ReadWritePhysicalDisk(FileDeviceObject,FileObject,IRP_MJ_READ,buf,(ULONG)size,&ByteOffset);
                                if(NT_SUCCESS(Status))
                                {
                                        // CDROM
                                        if(DeviceExtension->Disk.VirtualDeviceType == CDROM)
                                        {
                                                // check for string "CD001"
                                                if(buf == 'C' && buf == 'D' && buf == '0' && buf == '0' && buf == '1') //读写,检查标记,对就给过
                                                {
                                                        // we have found a valid CDROM ISO, save file object and file device object
                                                        DeviceExtension->Disk.FileObject = FileObject;
                                                        DeviceExtension->Disk.FileDeviceObject = FileDeviceObject;
                                                        // free read buffer memory
                                                        ExFreePoolWithTag(buf,SVBUS_POOL_TAG);
                                                        // free list of disks
                                                        ExFreePool(SymbolicLinkList);
                                                        return STATUS_SUCCESS;
                                                }
                                        }
                                        // HDD and FLOPPY
                                        else if(DeviceExtension->Disk.VirtualDeviceType == HDD || DeviceExtension->Disk.VirtualDeviceType == FLOPPY)
                                        {
                                                // check for last 2 bytes of a valid MBR
                                                if(buf == 0x55 && buf == 0xAA) //读写,检查标记,对就给过
                                                {
                                                        // we have found a valid MBR, save file object and file device object
                                                        DeviceExtension->Disk.FileObject = FileObject;
                                                        DeviceExtension->Disk.FileDeviceObject = FileDeviceObject;
                                                        // free read buffer memory
                                                        ExFreePoolWithTag(buf,SVBUS_POOL_TAG);
                                                        // free list of disks
                                                        ExFreePool(SymbolicLinkList);
                                                        return STATUS_SUCCESS;
                                                }
                                        }
                                }

                                // we have not found a CDROM ISO or an MBR
                                // dereference the file object, this will also indirectly dereference the device object
                                ObDereferenceObject(FileObject);
                        }
                }

                // get Unicode string length of physical disk
                // add 2 bytes for Unicode terminating null and continue with the next physical disk in the list
                len = wcslen(p) + 1;
        }

SVBus作者思路就两部:
1,算出镜像文件应该所在物理磁盘上的位置
2,根据位置,逐个检查物理磁盘,读指定位置,看有没有特征标记,有就给过,不再检查

跟那些0x80 0x81没有任何关系……这个思路我只能说牛逼,用最小的代码量覆盖了99%的情况……毕竟两个磁盘上同一位置都有有效标记很罕见……也意味着这个方案应该是可以移植到UEFI下的……

wintoflash 发表于 2020-11-7 19:37:53

sunsea 发表于 2020-11-7 17:09
SVBus作者思路就两部:
1,算出镜像文件应该所在物理磁盘上的位置
2,根据位置,逐个检查物理磁盘,读 ...

这还真是简单粗暴。
那map信息里面的CHS什么的也用不到吧,只要文件在磁盘上的扇区号或者内存地址信息就行了。

sunsea 发表于 2020-11-7 20:09:11

wintoflash 发表于 2020-11-7 19:37
这还真是简单粗暴。
那map信息里面的CHS什么的也用不到吧,只要文件在磁盘上的扇区号或者内存地址信息就 ...

似乎还是用了,因为Windows会询问这些磁盘参数,所以Slots里是啥SVBus就填的啥。

yizhen 发表于 2020-11-8 00:47:19

liuzhaoyzz 发表于 2020-11-6 13:29
title /EFI/Microsoft/Boot/bootmgfw.efi
find --set-root /EFI/Microsoft/Boot/bootmgfw.efi
chainloa ...

感谢指导,现在提示:
(hd0,0)
Press any key to continue...

menu.lst写的是:
timeout 55
default 0
font /GRUB/unifont.hex.gz

title /EFI/Microsoft/Boot/bootmgfw1.efi
find --set-root /EFI/Microsoft/Boot/bootmgfw1.efi
chainloader /EFI/Microsoft/Boot/bootmgfw1.efi

yizhen 发表于 2020-11-8 00:49:17

hyde777 发表于 2020-11-7 12:18
将原版win10pe iso解压到 FAT32分区的优盘,可以启动

然后将/EFI/Boot/bootx64.efi改名为/EFI/Boot/winp ...

同问Press any key to continue...
我启动bootmfw也是这样

2011whp 发表于 2020-11-8 10:55:15

本帖最后由 2011whp 于 2020-11-8 11:31 编辑

sunsea的系统虚拟总线驱动(svbus)搞的怎么样了,期待中
好像 直接找文件,
希望g4e,在这里留下的标准的 标识变量,并公布出来,最好不是一个ISO,而是总线集合变量
让其它引导也 照样做,形成标准,有利于RAMOS,同时也有利于周边开发
GUID 就用 sunsea建议的 {621F0DF7-B6BB-4334-B16B-3C8AFC883B3A}


2011yaya2007777 发表于 2020-11-8 11:48:14

似乎还是用了,因为Windows会询问这些磁盘参数,所以Slots里是啥SVBus就填的啥
我想了解SVBus使用插槽的情况,可否上传源代码?

sunsea 发表于 2020-11-8 12:35:46

本帖最后由 sunsea 于 2020-11-8 12:43 编辑

2011yaya2007777 发表于 2020-11-8 11:48
我想了解SVBus使用插槽的情况,可否上传源代码?
https://sourceforge.net/projects/svbus/
在这里直接下载,程序包里就有源代码。
搜索关键词是slots。有什么内核相关的函数看不懂可以问我。

摘录一些:

      DeviceExtension->Disk.DiskGeometry.TracksPerCylinder = DriverExtension->slot.max_head + 1;
      DeviceExtension->Disk.DiskGeometry.SectorsPerTrack = DriverExtension->slot.to_sector;
      DeviceExtension->Disk.DiskGeometry.BytesPerSector = DeviceExtension->Disk.SectorSize;
      DeviceExtension->Disk.DiskGeometry.Cylinders.QuadPart = (LONGLONG)((DeviceExtension->Disk.ImageSizeInLBAs / DeviceExtension->Disk.DiskGeometry.TracksPerCylinder) / DeviceExtension->Disk.DiskGeometry.SectorsPerTrack);↑CHS直接引用slot


      if(DriverExtension->slot.from_cdrom == 1)
      {
                // set device type and characteristics to CDROM
                DeviceType = FILE_DEVICE_CD_ROM;
                DeviceCharacteristics = FILE_REMOVABLE_MEDIA | FILE_READ_ONLY_DEVICE | FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN;
      }
      // HDD and FLOPPY
      // from_cdrom == 0
      else
      {
                // FLOPPY
                if(DriverExtension->slot.from_drive < 0x80)
                {
                        // set device type and characteristics to FLOPPY
                        DeviceType = FILE_DEVICE_DISK;
                        DeviceCharacteristics = FILE_REMOVABLE_MEDIA | FILE_FLOPPY_DISKETTE | FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN;
                }
                // HDD
                else
                {
                        // set device type and characteristics to HDD
                        DeviceType = FILE_DEVICE_DISK;
                        DeviceCharacteristics = FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN;
                }
      }

↑根据from_drive判断类型。

      // RAM image
      if(DriverExtension->slot.to_drive == 0xFF)
      {
                // set image type to RAM and copy image type string
                DeviceExtension->Disk.ImageType = RAM;
                swprintf(DeviceExtension->Disk.wszImageType,L"RAM");
      }
      // DISK image
      else
      {
                // set image type to DISK and copy image type string
                DeviceExtension->Disk.ImageType = DISK;
                swprintf(DeviceExtension->Disk.wszImageType,L"Disk");
      }

↑根据to_drive判断镜像所在位置。



                        // do not subtract one sector for the VHD image footer, because we have a floppy image
                        DeviceExtension->Disk.ImageSizeInLBAs = DriverExtension->slot.sector_count;
↑计算磁盘长度。

      // calculate image start offset in bytes
      // start sector is always based on 512 byte sectors of the HDD
      DeviceExtension->Disk.ImageStartOffsetInBytes = DriverExtension->slot.start_sector * 512;↑计算在磁盘上的起始地址。

其他参数好像没用,不过为了保持结构一致和地址不变的话还是保留吧?反正也不占多少空间。

2011yaya2007777 发表于 2020-11-8 13:03:11

本帖最后由 2011yaya2007777 于 2020-11-8 13:04 编辑

在这里直接下载,程序包里就有源代码
谢谢了。主要是我认为在 UEFI 环境下,chs 参数无用,插槽的 chs 位置被其他参数占用。看来换得做些调整。

那个网站打不开!

sunsea 发表于 2020-11-8 13:11:22

2011yaya2007777 发表于 2020-11-8 13:03
谢谢了。主要是我认为在 UEFI 环境下,chs 参数无用,插槽的 chs 位置被其他参数占用。看来换得做些调整 ...

Here。里面的SVBus/src文件夹。


我也是很好奇,都0202年了,为什么Windows还要询问磁盘的CHS……M$真的不知道几乎所有磁盘都是线性寻址了吗……0202年了不是1999年啊……


xianglang 发表于 2020-11-8 13:52:15

终于支持 UEFI 了,太好了!

xianglang 发表于 2020-11-8 14:49:14

liuzhaoyzz 发表于 2020-10-30 16:07
其实我一直在想能否和BIOS下的grub4dos共用一套菜单,比如MBR磁盘,根目录下有一个menu.lst,BIOS ...

我也想共用一套菜单,建议还是尽量兼容原有的版本命令。

另外,这个版本,搜索菜单并不是默认从根目录开始的:我的机上,EFI分区里有GRUB目录的MENU.LST文件,根目录下也有,结果启动后使用的是GRUB目录下的,而非根目录下的。

xianglang 发表于 2020-11-8 15:30:57

有阴也有阳 发表于 2020-11-1 00:15
提一个建议,能否把支持UEFI启动的menu.lst菜单的位置设置成EFI/grub/menu.lst,

而原来只支持B ...

附议!这样即使不能同一套菜单,也不至于混乱了。

xianglang 发表于 2020-11-8 18:17:42

下载了一楼的20201029版本试了下,发现不支持 LZMA 压缩格式、map --mem 不支持 --top 参数。还有,使用 chainloader /bootmgr 提示“cannot load image”,出错信息是“Invalid or unsupported executable format”。使用 chainloader /efi/microsoft/boot/bootmgfw.efi 命令,在输入 boot 后会返回到 grub> 命令行格式。手中有支持传统或/和 EFI 启动的 PE 镜像,没有一个能够启动的。

我是在真机上试的,G5400 CPU + H110主板,BIOS 设置可以双启动,平时默认传统方式启动,测试 G4D 时按 F11 选择 EFI 启动。一个 MBR 格式 120GB SSD 硬盘,分为安装非EFI的WIN7系统分区和工具数据两个区,无 EFI 分区,G4D 识别为 (hd1);另有一个 4TB 机械硬盘,分三个分区,其中第一个分区是 MSR,第二三分区是EFI启动的WIN10系统分区和数据分区,第四个分区是 EFI 分区,G4D识别为 (hd0,3),而 G4D 文件就放在这分区中。


现在感觉连 Windows 都启动不了,一点实用性都没有啊,哪里出错了?

2011yaya2007777 发表于 2020-11-8 18:57:40

现在没有 --top 这个参数。
chainloader 只能加载 .efi 文件,或者光盘,硬盘。
如果你使用 bootmgfw.efi (或者名称不同,但是内容相同)启动的, 则不能再加载它。
发现不支持 LZMA 压缩格式
应当支持,但是我没有测试。

2011yaya2007777 发表于 2020-11-8 19:00:15

本帖最后由 2011yaya2007777 于 2020-11-9 07:59 编辑

W大,我 --mem 使用的是 GRUB_EFI_LOADER_DATA,这个不知道会不会被释放?

对于分配页,分配池,我有些疑惑,不知道他们的区别,什么时候使用哪一个?

wuwuzz 发表于 2020-11-8 20:51:38

xianglang 发表于 2020-11-8 18:17
下载了一楼的20201029版本试了下,发现不支持 LZMA 压缩格式、map --mem 不支持 --top 参数。还有,使用 ch ...

“测试 G4D 时按 F11 选择 EFI 启动”---- 问题可能就出在这里。

yaya的这个版本G4D,我测试的结果,貌似需要纯UEFI环境
(BIOS/UEFI设置里---选择UEFI OS/关闭安全启动/关闭CSM)。
按Fn键从快捷启动菜单中选UEFI是不行的,那样选择的话,
G4D会直接进入命令行状态。

wuwuzz 发表于 2020-11-8 21:09:29

本帖最后由 wuwuzz 于 2020-11-8 21:10 编辑

一个小插曲,关于CHS。

我认为,CHS不可或缺。从流出的BIOS/UEFI源代码来看:

在BIOS下
即使引导软件不用CHS,不代表BIOS不用。BIOS在U盘枚举时,(尚未进入引导阶段时),
即开始计算U盘逻辑CHS参数(并计算完毕),等待调用(例如等待用户调用INT 13 Fn8)。

在UEFI下,参见
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=421614

===========
关于windows,记得很久以前,MS的知识库里,谈到NT处理MBR时,有关于
CHS处理方面的内容,时间久远,记不太清了。但有一点,我记得清楚,
实在搞不定硬盘CHS的准确性时,终极办法就是以物理(固件)CHS为基准。

U盘也是同样的道理,BIOS/UEFI计算的基础,就是U盘物理(固件)CHS。

sunsea 发表于 2020-11-9 01:14:08

wuwuzz 发表于 2020-11-8 21:09
一个小插曲,关于CHS。

我认为,CHS不可或缺。从流出的BIOS/UEFI源代码来看:


很好奇一个问题,保留CHS除了兼容旧软件之外的意义在哪里?难道有固件或者软件到现在了线性寻址也给不出正确结果?

wuwuzz 发表于 2020-11-9 09:23:48

本帖最后由 wuwuzz 于 2020-11-9 09:26 编辑

sunsea 发表于 2020-11-9 01:14
很好奇一个问题,保留CHS除了兼容旧软件之外的意义在哪里?难道有固件或者软件到现在了线性寻址也给不出 ...
是的,兼容老标准这个原因是确定无疑的。只要INT13还在,CHS就如影相随。
从代码上看,到了UEFI,似乎也没能把CHS完全剔除掉,历史的遗产(包袱)
太多了。

sunsea 发表于 2020-11-9 09:41:59

wuwuzz 发表于 2020-11-9 09:23
是的,兼容老标准这个原因是确定无疑的。只要INT13还在,CHS就如影相随。
从代码上看,到了UEFI,似乎也 ...

可还行……那为什么不统一H255S63然后内部转成线性地址呢……还是有老的/不规范固件给不出正确结果还是咋滴……
页: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19
查看完整版本: GRUB4DOS for UEFI