确定当前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 变量为空。
上几个图:
可能不行吧{:1_186:} 这难道不能? 不可能,启动工具五花八门,各自都有自己的黑科技。 现在网上的PE有很多,很难准确定位的 理论上可以 因为启动之后可以移除启动盘,所以wim文件是不是没法强关联?那是不是只能搞小动作来确定了?
我不知道楼主这么做的目的是啥,如果只是判断是启动了哪一个wim,是不是可以换不同的sdi来判断? 有些外置 程序与 启动 boot.wim 并列放置,也可以把必要的 配置文件 与之并列放置,如果能明确找到boot.wim 的位置,在pe启动时 调取外部设置或者外置资源就相对准确和容易一些。不用 forx 搜索。维护pe 也更容易一些。 本帖最后由 610644034 于 2022-11-3 07:57 编辑
可以,注册表里面有卷浩和文件路径及文件名。但是如果是移动盘,后面你知道的:找不到卷和文件。
给你一个方法: 直接pe系统里面注册表搜索 boot.wim , 然后你会发现在你的目的在哪里!
610644034 发表于 2022-11-3 07:52
可以,注册表里面有卷浩和文件路径及文件名。但是如果是移动盘,后面你知道的:找不到卷和文件。
给你一个 ...
你这也是个办法,我去研究下 用 dism 能不能获取呢? USBOS 比较生硬地解决办法是:每次创建boot.wim前,生成一个20-30位随机字符串,把这个字符串做文件名的0字节文件(指纹文件)放到打包前boot目录内(boot.wim内部,对应启动后在X:分区某指定位置)、外(随同外置程序所在区)各一份,PECMD 启动时从X:\指定位置提取指纹文件名,在含可见区、ud、高端隐藏区等各分区搜索同名文件,所得分区就是外置程序所在分区。 正常情况下读取注册表
cmd 下运行
reg query HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control /v SystemStartOptions
可以获得。
具体分区 转换为 盘符或者 volumn 表达方式,需要 pecmd调用 api 实现。
chiannet 发表于 2022-11-3 11:23
USBOS 比较生硬地解决办法是:每次创建boot.wim前,生成一个20-30位随机字符串,把这个字符串做文件名的0字 ...
不知道那些 特殊分区或者特殊启动的boot.wim 能否通过注册表方式找到。 答案 在一楼,
通常情况下 是 能够解决的。 本帖最后由 dos时代菜鸟 于 2022-11-3 21:15 编辑
鼓捣出个 支持 vhd 和 wimboot+vhd 的,需要 dism 支持。
也不知道 特殊情况下 能不能识别。
以后可以考虑的设计:
如果 wim 路径有效,只是 没有分配盘符,可以考虑 用 pecmd 给分一个
目前看,还是先解决获取信息准确度的问题。
如果这个 具有一定的通用性,那么 pe 的 wim 里的配置文件就都可以外移出去,方便各种启动配置和维护。 dos时代菜鸟 发表于 2022-11-3 21:09
如果这个 具有一定的通用性,那么 pe 的 wim 里的配置文件就都可以外移出去,方便各种启动配置和维护。
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1
527104427 发表于 2022-11-3 21:28
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1
嗯嗯,看来还需要考虑 不是硬盘卷的情况。 527104427 发表于 2022-11-3 21:28
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1
有啥办法 把 它转为 pecmd 的 part 命令能用的格式么? 527104427 发表于 2022-11-3 21:28
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1
我这边 multi(0)disk(0)cdrom(0) 是cdrom2 dos时代菜鸟 发表于 2022-11-3 22:16
有啥办法 把 它转为 pecmd 的 part 命令能用的格式么?
我也不会编程,会的话就可以搞搞。
论坛也有几个会编程的,但又不屑玩PECMD,呵呵。 527104427 发表于 2022-11-3 23:00
我也不会编程,会的话就可以搞搞。
论坛也有几个会编程的,但又不屑玩PECMD,呵呵。
发现 pecmd 给 cdrom0~n 赋予 盘符时, %cdrom0% 盘符 对应上了 multi(0)disk(0)cdrom(0),不知道是否巧合 527104427 发表于 2022-11-3 23:00
我也不会编程,会的话就可以搞搞。
论坛也有几个会编程的,但又不屑玩PECMD,呵呵。
"ENVI *"(省略名称和值)表示将光驱的盘符以CDROM0、CDROM、CDROM1、CDROM2 等写入系统环境变量。 dos时代菜鸟 发表于 2022-11-3 23:10
发现 pecmd 给 cdrom0~n 赋予 盘符时, %cdrom0% 盘符 对应上了 multi(0)disk(0)cdrom(0),不知道是否巧 ...
原则上是对应的,但注册表的符号链接不按常理出牌,这就不对应了 读启动项位置,除了虚拟盘不好判断,其它都OK的吧,第三方引导的要费点劲 527104427 发表于 2022-11-3 23:28
原则上是对应的,但注册表的符号链接不按常理出牌,这就不对应了
可能也许或者是把启动设备都认为是编号0 本帖最后由 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: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: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是虚的,只是为了分配盘符