无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 14398|回复: 155
打印 上一主题 下一主题

[发布] 确定当前pe 对应的 boot.wim 位置,基本解决

  [复制链接]
跳转到指定楼层
1#
发表于 2022-11-2 19:08:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dos时代菜鸟 于 2022-11-7 08:28 编辑

如题,有啥办法能 获取到 当前 pe 是启动的 哪个位置的 哪一个 boot.wim ?


弄了个 pecmd 的脚本,用 pecmd.exe load 这个脚本,在pe下就能获取 到了,当然,一些特殊情况 可能还需要进一步测试,或许 无解。

特此鸣谢   D_M_GuYing  的辛勤测试


原理是读取 注册表 HKLM\SYSTEM\CurrentControlSet\Control\SystemStartOptions 的键值并通过 api 将其变成 人能看懂的 路径。

boot.wim.Path-2.81.7z (939.74 KB, 下载次数: 50)

为了避免 未分配盘符,可以 先运行盘符理顺脚本,把win 能识别的卷 统统挂载。

针对 cdrom 的情况,只能考虑 在多个 光驱中 按照boot.wim 的路径去找,找到的,就认定为是目标,此时如果有多个结果,取最后一个。一般情况下,光驱用的很少,大多是虚拟光驱启动pe ,光驱序列里面不会有两个一样的光盘内容,如果是一样的,也就无所谓选择哪一个了。

支持 vhd 的情况  
//优先采纳 wim 路径,vhd 路径次之。如果 都不具备搜索条件,out_path 变量为空。
上几个图:













2#
发表于 2022-11-2 20:05:38 | 只看该作者
可能不行吧
回复

使用道具 举报

3#
发表于 2022-11-2 20:05:48 | 只看该作者
这难道不能?
回复

使用道具 举报

4#
发表于 2022-11-2 20:18:56 | 只看该作者
不可能,启动工具五花八门,各自都有自己的黑科技。
回复

使用道具 举报

5#
发表于 2022-11-2 22:45:01 | 只看该作者
现在网上的PE有很多,很难准确定位的
回复

使用道具 举报

6#
发表于 2022-11-2 23:05:21 来自手机 | 只看该作者
理论上可以
回复

使用道具 举报

7#
发表于 2022-11-2 23:31:54 | 只看该作者
因为启动之后可以移除启动盘,所以wim文件是不是没法强关联?那是不是只能搞小动作来确定了?
我不知道楼主这么做的目的是啥,如果只是判断是启动了哪一个wim,是不是可以换不同的sdi来判断?
回复

使用道具 举报

8#
 楼主| 发表于 2022-11-3 07:42:44 | 只看该作者
有些外置 程序与 启动 boot.wim 并列放置,也可以把必要的 配置文件 与之并列放置,如果能明确找到  boot.wim 的位置,在pe启动时 调取外部设置或者外置资源就相对准确和容易一些。不用 forx 搜索。维护pe 也更容易一些。
回复

使用道具 举报

9#
发表于 2022-11-3 07:52:21 | 只看该作者
本帖最后由 610644034 于 2022-11-3 07:57 编辑

可以,注册表里面有卷浩和文件路径及文件名。但是如果是移动盘,后面你知道的:找不到卷和文件。
给你一个方法: 直接pe系统里面注册表搜索 boot.wim , 然后你会发现在你的目的在哪里!

点评

你这也是个办法,我去研究下  详情 回复 发表于 2022-11-3 10:47
回复

使用道具 举报

10#
 楼主| 发表于 2022-11-3 10:47:11 来自手机 | 只看该作者
610644034 发表于 2022-11-3 07:52
可以,注册表里面有卷浩和文件路径及文件名。但是如果是移动盘,后面你知道的:找不到卷和文件。
给你一个 ...

你这也是个办法,我去研究下
回复

使用道具 举报

11#
 楼主| 发表于 2022-11-3 10:54:51 来自手机 | 只看该作者
用 dism 能不能获取呢?
回复

使用道具 举报

12#
发表于 2022-11-3 11:23:03 | 只看该作者
USBOS 比较生硬地解决办法是:每次创建boot.wim前,生成一个20-30位随机字符串,把这个字符串做文件名的0字节文件(指纹文件)放到打包前boot目录内(boot.wim内部,对应启动后在X:分区某指定位置)、外(随同外置程序所在区)各一份,PECMD 启动时从X:\指定位置提取指纹文件名,在含可见区、ud、高端隐藏区等各分区搜索同名文件,所得分区就是外置程序所在分区。

点评

