dos时代菜鸟 发表于 2022-11-2 19:08:23

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

本帖最后由 dos时代菜鸟 于 2022-11-7 08:28 编辑

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


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

特此鸣谢   D_M_GuYing的辛勤测试


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



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

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

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












2010sya 发表于 2022-11-2 20:05:38

可能不行吧{:1_186:}

winpe168 发表于 2022-11-2 20:05:48

这难道不能?

conlin888 发表于 2022-11-2 20:18:56

不可能,启动工具五花八门,各自都有自己的黑科技。

ZMLoveLH 发表于 2022-11-2 22:45:01

现在网上的PE有很多,很难准确定位的

江南一根葱 发表于 2022-11-2 23:05:21

理论上可以

caocaofff 发表于 2022-11-2 23:31:54

因为启动之后可以移除启动盘,所以wim文件是不是没法强关联?那是不是只能搞小动作来确定了?
我不知道楼主这么做的目的是啥,如果只是判断是启动了哪一个wim,是不是可以换不同的sdi来判断?

dos时代菜鸟 发表于 2022-11-3 07:42:44

有些外置 程序与 启动 boot.wim 并列放置,也可以把必要的 配置文件 与之并列放置,如果能明确找到boot.wim 的位置,在pe启动时 调取外部设置或者外置资源就相对准确和容易一些。不用 forx 搜索。维护pe 也更容易一些。

610644034 发表于 2022-11-3 07:52:21

本帖最后由 610644034 于 2022-11-3 07:57 编辑

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

dos时代菜鸟 发表于 2022-11-3 10:47:11

610644034 发表于 2022-11-3 07:52
可以,注册表里面有卷浩和文件路径及文件名。但是如果是移动盘,后面你知道的:找不到卷和文件。
给你一个 ...

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

dos时代菜鸟 发表于 2022-11-3 10:54:51

用 dism 能不能获取呢?

chiannet 发表于 2022-11-3 11:23:03

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

dos时代菜鸟 发表于 2022-11-3 15:48:25

正常情况下读取注册表
cmd 下运行
reg query HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control /v SystemStartOptions

可以获得。

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

dos时代菜鸟 发表于 2022-11-3 16:51:47

chiannet 发表于 2022-11-3 11:23
USBOS 比较生硬地解决办法是:每次创建boot.wim前,生成一个20-30位随机字符串,把这个字符串做文件名的0字 ...

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

dos时代菜鸟 发表于 2022-11-3 18:51:23

答案 在一楼,
通常情况下 是 能够解决的。

dos时代菜鸟 发表于 2022-11-3 20:57:33

本帖最后由 dos时代菜鸟 于 2022-11-3 21:15 编辑

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


以后可以考虑的设计:

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


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

dos时代菜鸟 发表于 2022-11-3 21:09:47

如果这个 具有一定的通用性,那么 pe 的 wim 里的配置文件就都可以外移出去,方便各种启动配置和维护。

527104427 发表于 2022-11-3 21:28:50

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

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

dos时代菜鸟 发表于 2022-11-3 21:42:32

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

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

dos时代菜鸟 发表于 2022-11-3 22:16:31

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

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

dos时代菜鸟 发表于 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

527104427 发表于 2022-11-3 23:00:27

dos时代菜鸟 发表于 2022-11-3 22:16
有啥办法 把 它转为 pecmd 的 part 命令能用的格式么?

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

dos时代菜鸟 发表于 2022-11-3 23:10:50

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

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

dos时代菜鸟 发表于 2022-11-3 23:22:58

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

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

527104427 发表于 2022-11-3 23:28:33

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

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

红毛樱木 发表于 2022-11-3 23:51:04

读启动项位置,除了虚拟盘不好判断,其它都OK的吧,第三方引导的要费点劲

红毛樱木 发表于 2022-11-4 04:01:00

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

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

D_M_GuYing 发表于 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=OPTINPAEMININTFVEBOOT=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)


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

D_M_GuYing 发表于 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是虚的,只是为了分配盘符
页: [1] 2 3 4 5 6
查看完整版本: 确定当前pe 对应的 boot.wim 位置,基本解决