无忧启动论坛

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

[原创] 全球首发!【技术实战】在exFAT分区中安装并启动Windows系统

    [复制链接]
871#
发表于 3 天前 | 只看该作者
本帖最后由 ko20010214 于 2024-4-24 12:27 编辑

我的安装环境:
1. Windows版本选择的22H2 V19045,实验版本19041.vb_release.191206-1406 (不忘初心 精简版)
2. Soyo 1T 硬盘 (EXFAT分区(存放VHD(EXFAT格式))+ESP分区) , sumsung 128G (NTFS 分区(存放VHD(NTFS格式)+ESP分区)
3. WinPE 选择的 Kuer的 win10PE (4.21版)
4. 启动模式 选择的 UEFI。(关闭了 安全启动)(2014年的LENOVO电脑,BIOS升级到2021年的)
安装过程:
1. 进PE,用winntsetup将win10.wim安装到NTFS格式的VHD中。
2. 进系统,完成安装。
3. 进PE,挂载VHD,用wimtool进行WIM打包。
4. 把WIM释放到EXFAT分区的VHD(EXFAT格式)
5. 修改BCD,添加启动项,引导EXFAT分区的VHD。
6. 重启,启动EXFAT分区中的VHD(EXFAT)失败。

考虑到:
1. EXFAT驱动问题,可“高版本的64位系统还需要手动替换一次已签名的exFAT驱动(适用于Win8 RTM到Win10 v1909,对于Win10 v2004及更高版本的系统则不再需要替换驱动)” ,对于22H2(19045)应该是原生支持EXFAT启动“最新的Windows 10 1903版本已经能够原生支持从FAT/exFAT分区中挂载VHD/VHDX虚拟磁盘文件”,而且楼主提供的EXFAT驱动包里也没有高于 v18362的版本。
2. 考虑到 EXFAT驱动加载顺序的问题,可这不是WIN10PE而是windows10, 没有看到过要调整EXFAT驱动顺序……
3. 难道是启动模式的问题? 不要选择UEFI,要选择Legacy引导?

请楼主指点一下。
另外,我也用过坏坏小生提供的三杰版win10, 版本号为V1607(14393),用EXFAT驱动包里的对应的14393的驱动替换后也启动失败。



Oh,shit!
It Works!




我只是进入BIOS 更改了一项 : 由只引导UEFI 改成了 legacy 优先。
因为我本想看看重启时进 Legacy 引导 看看能不能启动。
但是并没有这么简单。我在ESP分区的BOOT目录下编辑了BCD,添加了启动项目,似乎没有效果,我在Legacy启动时还是没办法看到启动菜单,
然后它跳到了UEFI引导下的启动菜单,然后我选择了 启动win10 (exfat vhd uefi), 然后 没有报错,有了启动画面,就是那个lenovo图标,但下面没有转圈圈? (因为慢??),我出去转了一下,大概两三分钟,回来看到已经启动到桌面了,具体用了多少时间也不太清楚。待会重启一遍试试。
OK。已经是EXFAT格式下的Win10了!
40多秒的时候出现LOGO, 3分15秒完成启动到桌面。

坏坏小生提供的三杰版win10, 版本号为V1607(14393)的替换驱动到windows\system32\drivers里,启动后蓝屏。
VHD_BOOT_Inintialization_Failed.
朱版已经说了:
“VHD(X)模式与传统模式的安装过程大致相同,但要注意选择的系统必须使用Win10 v1809以上版本。”
坏坏小生提供的三杰版win10, 版本号为V1607(14393)不符合要求。
但为啥EXFAT驱动包里有对应这个版本的驱动呢

点评

你理解错了,替换已签名的exFAT驱动是用来解决老版本系统启动时间过长的问题,跟能否支持VHD(X)启动没有任何关系,这是两码事。 另外正常情况下Legacy和UEFI都是可以启动系统的,如果只有其中一个能启动那你就得去  详情 回复 发表于 3 天前
回复

使用道具 举报

872#
 楼主| 发表于 3 天前 | 只看该作者
ko20010214 发表于 2024-4-24 07:04
我的安装环境:
1. Windows版本选择的22H2 V19045,实验版本19041.vb_release.191206-1406 (不忘初心 精简 ...

你理解错了,替换已签名的exFAT驱动是用来解决老版本系统启动时间过长的问题,跟能否支持VHD(X)启动没有任何关系,这是两码事。
另外正常情况下Legacy和UEFI都是可以启动系统的,如果只有其中一个能启动那你就得去检查一下自己的分区和引导设置是否有问题了。

点评

GTP格式的硬盘(前面一个EXFAT分区,后面一个EFI分区(FAT32)),EFI分区里有boot 目录及BCD文件,根目录下有 bootmgr , 能用Legacy启动系统吗? 我用winntsetup 查看 EFI分区时,只显示 EFI PART 是绿色的。  详情 回复 发表于 前天 07:33
回复

使用道具 举报

873#
发表于 前天 07:33 | 只看该作者
本帖最后由 ko20010214 于 2024-4-26 23:35 编辑
朱玛12345678 发表于 2024-4-24 18:43
你理解错了,替换已签名的exFAT驱动是用来解决老版本系统启动时间过长的问题,跟能否支持VHD(X)启动没有 ...

GPT格式的硬盘(前面一个EXFAT分区,后面一个EFI分区(FAT32)),EFI分区里有boot 目录及BCD文件,根目录下有 bootmgr  ,  能用Legacy启动系统吗?
我用winntsetup 查看 EFI分区时,只显示 EFI PART 是绿色的。
用bootice查看硬盘时,主引导分区是空白的,没装任何引导程序…… 两个分区的引导记录都是BOOTMGR。

请问一下如何才能 用Legacy方式启动这块硬盘。 是要重建MBR吗? GPT格式硬盘有这玩意吗?

点评

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=415995&mobile=no  详情 回复 发表于 前天 14:14
回复

使用道具 举报

874#
 楼主| 发表于 前天 14:14 | 只看该作者
ko20010214 发表于 2024-4-25 07:33
GTP格式的硬盘(前面一个EXFAT分区,后面一个EFI分区(FAT32)),EFI分区里有boot 目录及BCD文件,根目 ...

http://bbs.wuyou.net/forum.php?m ... 15995&mobile=no

点评

文章已拜读。方法很巧妙,不过得要两块硬盘…… 有没有可以直接搞定的?通过编辑扇区的方法?  详情 回复 发表于 前天 22:01
回复

使用道具 举报

875#
发表于 前天 22:01 | 只看该作者
朱玛12345678 发表于 2024-4-25 14:14
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=415995&mobile=no

文章已拜读。方法很巧妙,不过得要两块硬盘……
有没有可以直接搞定的?通过编辑扇区的方法?

点评

http://chenall.net/post/grub4dos_umbr  详情 回复 发表于 前天 22:22
回复

使用道具 举报

876#
 楼主| 发表于 前天 22:22 | 只看该作者
ko20010214 发表于 2024-4-25 22:01
文章已拜读。方法很巧妙,不过得要两块硬盘……
有没有可以直接搞定的?通过编辑扇区的方法?

http://chenall.net/post/grub4dos_umbr
回复

使用道具 举报

877#
发表于 昨天 01:34 | 只看该作者
磁盘地址数据包 Disk Address Packet (DAP)
    DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾
越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念.
    DAP 的结构如下:

    struct DiskAddressPacket
    {
        BYTE PacketSize;     // 数据包尺寸(16字节)
        BYTE Reserved;       // ==0
        WORD BlockCount;     // 要传输的数据块个数(以扇区为单位)
        DWORD BufferAddr;    // 传输缓冲地址(segment:offset)
        QWORD BlockNum;      // 磁盘起始绝对块地址
    };

    PacketSize 保存了 DAP 结构的尺寸, 以便将来对其进行扩充. 在
目前使用的扩展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于
16, 扩展 Int13H 将返回错误码( AH=01, CF=1 ).
    BlockCount 对于输入来说是需要传输的数据块总数, 对于输出来说
是实际传输的数据块个数. BlockCount = 0 表示不传输任何数据块.
    BufferAddr 是传输数据缓冲区的 32 位地址 (段地址:偏移量). 数据
缓冲区必须位于常规内存以内(1M).
    BlockNum 表示的是从磁盘开始算起的绝对块地址(以扇区为单位),
与分区无关. 第一个块地址为 0. 一般来说, BlockNum 与 CHS 地址的关系
是:
    BlockNum = cylinder * NumberOfHeads +
               head * SectorsPerTrack +
               sector - 1;

    其中 cylinder, head, sector 是 CHS 地址, NumberOfHeads 是磁盘
的磁头数, SectorsPerTrack 是磁盘每磁道的扇区数.
    也就是说 BlockNum 是沿着 扇区->磁道->柱面 的顺序记数的. 这一顺
序是由磁盘控制器虚拟的, 磁盘表面数据块的实际排列顺序可能与此不同
(如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序).
回复

使用道具 举报

878#
发表于 昨天 01:36 | 只看该作者
UMBR 相关说明

0x8            4个字节        UMBR标志
0xC            1个字节        UMBR版本号
0x10-0X3F    48个字节    用户定义的启动区
0x40-0X4F    16个字节    保留的启动区(当用户定义的启动都失败时启动的分区)
0x40-0x1B7                启动代码.
启动区说明,目前0x10-0x4F,每一个启动项占用16个字节,为了编程方便使用的是和DiskAddressPacket一样的格式.

    WORD CRC;            //启动项校验
  WORD BlockCount;  // 启动代码块数(以扇区为单位)
  DWORD BufferAddr;  // 传输缓冲地址(segment:offset),也就是启动地址
  QWORD BlockNum;   // 启动代码在磁盘上的位置(LBA)
BufferAddr 的值为0x07c00000(07c0:0000)时固定为PBR引导,启动时会自动修改0x7c1c处的值.其它值直接从该位置启动.

校验方法: 使用的是简单的XOR校验,最多校验127个扇区,按4个字节依次XOR得到的最后结果,再把低16位和高16位进行一次XOR得到最后的结果作为检验值.

具体的校验代码可以参考源码有ASM/C语言两个版本.
回复

使用道具 举报

879#
发表于 昨天 08:19 | 只看该作者
用户定义的启动区 , 这个要手动去定义的话有什么方法吗?
照作者的意思是,在grub4dos环境下,运行umbr,会自动将UMBR启动扇区写入原MBR的位置,然后这四个启动文件的DAP会自动计算出来并写入启动区。
可我没这个环境,要手动计算出我要启动的文件所在的DAP,有公式吗? 源码我看不懂,本来看源码应该能知道怎么算这个DAP的。
回复

使用道具 举报

880#
发表于 昨天 12:39 | 只看该作者
本帖最后由 ko20010214 于 2024-4-26 15:47 编辑

LBA(相对扇区号)方式:以磁盘第一个扇区(0柱面、0磁头、1扇区)作为LBA的0扇区,后面的扇区依次编号


其实这个LBA, 就是傻傻地向后数...
可以在diskgenius里查看.
回复

使用道具 举报

881#
发表于 昨天 21:24 | 只看该作者
如果可以支持Xp的启动就无敌了
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-27 03:16

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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