不知道那些 特殊分区或者特殊启动的boot.wim 能否通过注册表方式找到。  详情 回复 发表于 2022-11-3 16:51
回复

使用道具 举报

13#
 楼主| 发表于 2022-11-3 15:48:25 | 只看该作者
正常情况下读取注册表
cmd 下运行
reg query HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control /v SystemStartOptions

可以获得。

具体分区 转换为 盘符或者 volumn 表达方式,需要 pecmd调用 api 实现。
回复

使用道具 举报

14#
 楼主| 发表于 2022-11-3 16:51:47 来自手机 | 只看该作者
chiannet 发表于 2022-11-3 11:23
USBOS 比较生硬地解决办法是:每次创建boot.wim前,生成一个20-30位随机字符串,把这个字符串做文件名的0字 ...

不知道那些 特殊分区或者特殊启动的boot.wim 能否通过注册表方式找到。
回复

使用道具 举报

15#
 楼主| 发表于 2022-11-3 18:51:23 | 只看该作者
答案 在一楼,
通常情况下 是 能够解决的。
回复

使用道具 举报

16#
 楼主| 发表于 2022-11-3 20:57:33 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-11-3 21:15 编辑

鼓捣出个 支持 vhd 和 wimboot+vhd 的,需要 dism 支持。
也不知道 特殊情况下 能不能识别。


以后可以考虑的设计:

如果 wim 路径有效,只是 没有分配盘符,可以考虑 用 pecmd 给分一个


目前看,还是先解决获取信息准确度的问题。

回复

使用道具 举报

17#
 楼主| 发表于 2022-11-3 21:09:47 | 只看该作者
如果这个 具有一定的通用性,那么 pe 的 wim 里的配置文件就都可以外移出去,方便各种启动配置和维护。

点评

wim位于CDROM就不行。 实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1  详情 回复 发表于 2022-11-3 21:28
回复

使用道具 举报

18#
发表于 2022-11-3 21:28:50 | 只看该作者
dos时代菜鸟 发表于 2022-11-3 21:09
如果这个 具有一定的通用性,那么 pe 的 wim 里的配置文件就都可以外移出去,方便各种启动配置和维护。

wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1

点评

我这边 multi(0)disk(0)cdrom(0) 是cdrom2  详情 回复 发表于 2022-11-3 22:43
有啥办法 把 它转为 pecmd 的 part 命令能用的格式么?  详情 回复 发表于 2022-11-3 22:16
嗯嗯,看来还需要考虑 不是硬盘卷的情况。  详情 回复 发表于 2022-11-3 21:42
回复

使用道具 举报

19#
 楼主| 发表于 2022-11-3 21:42:32 来自手机 | 只看该作者
527104427 发表于 2022-11-3 21:28
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1

嗯嗯,看来还需要考虑 不是硬盘卷的情况。
回复

使用道具 举报

20#
 楼主| 发表于 2022-11-3 22:16:31 来自手机 | 只看该作者
527104427 发表于 2022-11-3 21:28
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1

有啥办法 把 它转为 pecmd 的 part 命令能用的格式么?

点评

我也不会编程,会的话就可以搞搞。 论坛也有几个会编程的,但又不屑玩PECMD,呵呵。  详情 回复 发表于 2022-11-3 23:00
回复

使用道具 举报

21#
 楼主| 发表于 2022-11-3 22:43:35 | 只看该作者
527104427 发表于 2022-11-3 21:28
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1

我这边 multi(0)disk(0)cdrom(0) 是cdrom2
回复

使用道具 举报

22#
发表于 2022-11-3 23:00:27 | 只看该作者
dos时代菜鸟 发表于 2022-11-3 22:16
有啥办法 把 它转为 pecmd 的 part 命令能用的格式么?

我也不会编程,会的话就可以搞搞。
论坛也有几个会编程的,但又不屑玩PECMD,呵呵。

点评

"ENVI *"(省略名称和值)表示将光驱的盘符以CDROM0、CDROM、CDROM1、CDROM2 等写入系统环境变量。  详情 回复 发表于 2022-11-3 23:22
发现 pecmd 给 cdrom0~n 赋予 盘符时, %cdrom0% 盘符 对应上了 multi(0)disk(0)cdrom(0),不知道是否巧合  详情 回复 发表于 2022-11-3 23:10
回复

使用道具 举报

23#
 楼主| 发表于 2022-11-3 23:10:50 | 只看该作者
527104427 发表于 2022-11-3 23:00
我也不会编程,会的话就可以搞搞。
论坛也有几个会编程的,但又不屑玩PECMD,呵呵。

发现 pecmd 给 cdrom0~n 赋予 盘符时, %cdrom0% 盘符 对应上了 multi(0)disk(0)cdrom(0),不知道是否巧合

点评

原则上是对应的,但注册表的符号链接不按常理出牌,这就不对应了  详情 回复 发表于 2022-11-3 23:28
回复

使用道具 举报

24#
 楼主| 发表于 2022-11-3 23:22:58 | 只看该作者
527104427 发表于 2022-11-3 23:00
我也不会编程,会的话就可以搞搞。
论坛也有几个会编程的,但又不屑玩PECMD,呵呵。

"ENVI *"(省略名称和值)表示将光驱的盘符以CDROM0、CDROM、CDROM1、CDROM2 等写入系统环境变量。
回复

使用道具 举报

25#
发表于 2022-11-3 23:28:33 | 只看该作者
dos时代菜鸟 发表于 2022-11-3 23:10
发现 pecmd 给 cdrom0~n 赋予 盘符时, %cdrom0% 盘符 对应上了 multi(0)disk(0)cdrom(0),不知道是否巧 ...

原则上是对应的,但注册表的符号链接不按常理出牌,这就不对应了

点评

确实 对不上,如果中间变化了,就 不行了。  详情 回复 发表于 2022-11-4 07:17
可能也许或者是把启动设备都认为是编号0  详情 回复 发表于 2022-11-4 04:01
回复

使用道具 举报

26#
发表于 2022-11-3 23:51:04 | 只看该作者
读启动项位置,除了虚拟盘不好判断,其它都OK的吧,第三方引导的要费点劲
回复

使用道具 举报

27#
发表于 2022-11-4 04:01:00 来自手机 | 只看该作者
527104427 发表于 2022-11-3 23:28
原则上是对应的,但注册表的符号链接不按常理出牌,这就不对应了

可能也许或者是把启动设备都认为是编号0

点评

IFEX %wzPath%,! { MOUN !\WEPE\WEPE.INI,X:\a,1 FILE X:\a FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath% } 如果所有要目录只存在一个WEPE\WEPE.INI 这个感觉最靠谱, 搜索所有分区包括  详情 回复 发表于 2022-11-4 05:01
{ CALL getNoDrv DISK %nodrv%,%RDISK%,2,1 ENVI wzPath=%nodrv%\WEPE\WEPE.INI } 这一段,是用UltraISO隐藏写入U盘,实机启动后,得出来的,硬套了上去  详情 回复 发表于 2022-11-4 04:46
回复

使用道具 举报

28#
发表于 2022-11-4 04:37:46 | 只看该作者
本帖最后由 D_M_GuYing 于 2022-11-4 05:56 编辑

VM下,测试,光驱启动,我的C盘下,并没有WEPE.WIM,文件在ESP分区里

我也在试图解决这个问题,不过我的功底和你没法儿比,只是用最笨的方法,读取注册表后,最笨的方法得到硬盘的信息,例如

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control
    SystemStartOptions    REG_SZ     NOEXECUTE=OPTIN  PAE  MININT  FVEBOOT=2658304 RDIMAGEOFFSET=8192 RDIMAGELENGTH=971264 RDPATH=MULTI(0)DISK(0)RDISK(0)PARTITION(1)\WEPE\WEPE64.WIM

然后,用DISK参数,把DISK(0)RDISK(0)PARTITION(1)卸载再分配盘符,以达到分配隐藏分区的目的,定位后挂载外置
这是我PE下的代码,在你面前班门弄斧,实在是浅显,不要笑话我。只是想提个思路,期待完美解决这个问题



PECMD.INI中的代码
--------------------------------------------------------------------
//查找并分配外置所在的隐藏分区
IFEX %ProgramFiles%\WEPE.INI,ENVI wzPath=%ProgramFiles%\WEPE.INI!CALL FINDFZ
FDIR wimPath=%wzPath%

_SUB FINDFZ
EXEC =!CMD /C REG QUERY HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ /v SystemStartOptions > %temp%\1.TXT
EXEC =!"%ProgramFiles%\SYS\disk.cmd"

IFEX %temp%\3.INI,
{
    LOAD %temp%\3.INI
    DISK ,%RDISK%,%PARTITION%,1
    CALL getNoDrv
    DISK  %nodrv%,%RDISK%,%PARTITION%,1
    ENVI wzPath=%nodrv%\WEPE\WEPE.INI
    IFEX %wzPath%,!
    {
        CALL getNoDrv
        DISK %nodrv%,%RDISK%,2,1
        ENVI wzPath=%nodrv%\WEPE\WEPE.INI
    }
}
IFEX %wzPath%,!
{
    FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
    ENVI wzPath=%STPATH%\WEPE\WEPE.INI
}
IFEX %wzPath%,!
{
    MOUN !\WEPE\WEPE.INI,X:\a,1
    FILE X:\a
    FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath%
}
_END


_SUB getNoDrv
    ENVI nodrv=
    IFEX W:,!ENVI nodrv=W:
    IFEX V:,!ENVI nodrv=V:
    IFEX U:,!ENVI nodrv=U:
    IFEX T:,!ENVI nodrv=T:
    IFEX S:,!ENVI nodrv=S:
    IFEX R:,!ENVI nodrv=R:
    IFEX Q:,!ENVI nodrv=Q:
    IFEX P:,!ENVI nodrv=P:
    IFEX O:,!ENVI nodrv=O:
    IFEX N:,!ENVI nodrv=N:
    IFEX M:,!ENVI nodrv=M:
    IFEX L:,!ENVI nodrv=L:
    IFEX K:,!ENVI nodrv=K:
    IFEX G:,!ENVI nodrv=G:
    IFEX I:,!ENVI nodrv=I:
    IFEX H:,!ENVI nodrv=H:
    IFEX G:,!ENVI nodrv=G:
    IFEX F:,!ENVI nodrv=F:
    IFEX E:,!ENVI nodrv=E:
    IFEX D:,!ENVI nodrv=D:
    IFEX C:,!ENVI nodrv=C:
_END

=========================================================================
%ProgramFiles%\SYS\disk.cmd中的代码
@echo off&setlocal enabledelayedexpansion
set key=PARTITION(
(for /f "delims=" %%a in (%temp%\1.TXT) do (
   set var=
   set "str=%%a%key%"
   for /l %%b in (1 1 100) do (
      if defined str set str=!str:*%key%=!
      for /f "delims=." %%c in ("!str!") do set var=!var!%%c.
   )
   echo;!var!
))>%temp%\2.TXT
for /f %%i in (%temp%\2.TXT) do (
set str=%%i
set str=!str:~0,1!
echo envi PARTITION=!str! >%temp%\3.INI
)

set key=RDISK(
(for /f "delims=" %%a in (%temp%\1.TXT) do (
   set var=
   set "str=%%a%key%"
   for /l %%b in (1 1 100) do (
      if defined str set str=!str:*%key%=!
      for /f "delims=." %%c in ("!str!") do set var=!var!%%c.
   )
   echo;!var!
))>%temp%\2.TXT
for /f %%i in (%temp%\2.TXT) do (
set str=%%i
set str=!str:~0,1!
echo envi RDISK=!str! >>%temp%\3.INI
)
::pause



很笨也不是很全面的方法,请不要见笑哈【22.11.01】大漠孤鹰Win11PE_x64_APFS(双模启动,可安装到系统、隐藏分区、空硬盘) - PE作品发布区 - 无忧启动论坛 - Powered by Discuz! (wuyou.net)


点评

目前光盘启动 是 会出错,你先试试 boot.wim 在硬盘的情况  详情 回复 发表于 2022-11-4 07:19
multi(0)disk(0)rdisk(0)partition(1) 不一定就是 第一硬盘 第1分区。  详情 回复 发表于 2022-11-4 07:08
回复

使用道具 举报

29#
发表于 2022-11-4 04:46:49 | 只看该作者
本帖最后由 D_M_GuYing 于 2022-11-4 04:48 编辑
红毛樱木 发表于 2022-11-4 04:01
可能也许或者是把启动设备都认为是编号0

   {
        CALL getNoDrv
        DISK %nodrv%,%RDISK%,2,1
        ENVI wzPath=%nodrv%\WEPE\WEPE.INI
    }

这一段,是用UltraISO隐藏写入U盘,实机启动后,得出来的,硬套了上去
记得注册表读取的好像是
RDPATH=MULTI(0)DISK(0)RDISK(2)PARTITION(4)
回复

使用道具 举报

30#
发表于 2022-11-4 05:01:30 | 只看该作者
本帖最后由 D_M_GuYing 于 2022-11-4 05:03 编辑
红毛樱木 发表于 2022-11-4 04:01
可能也许或者是把启动设备都认为是编号0

IFEX %wzPath%,!
{
    MOUN !\WEPE\WEPE.INI,X:\a,1
    FILE X:\a
    FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath%
}

如果所有根目录只存在一个WEPE\WEPE.INI
这个感觉最靠谱,
搜索所有分区包括隐藏分区的指定文件,然后 MOUN 加载并自动分配盘符
X:\a是虚的,只是为了分配盘符
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-17 08:18

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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