无忧启动论坛

标题: 确定当前pe 对应的 boot.wim 位置,基本解决 [打印本页]

作者: dos时代菜鸟    时间: 2022-11-2 19:08
标题: 确定当前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 将其变成 人能看懂的 路径。

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

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

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

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














作者: 2010sya    时间: 2022-11-2 20:05
可能不行吧
作者: winpe168    时间: 2022-11-2 20:05
这难道不能?
作者: conlin888    时间: 2022-11-2 20:18
不可能,启动工具五花八门,各自都有自己的黑科技。
作者: ZMLoveLH    时间: 2022-11-2 22:45
现在网上的PE有很多,很难准确定位的
作者: 江南一根葱    时间: 2022-11-2 23:05
理论上可以
作者: caocaofff    时间: 2022-11-2 23:31
因为启动之后可以移除启动盘,所以wim文件是不是没法强关联?那是不是只能搞小动作来确定了?
我不知道楼主这么做的目的是啥,如果只是判断是启动了哪一个wim,是不是可以换不同的sdi来判断?
作者: dos时代菜鸟    时间: 2022-11-3 07:42
有些外置 程序与 启动 boot.wim 并列放置,也可以把必要的 配置文件 与之并列放置,如果能明确找到  boot.wim 的位置,在pe启动时 调取外部设置或者外置资源就相对准确和容易一些。不用 forx 搜索。维护pe 也更容易一些。
作者: 610644034    时间: 2022-11-3 07:52
本帖最后由 610644034 于 2022-11-3 07:57 编辑

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

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

你这也是个办法,我去研究下
作者: dos时代菜鸟    时间: 2022-11-3 10:54
用 dism 能不能获取呢?
作者: chiannet    时间: 2022-11-3 11:23
USBOS 比较生硬地解决办法是:每次创建boot.wim前,生成一个20-30位随机字符串,把这个字符串做文件名的0字节文件(指纹文件)放到打包前boot目录内(boot.wim内部,对应启动后在X:分区某指定位置)、外(随同外置程序所在区)各一份,PECMD 启动时从X:\指定位置提取指纹文件名,在含可见区、ud、高端隐藏区等各分区搜索同名文件,所得分区就是外置程序所在分区。
作者: dos时代菜鸟    时间: 2022-11-3 15:48
正常情况下读取注册表
cmd 下运行
reg query HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control /v SystemStartOptions

可以获得。

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

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

不知道那些 特殊分区或者特殊启动的boot.wim 能否通过注册表方式找到。
作者: dos时代菜鸟    时间: 2022-11-3 18:51
答案 在一楼,
通常情况下 是 能够解决的。
作者: dos时代菜鸟    时间: 2022-11-3 20:57
本帖最后由 dos时代菜鸟 于 2022-11-3 21:15 编辑

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


以后可以考虑的设计:

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


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


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

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

作者: dos时代菜鸟    时间: 2022-11-3 21:42
527104427 发表于 2022-11-3 21:28
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1

嗯嗯,看来还需要考虑 不是硬盘卷的情况。
作者: dos时代菜鸟    时间: 2022-11-3 22:16
527104427 发表于 2022-11-3 21:28
wim位于CDROM就不行。
实测multi(0)disk(0)cdrom(0)有可能对应的是cdrom 1

有啥办法 把 它转为 pecmd 的 part 命令能用的格式么?
作者: dos时代菜鸟    时间: 2022-11-3 22:43
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
dos时代菜鸟 发表于 2022-11-3 22:16
有啥办法 把 它转为 pecmd 的 part 命令能用的格式么?

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

发现 pecmd 给 cdrom0~n 赋予 盘符时, %cdrom0% 盘符 对应上了 multi(0)disk(0)cdrom(0),不知道是否巧合
作者: dos时代菜鸟    时间: 2022-11-3 23:22
527104427 发表于 2022-11-3 23:00
我也不会编程,会的话就可以搞搞。
论坛也有几个会编程的,但又不屑玩PECMD,呵呵。

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

原则上是对应的,但注册表的符号链接不按常理出牌,这就不对应了
作者: 红毛樱木    时间: 2022-11-3 23:51
读启动项位置,除了虚拟盘不好判断,其它都OK的吧,第三方引导的要费点劲
作者: 红毛樱木    时间: 2022-11-4 04:01
527104427 发表于 2022-11-3 23:28
原则上是对应的,但注册表的符号链接不按常理出牌,这就不对应了

可能也许或者是把启动设备都认为是编号0
作者: D_M_GuYing    时间: 2022-11-4 04:37
本帖最后由 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)



作者: D_M_GuYing    时间: 2022-11-4 04:46
本帖最后由 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
本帖最后由 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是虚的,只是为了分配盘符

作者: dos时代菜鸟    时间: 2022-11-4 07:08
本帖最后由 dos时代菜鸟 于 2022-11-4 07:47 编辑
D_M_GuYing 发表于 2022-11-4 04:37
VM下,测试,光驱启动,我的C盘下,并没有WEPE.WIM,文件在ESP分区里

我也在试图解决这个问题,不过我的 ...

multi(0)disk(0)rdisk(0)partition(1)
不一定就是 第一硬盘 第1分区。

RDPATH=MULTI(0)DISK(0)RDISK(2)PARTITION(4)
也不一定是 第2硬盘 的 第4分区。

这个结果 与 pecmd 的 disk /part 指令引用的 硬盘号 和 分区号 不对等,这个 表达是用 ntdll.dll 得出的。



作者: dos时代菜鸟    时间: 2022-11-4 07:17
527104427 发表于 2022-11-3 23:28
原则上是对应的,但注册表的符号链接不按常理出牌,这就不对应了

确实 对不上,如果中间变化了,就 不行了。
作者: dos时代菜鸟    时间: 2022-11-4 07:19
D_M_GuYing 发表于 2022-11-4 04:37
VM下,测试,光驱启动,我的C盘下,并没有WEPE.WIM,文件在ESP分区里

我也在试图解决这个问题,不过我的 ...

目前光盘启动 是 会出错,你先试试 boot.wim 在硬盘的情况
作者: eaphoenix    时间: 2022-11-4 07:46
D_M_GuYing 发表于 2022-11-4 05:01
IFEX %wzPath%,!
{
    MOUN !\WEPE\WEPE.INI,X:\a,1

学习了。
作者: D_M_GuYing    时间: 2022-11-4 08:27
dos时代菜鸟 发表于 2022-11-4 07:19
目前光盘启动 是 会出错,你先试试 boot.wim 在硬盘的情况

实机测试,两块SSD,分别安装PE并启动,无论是否在隐藏分区,我的这段代码都能分配盘符和准确定位,
再多硬盘的情况就没条件测试了
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%,!
    {
作者: dos时代菜鸟    时间: 2022-11-4 09:07
又更新了一下,适用 cdrom 的状态了。
最好 先运行 盘符整理,把没有盘符的win可识别分区都按顺序 分配了盘符。


作者: dos时代菜鸟    时间: 2022-11-4 09:17






作者: dos时代菜鸟    时间: 2022-11-4 09:31
本帖最后由 dos时代菜鸟 于 2022-11-4 09:34 编辑
D_M_GuYing 发表于 2022-11-4 08:27
实机测试,两块SSD,分别安装PE并启动,无论是否在隐藏分区,我的这段代码都能分配盘符和准确定位,
再 ...

是这样理解么? x.7z (454 Bytes, 下载次数: 0)


记得 脚本区 有一个关于 这个理解的讨论,这样理解 会有偏差的。 不是一个 api 生成的 分区表达式,必须 转换下,机械的处理是不可靠的。这样得出的 disk 和 part 不一定真实。



作者: D_M_GuYing    时间: 2022-11-4 09:43
dos时代菜鸟 发表于 2022-11-4 09:31
是这样理解么?

是呀,这就是大家最开始觉得五花八门,不好实现的原因
作者: dos时代菜鸟    时间: 2022-11-4 10:12
D_M_GuYing 发表于 2022-11-4 09:43
是呀,这就是大家最开始觉得五花八门,不好实现的原因

用 pecmd 获取 系统未使用盘符,用 Fdrv -idle 指令就可以。
作者: D_M_GuYing    时间: 2022-11-4 10:24
dos时代菜鸟 发表于 2022-11-4 10:12
用 pecmd 获取 系统未使用盘符,用 Fdrv -idle 指令就可以。

哦,哦,谢谢呀,我写的太笨了
作者: dos时代菜鸟    时间: 2022-11-4 10:31
D_M_GuYing 发表于 2022-11-4 10:24
哦,哦,谢谢呀,我写的太笨了

那个 截取  注册表内容 获取  disk 和 part 的功能,不用 bat ,用 pecmd 也是可以的,看我上面的那个 x.ini

关键是 这样获取的结果 不靠谱。

我是 用之前 脚本版块 5大 的一个pecmd脚本,调用 ntdll.dll 的api 把他转换成 可以由 pecmd 的 disk/part 等命令使用的 格式和 编号。然后,才敢用 disk /part 等指令来操作。至少也要转换成 volumn 这样 dos 下可以用的 卷标识。
作者: D_M_GuYing    时间: 2022-11-4 10:36
dos时代菜鸟 发表于 2022-11-4 10:12
用 pecmd 获取 系统未使用盘符,用 Fdrv -idle 指令就可以。

哎,没吃透PECMD呀,两行就完事的,要我弄了十几行

FDRV *idle nodrv
MSTR s_nodrv=7,2,%nodrv%
作者: dos时代菜鸟    时间: 2022-11-4 12:36
D_M_GuYing 发表于 2022-11-4 10:36
哎,没吃透PECMD呀,两行就完事的,要我弄了十几行

FDRV *idle nodrv

http://bbs.wuyou.net/forum.php?m ... 67&fromuid=1198

这种方法 不靠谱,以前研究过
作者: dos时代菜鸟    时间: 2022-11-4 14:12
原来 pecmd 的part list volume 已经进化。
可以 直接引用 这种路径,获取对应分区信息

part -drv list volume  \ArcName\multi(0)disk(0)rdisk(0)partition(1),&part_info
弄了个 基本上能够满足需求的脚本。放在1楼。如此,精准到 boot.wim 所在位置 调取对应外置就成为可能了

作者: dos时代菜鸟    时间: 2022-11-4 20:18
本帖最后由 dos时代菜鸟 于 2022-11-4 20:21 编辑

如图,在 pe 的 Wim 文件并列放置一个 配置文档,当 pe 启动时,如果能精准定位到 wim 位置,并确定存在 同名 ini 配置文件,就以这个 ini 文件作为启动脚本调用。

如此,给pe 增加一些 设置 就变得容易多了。
这种精准定位 wim 位置,避免了 用 forx 轮巡搜索可能加载了 别的同名外置或者脚本的情况。







作者: dos时代菜鸟    时间: 2022-11-4 21:14
dos时代菜鸟 发表于 2022-11-4 20:18
如图,在 pe 的 Wim 文件并列放置一个 配置文档,当 pe 启动时,如果能精准定位到 wim 位置,并确定存在 同 ...

不同的pe有不同的文件夹位置,有不同的配置文件和外置程序位置,精准定位,更适合pe的维护。
作者: dos时代菜鸟    时间: 2022-11-4 21:15
就算多个pe公用一个文件夹,也还有配置文件可以最补充设置调整。
作者: D_M_GuYing    时间: 2022-11-5 03:46
本帖最后由 D_M_GuYing 于 2022-11-5 06:36 编辑

vm虚拟机下测试新版本boot.wim.drv-2.4
测试PE:【22.11.01】大漠孤鹰Win11PE_x64_APFS
光驱启动定位到了,成功!!
硬盘启动(PE安装到了ESP分区)如图:

运行boot.wim.drv-2.4前



运行后,ESP盘符变为C盘





作者: D_M_GuYing    时间: 2022-11-5 06:31
实机(外星人m15r6)下测试新版本boot.wim.drv-2.4
测试PE:【22.11.01】大漠孤鹰Win11PE_x64_APFS

硬盘启动(PE安装到了ESP分区),ESP分区盘符无变动,但结果和VM虚拟机测试的一样

UltraISO,隐藏启动分区模式写入U盘,运行后如图


作者: dos时代菜鸟    时间: 2022-11-5 07:53
本帖最后由 dos时代菜鸟 于 2022-11-5 08:09 编辑
D_M_GuYing 发表于 2022-11-5 06:31
实机(外星人m15r6)下测试新版本boot.wim.drv-2.4
测试PE:【22.11.01】大漠孤鹰Win11PE_x64_APFS

pecmd2012 是啥版本?估计是还没进化的 pecmd 没有

part -drv list volume  \ArcName\%value1%,&part_info

这种获取硬盘分区的写法。

换成 最新版的再看看呢?

多谢测试

特意下载那个pe 测试,确实 因为 pecmd 版本太低导致。




作者: D_M_GuYing    时间: 2022-11-5 08:24
dos时代菜鸟 发表于 2022-11-5 07:53
pecmd2012 是啥版本?估计是还没进化的 pecmd 没有

part -drv list volume  \ArcName\%value1%,&part ...

嗯,我也细看了下,应该是版本原因,可大部分PE都是这个版本
开始以为 part list cdrom 没问题part -drv list volume也应该没问题呢


作者: dos时代菜鸟    时间: 2022-11-5 08:33
D_M_GuYing 发表于 2022-11-5 08:24
嗯,我也细看了下,应该是版本原因,可大部分PE都是这个版本
开始以为 part list cdrom 没问题part -drv ...

之前也考虑 这个问题,所以把 调用 api 的 脚本放进来了,后来发现 新版 可以直接用,就把那些代码取消了。

另外 ,pecmd 可以简单创建 vhd ,不用调用 diskpart 。

作者: D_M_GuYing    时间: 2022-11-5 08:35
我下了 PECMD2012.1.88.05.94Stable-220825U测试.7z
不行呀,,能否给我你的PECMD.EXE
作者: Yuanshen    时间: 2022-11-5 08:37
应该可以。
作者: D_M_GuYing    时间: 2022-11-5 09:13
{
    MOUN !\WEPE\WEPE.INI,X:\a,1
    FILE X:\a
    FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath%
}

新版本的PECMD.EXE 要是能实现红色部分,那分配盘符的事情就解决了

{
    MOUN MULTI(0)DISK(0)RDISK(0)PARTITION(1)\WEPE\WEPE.INI,X:\a,1
    FILE X:\a
    FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath%
}

作者: dos时代菜鸟    时间: 2022-11-5 09:19
D_M_GuYing 发表于 2022-11-5 09:13
{
    MOUN !\WEPE\WEPE.INI,X:\a,1
    FILE X:\a

如果 不提前运行 分区挂载,而是 即得 即挂载,也是可以的。
几条代码就可以。

从 reg 获取路径 找出 对应 硬盘号和分区号。

挂载的事情 你懂的。
作者: D_M_GuYing    时间: 2022-11-5 09:25
dos时代菜鸟 发表于 2022-11-5 09:19
如果 不提前运行 分区挂载,而是 即得 即挂载,也是可以的。
几条代码就可以。

嗯,,,
你的PECMD.EXE能附件一个不,我下载了好几个都不行
作者: dos时代菜鸟    时间: 2022-11-5 10:00
D_M_GuYing 发表于 2022-11-5 09:25
嗯,,,
你的PECMD.EXE能附件一个不,我下载了好几个都不行

x.7z (939.31 KB, 下载次数: 14)




作者: dos时代菜鸟    时间: 2022-11-5 10:09
D_M_GuYing 发表于 2022-11-5 09:25
嗯,,,
你的PECMD.EXE能附件一个不,我下载了好几个都不行

我通常都是先对所有识别分区分配盘符
作者: D_M_GuYing    时间: 2022-11-5 10:23
本帖最后由 D_M_GuYing 于 2022-11-5 11:23 编辑
dos时代菜鸟 发表于 2022-11-5 10:09
我通常都是先对所有识别分区分配盘符

这个就有点晕了,
新的PECMD.EXE单独运行,,也就是用x.cmd调用文件夹中的正确定位
可把新的PECMD.EXE放到PE内核启动后,调用SYSTEM32中的就又读不出来了,
作者: D_M_GuYing    时间: 2022-11-5 10:51
本帖最后由 D_M_GuYing 于 2022-11-5 10:52 编辑
dos时代菜鸟 发表于 2022-11-5 10:09
我通常都是先对所有识别分区分配盘符

x.cmd 和x.ini放到SYSTEM32文件内,运行x.cmd可定位,可右键加载.INI就不行难到非要.CMD的一下,,如果测试加载.INI还是不行的的话,我就直接在PECMD.INI中调用X.CMD得了

作者: D_M_GuYing    时间: 2022-11-5 11:12
dos时代菜鸟 发表于 2022-11-5 10:00

实机测试
硬盘ESP启动,
x.cmd加载boot.wim.drv-2.4.ini成功定位

UltraISO,隐藏启动分区模式写入U盘,U启后已经以我之前的方式分配了盘符
x.cmd加载boot.wim.drv-2.4.ini




作者: dos时代菜鸟    时间: 2022-11-5 11:18
D_M_GuYing 发表于 2022-11-5 10:23
这个就有点晕了,
新的PECMD.EXE单独运行,,也就是用x.cmd调用文件夹中的正确定位
可把它放到PE内核启 ...

pe自带 pecmd 版本不够
作者: D_M_GuYing    时间: 2022-11-5 11:21
dos时代菜鸟 发表于 2022-11-5 11:18
pe自带 pecmd 版本不够

我已经替换了你给的那个新的PECMD
作者: dos时代菜鸟    时间: 2022-11-5 11:31
D_M_GuYing 发表于 2022-11-5 11:21
我已经替换了你给的那个新的PECMD

把 ini文件 拖动到 高版本 pecmd.exe 上,用高版本pecmd.exe 运行
作者: D_M_GuYing    时间: 2022-11-5 12:00
dos时代菜鸟 发表于 2022-11-5 11:31
把 ini文件 拖动到 高版本 pecmd.exe 上,用高版本pecmd.exe 运行

刚刚找到原因,,是我的原因,
是我安装DISMGUI时,把用右键.ini时PECMD运行指向DISMGUI文件夹内的Pe_cmd.exe了
不好意思哈

但U启测试,完完全全用的是X文件夹下的X.CMD.调用boot.wim.drv-2.4.ini,应该还是U盘相关的代码没完善
作者: D_M_GuYing    时间: 2022-11-5 15:01
弄到了PECMD.INI中了,就差红色的U启部分了,期待完善,我是没这水平,只能笨方法、

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

_SUB FINDFZ
REGI .HKLM\SYSTEM\CurrentControlSet\Control\SystemStartOptions,&sso
forx * %&sso% ,&p0,
{
    envi &&item0=
    mstr &&item0=0,7,%&p0%
    Find $"%&item0%"="RDPATH=" ,
    {
        mstr &p0=8,0,%&p0%
        mstr -delims:\ value1=<1>%&p0%
    }
}
Find $"%value1%"<>"",
{
    sed *ni &str2=0,[()0123456789], ,%value1%
    mstr &type1=<3>%&str2%%
    ifex '%&type1%'='rdisk',
    {
        part -drv list volume  \ArcName\%value1%,&part_info
        ifex '%&part_info%'<>'',
        {  
            mstr &disk,&part,&ltr=<2><3><8>%&part_info%
            Find $"%&ltr%"="",
            {
                fdrv -idlec &drvs=*:
                mstr &drvx=<1>%&drvs%
                disk %&drvx%,%&disk%:%&part%,1
                envi out_path=%drvx%\WEPE
            }!
                {
                    envi out_path=%&ltr%\WEPE
                }
            ENVI wzPath=%out_path%\WEPE.INI
        }
        IFEX %wzPath%,!
        {
            DISK %&drvx%,%RDISK%,2,1
            ENVI wzPath=%&drvx%\WEPE\WEPE.INI
        }
    }!
        {
        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%
}
    EXEC =!CMD /C echo envi wzPath=%wzPath% >%temp%\wzPath.ini
_END


作者: dos时代菜鸟    时间: 2022-11-5 15:40
D_M_GuYing 发表于 2022-11-5 15:01
弄到了PECMD.INI中了,就差红色的U启部分了,期待完善,我是没这水平,只能笨方法、

//查找并分配外置所 ...



更新了一下,放到 1楼




作者: D_M_GuYing    时间: 2022-11-5 16:42
dos时代菜鸟 发表于 2022-11-5 15:40
更新了一下,放到 1楼

u启还是不成,
不过,你的diskpart外壳 2022.03.23 ver:1.27可以正确读出U盘信息
要不从这方面着手试试
作者: dos时代菜鸟    时间: 2022-11-5 16:53
D_M_GuYing 发表于 2022-11-5 16:42
u启还是不成,
不过,你的diskpart外壳 2022.03.23 ver:1.27可以正确读出U盘信息
要不从这方面着手试试

u启,是个啥启动结构?
把u盘量产成光盘了?格式化模拟了?还是 boot.wim 放在u盘,用启动器通过 ntload 之类的启动的?

看下运行结果,才行。如果 reg 信息有,同时那个分区确实能够别 win 识别,就能够 挂载盘符,或者 你用个diskpart 分配个盘符,在试试呗。diskpart 识别出的分区是个啥情况?
作者: dos时代菜鸟    时间: 2022-11-5 17:17
本帖最后由 dos时代菜鸟 于 2022-11-5 17:33 编辑
D_M_GuYing 发表于 2022-11-5 15:01
弄到了PECMD.INI中了,就差红色的U启部分了,期待完善,我是没这水平,只能笨方法、

//查找并分配外置所 ...

-------------------------------------------------------------------------
_SUB FINDFZ
REGI .HKLM\SYSTEM\CurrentControlSet\Control\SystemStartOptions,&sso   //读取特定注册表位置

//循环找出注册表键值中各个以空格分隔的内容,如果有一段内容的前7个字符是 RDPATH= ,就获取该段信息中第八个字符后到第一个 “\”之前的部分,作为分区表达式存入变量 value1
forx * %&sso% ,&p0,  
{
    envi &&item0=
    mstr &&item0=0,7,%&p0%
    Find $"%&item0%"="RDPATH=" ,
    {
        mstr &p0=8,0,%&p0%
        mstr -delims:\ value1=<1>%&p0%
    }
}


Find $"%value1%"<>"",  //如果 value1 由内容
{
   //去除 value1 中 ()0123456789 这些字符后,取第三个单词
    sed *ni &str2=0,[()0123456789], ,%value1%
    mstr &type1=<3>%&str2%%
   // 如果 value1 的第三个单词 是 rdisk ,就尝试获取 value1 所代表的分区的信息
   ifex '%&type1%'='rdisk',
    {
       //获取 value1 所表达的分区的 信息
        part -drv list volume  \ArcName\%value1%,&part_info

        ifex '%&part_info%'<>'',  //如果获取到 value1 所表达的分区的信息  存入变量 &part_info
        {  
           //取 &part_info 的第2,3,8  三个单词,分别表示 这个分区 当前的 硬盘号,分区号,盘符
            mstr &disk,&part,&1ltr=<2><3><8>%&part_info%

            //如果 这个分区没有盘符,就找出当前第一个空闲盘符 挂载之,
           //并 把 "盘符:\wepe" 赋值给变量 out_path
            Find $"%&1ltr%"="",  
            {
                fdrv -idlec &drvs=*:
                mstr &drvx=<1>%&drvs%
                disk %&drvx%,%&disk%,%&part%,1
                envi out_path=%&drvx%\WEPE
            }!
            {
                envi out_path=%&1ltr%\WEPE
            }
            //赋值 wzpath内容 为 "盘符:\wepe\wepe.ini" 这个应该是个配置文件
            ENVI wzPath=%out_path%\WEPE.INI
        }
        //////////以下内容是何意?
        IFEX %wzPath%,!
        {
            DISK %&drvx%,%RDISK%,2,1
            ENVI wzPath=%&drvx%\WEPE\WEPE.INI
        }
       ///////////////////////////
    }!
    {  //如果通过注册表 不能定位配置文件 就运行 某个批处理搜索找到 配置文件。
        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%
}
    EXEC =!CMD /C echo envi wzPath=%wzPath% >%temp%\wzPath.ini
_END
------------------------------------------------------------------------------------------------------------

红色部分,不明何意,蓝色部分,注意把   : 改成   , 试试

如下紫色部分 注意包括  }!
}!
    {  //如果通过注册表 不能定位配置文件 就运行 某个批处理搜索找到 配置文件。
        FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
        ENVI wzPath=%STPATH%\WEPE\WEPE.INI
    }  
改成:


}
ifex [! %wzPath%   |  '%wzPath%'=''],
{  //如果通过注册表 不能定位配置文件 ,或者定位的配置文件不存在,就运行 某个批处理搜索找到 配置文件。
        FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
        ENVI wzPath=%STPATH%\WEPE\WEPE.INI
}  


作者: D_M_GuYing    时间: 2022-11-5 17:33
dos时代菜鸟 发表于 2022-11-5 17:17
-------------------------------------------------------------------------
_SUB FINDFZ
REGI .HKLM ...

        IFEX %wzPath%,!
        {
            DISK %&drvx%,%RDISK%,2,1
            ENVI wzPath=%&drvx%\WEPE\WEPE.INI
        }

就是我U启时分配盘符的笨方法,
注册表找到是 DISK %&drvx%,2,4,1挂不上,
实际上是  DISK %&drvx%,2,2,1
作者: dos时代菜鸟    时间: 2022-11-5 17:36
D_M_GuYing 发表于 2022-11-5 17:33
IFEX %wzPath%,!
        {
            DISK %&drvx%,%RDISK%,2,1

把红色部分删了

如下紫色部分 注意包括  }!
}!
    {  //如果通过注册表 不能定位配置文件 就运行 某个批处理搜索找到 配置文件。
        FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
        ENVI wzPath=%STPATH%\WEPE\WEPE.INI
    }  



改成:



}
ifex [! %wzPath%   |  '%wzPath%'=''],
{  //如果通过注册表 不能定位配置文件 ,或者定位的配置文件不存在,就运行 某个批处理搜索找到 配置文件。
        FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
        ENVI wzPath=%STPATH%\WEPE\WEPE.INI
}

作者: dos时代菜鸟    时间: 2022-11-5 17:38
D_M_GuYing 发表于 2022-11-5 17:33
IFEX %wzPath%,!
        {
            DISK %&drvx%,%RDISK%,2,1

你说的那个pecmd 识别为 disk=2 part=4 的分区,diskpart 识别为什么了?
难道你的u盘分区 不规范?
作者: D_M_GuYing    时间: 2022-11-5 17:42
dos时代菜鸟 发表于 2022-11-5 16:53
u启,是个啥启动结构?
把u盘量产成光盘了?格式化模拟了?还是 boot.wim 放在u盘,用启动器通过 ntload ...

用UltraISO,写入硬盘映像......,启动分区设置的隐藏




作者: wuchou    时间: 2022-11-5 17:53
知道了你想怎么样
作者: dos时代菜鸟    时间: 2022-11-5 18:03
D_M_GuYing 发表于 2022-11-5 17:42
用UltraISO,写入硬盘映像......,启动分区设置的隐藏

保存下面 代码为  x.ini
用 pecmd 调用之,看看结果。 通过 偏移量看看,能否校准

    REGI .HKLM\SYSTEM\CurrentControlSet\Control\SystemStartOptions,&sso
    forx * %&sso% ,&p0,
    {
        envi &&item0=
        mstr &&item0=0,7,%&p0%
        Find $"%&item0%"="RDPATH=" ,
        {
            mstr &p0=8,0,%&p0%
            mstr -delims:\ part=<1>%&p0%
        }
    }
part -drv list volume \ArcName\%part%,part_info

mstr disk,part_offset=<2><6>%part_info%
part list part %disk%,parts

forx * %parts%,partn,
{
        part list part %disk%#%partn%,partx_info
        mstr partx_offset=<4>%partx_info%
        ifex #%partx_offset%=%part_offset%,envi partx=%partn%
}
mess reg=%&sso%\n part0=%part_info% \n seach0=[%disk%] [%partx%] [%part_offset%]
作者: D_M_GuYing    时间: 2022-11-5 18:11
dos时代菜鸟 发表于 2022-11-5 18:03
保存下面 代码为  x.ini
用 pecmd 调用之,看看结果。 通过 偏移量看看,能否校准





作者: D_M_GuYing    时间: 2022-11-5 18:24
dos时代菜鸟 发表于 2022-11-5 17:36
把红色部分删了

如下紫色部分 注意包括  }!

        FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
        ENVI wzPath=%STPATH%\WEPE\WEPE.INI
上面的就是找不到配置文件时,查找光驱文件用的

红色部分不能删,删了就找不到U启的启动盘了
而且,不但不分配U盘的盘符,却把我的ESP分区给分配盘符了
运行时,还是如图



作者: D_M_GuYing    时间: 2022-11-5 18:31
dos时代菜鸟 发表于 2022-11-5 17:36
把红色部分删了

如下紫色部分 注意包括  }!

上个帖子没说明白,
REGI .HKLM\SYSTEM\CurrentControlSet\Control\SystemStartOptions,&sso
forx * %&sso% ,&p0,
{
    envi &&item0=
    mstr &&item0=0,7,%&p0%
    Find $"%&item0%"="RDPATH=" ,
    {
        mstr &p0=8,0,%&p0%
        mstr -delims:\ value1=<1>%&p0%
    }
}
Find $"%value1%"<>"",
{
    sed *ni &str2=0,[()0123456789], ,%value1%
    mstr &type1=<3>%&str2%%
    ifex '%&type1%'='rdisk',
    {
        ……………………………………
    }!
        {
        FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
        ENVI wzPath=%STPATH%\WEPE\WEPE.INI
        }  
}



这部分如果分析注册表,发现是光驱启动,定位光驱盘符用的

作者: dos时代菜鸟    时间: 2022-11-5 18:52
本帖最后由 dos时代菜鸟 于 2022-11-5 19:23 编辑
D_M_GuYing 发表于 2022-11-5 18:11

从 diskpart 的分析看,windows 没有把那个分区 视为一个可以分配盘符的卷,所以必然出现问题。

那个分区 没有 对应的 volume ,diskpart 也没有分配给他 vol ,这样的分区,应该不在 pecmd 的考量范围。
估计用 diskpart 也无法把他分配盘符,可能需要特殊的 工具 对那个分区读取吧,
如果 pe 已经 为其分配了盘符,可以用 forx 尝试找到他。

ifex '%wzpath%'='',
{
   forx !\wepe\wepe.ini,wzpath,1,
   {
      ENVI wzPath=%wzpath%
    }
}
ifex '%wzpath%'='',mess 没定位到指定配置文件


就是靠注册表 rdisk 精准定位找不到的,就各个盘符轮训呗。 还分啥是不是光驱?




作者: D_M_GuYing    时间: 2022-11-5 19:43
dos时代菜鸟 发表于 2022-11-5 18:52
从 diskpart 的分析看,windows 没有把那个分区 视为一个可以分配盘符的卷,所以必然出现问题。

那个 ...

嗯,那我就还用我那个笨方法
    IFEX %wzPath%,!
    {
        CALL getNoDrv
        DISK %nodrv%,%RDISK%,2,1
        ENVI wzPath=%nodrv%\WEPE\WEPE.INI
    }
作者: D_M_GuYing    时间: 2022-11-5 19:47
dos时代菜鸟 发表于 2022-11-5 18:52
从 diskpart 的分析看,windows 没有把那个分区 视为一个可以分配盘符的卷,所以必然出现问题。

那个 ...

笨方法虽然不能面面俱到,但对我这个PE却管用,先不折腾了

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

_SUB FINDFZ
REGI .HKLM\SYSTEM\CurrentControlSet\Control\SystemStartOptions,&sso
    forx * %&sso% ,&p0,
    {
        envi &&item0=
        mstr &&item0=0,7,%&p0%
        Find $"%&item0%"="RDPATH=" ,
        {
            mstr RDISK=29,1,%&p0%
            mstr PARTITION=41,1,%&p0%
            mstr CDROM=23,5,%&p0%
        }
    }
FIND $%CDROM%=CDROM,!
{
    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%
}
IFEX %wzPath%,!
{
    SHOW -1:-1
    FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath%
}
EXEC =!CMD /C ECHO ENVI wzPath=%wzPath% > %temp%\wzPath.INI
_END

_SUB getNoDrv
    ENVI nodrv=
    IFEX W:,!ENVI nodrv=W:
    IFEX V:,!ENVI nodrv=V:
    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



作者: zp1688    时间: 2022-11-5 19:53
呵呵!!!!!
作者: dos时代菜鸟    时间: 2022-11-5 20:18
本帖最后由 dos时代菜鸟 于 2022-11-5 20:37 编辑
D_M_GuYing 发表于 2022-11-5 19:47
笨方法虽然不能面面俱到,但对我这个PE却管用,先不折腾了

//查找并分配外置所在的隐藏分区



更新了 这次 看 适应你的情况不?

原来你是靠  SHOW -1:-1 把 那个分区分配盘符的。 你可以在 运行这个前也运行一下 这个指令 “pecmd show -1:-1”  再调用之前的版本,或者这个版本。应该就可以了。难怪之前的版本都不好用, 那个特定的分区 是用  SHOW -1:-1  个指令装载的。


根据 注册表 信息判断,
如果是光驱,就轮询光盘,
否则 获取分区信息并精准定位,
    如果精准定位不成,就根据注册表中文件路径的信息轮询所有盘符。





作者: dos时代菜鸟    时间: 2022-11-5 20:45
D_M_GuYing 发表于 2022-11-5 19:47
笨方法虽然不能面面俱到,但对我这个PE却管用,先不折腾了

//查找并分配外置所在的隐藏分区

            mstr RDISK=29,1,%&p0%
            mstr PARTITION=41,1,%&p0%
            mstr CDROM=23,5,%&p0%

这个 ?如果 遇到某个硬盘超过9个分区的,咋办?
作者: 610644034    时间: 2022-11-5 21:03
我不记得是在哪里有了这样的记忆:(可能曾经在写MBR还是DBR程序的时候)
在系统引导阶段 你从哪个设备启动,那它就是临时认定disk 0 ,然后到系统完全启动后,这个设备在主板上会恢复原来的设备号 disk x  。 所以我们注册表查到的基本就是类似:
multi(0)disk(0)rdisk(0)partition(1)
multi(0)disk(0)vdisk(0)partition(1)
这类的值! 所以此路难解!
作者: dos时代菜鸟    时间: 2022-11-5 21:12
610644034 发表于 2022-11-5 21:03
我不记得是在哪里有了这样的记忆:(可能曾经在写MBR还是DBR程序的时候)
在系统引导阶段 你从哪个设备启 ...

是可解的,只有特殊的 启动介质可能不行。

multi(0)disk(0)rdisk(0)partition(1)
是现在 虚拟内存盘上 xp 系统默认配置。

其他的 不一定,尤其是 pe. 我们找的是 在注册表中记录的 启动pe 的 boot.wim 的位置。boot.wim 可以在任何位置,甚至 光盘。
作者: dos时代菜鸟    时间: 2022-11-5 21:15
D_M_GuYing 发表于 2022-11-5 19:47
笨方法虽然不能面面俱到,但对我这个PE却管用,先不折腾了

//查找并分配外置所在的隐藏分区

SHOW -1:-1

后要跟下面这个,不然 系统不识别的 linux 分区都 被分配盘符了,容易误操作给格式化了。

fdrv drvs=*:
forx * %drvs%,drvx,
{
    ifex ! %drvx%\,subj -%drvx%
}
作者: dos时代菜鸟    时间: 2022-11-5 21:45
D_M_GuYing 发表于 2022-11-5 19:47
笨方法虽然不能面面俱到,但对我这个PE却管用,先不折腾了

//查找并分配外置所在的隐藏分区

休息,休息,休息。
作者: D_M_GuYing    时间: 2022-11-6 06:26
本帖最后由 D_M_GuYing 于 2022-11-6 07:31 编辑

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

//搜索光驱,安装WinPE.CMD,这是我的PE光盘中独有的文件
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%
}
//显示所有盘符,搜索定位
IFEX %wzPath%,!
{
    SHOW -1:-1
    FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath%
}

我的笨方法,在红色部分已经分配盘符了,其后的搜索分区,挂载隐藏,显示所有,都还没有用到,挂载用的就是
DISK %nodrv%,%RDISK%,2,1
%RDISK%就是注册表读到的 2,也算是和注册表靠点边了
这是笨方法启动后的图


之后运行了boot.wim.Path-2.72,可是错把ESP分区给定位了,这就是逆向搜索的结果,
我笨方法的后三部分也就是这个原理,其实已经谈不上精确定位了
与依据注册表读取分析并正确解释的根本想法已经脱离了,逆向搜索已经不再依据注册表
你的“diskpart外壳 2022.03.23 ver:1.27”在盘符隐藏的时候就已经正确的定位了U启在2.2
那以此为依据,DISK参数就分配盘符了,这也算精确定位了,要比全盘搜索靠谱。
只是不知道在boot.wim.Path中怎么实现,说白了,就是把注册表读到的2.4,怎么精确转成2022.03.23 ver:1.27读到的2.2





作者: dos时代菜鸟    时间: 2022-11-6 08:50
D_M_GuYing 发表于 2022-11-6 06:26
IFEX %wzPath%,!
    {
        CALL getNoDrv

还有一个办法,就是针对相应 的第2硬盘 运行show 指令,然后判断多出来的盘符是否可用,如果可用,再用part 看一下他的分区号是否是 2.4,如果是,那再找一下文件,如果有那个文件,就对上了。
作者: dos时代菜鸟    时间: 2022-11-6 09:58
本帖最后由 dos时代菜鸟 于 2022-11-6 10:05 编辑
D_M_GuYing 发表于 2022-11-6 06:26
IFEX %wzPath%,!
    {
        CALL getNoDrv

难道 你的 \wepe\wepe64.wim 不在 esp 分区上么?

可能是因为 你的硬盘分区体系中有 多个 \wepe\wepe64.wim 分别在不同的硬盘上,而 show -1:-1 是把所有的 未挂载分区都挂上了,也不知道挂上的 哪一个分区是 指定硬盘的。
如果 show 只针对 u盘上的 未挂载分区 进行挂载,就不会有这个问题了,或者只对 那个硬盘进行逆序搜索就行了。
或者再精准点儿,直接 获取挂载的盘符 对应的分区号,如果与 解析注册表 得到的一致,那么这个盘符 就是精准定位的分区了。


x4.7z (938.04 KB, 下载次数: 0)



作者: dos时代菜鸟    时间: 2022-11-6 11:08
D_M_GuYing 发表于 2022-11-6 06:26
IFEX %wzPath%,!
    {
        CALL getNoDrv

如果 pecmd 根本无法解析 那个错误的 Reg 信息呢?

可以先用 show -check -1:-1 把win能识别的分区都分配了盘符 ,包括 esp
然后,再 不能解析Reg时,再 show -1:-1 ,此时分配的盘符应该是 那些特殊的分区,
通过计算,可以找出特殊分区 对应的 盘符,这样就更精准了,就在特殊分区里找特定文件。如果 特殊分区里找不到,再去常规分区里找。

新更新的 已经放到 1楼。
作者: D_M_GuYing    时间: 2022-11-6 11:43
dos时代菜鸟 发表于 2022-11-6 11:08
如果 pecmd 根本无法解析 那个错误的 Reg 信息呢?

可以先用 show -check -1:-1 把win能识别的分区都 ...

SHOW全部显示后
part -drv list volume  \ArcName\%value1%,&part_info
也读不到信息&part_info是空的
注册表上能读出来,
value1=MULTI(0)DISK(0)RDISK(2)PARTITION(4)
我下载新版看看
作者: D_M_GuYing    时间: 2022-11-6 11:51
dos时代菜鸟 发表于 2022-11-6 11:08
如果 pecmd 根本无法解析 那个错误的 Reg 信息呢?

可以先用 show -check -1:-1 把win能识别的分区都 ...

boot.wim.Path-2.73还是不行。

我先用着这个对付下,这已经很感谢了,


CALL FINDFZ
FDIR wimPath=%wzPath%

_SUB FINDFZ
REGI .HKLM\SYSTEM\CurrentControlSet\Control\SystemStartOptions,&sso
forx * %&sso% ,&p0,
{
    envi &&item0=
    mstr &&item0=0,7,%&p0%
    Find $"%&item0%"="RDPATH=" ,
    {
        mstr &p0=8,0,%&p0%            
        mstr -delims:\ value1=<1>%&p0%
    }
}
Find $"%value1%"<>"",
{  //注册表信息读取成功
    sed *ni &str2=0,[()0123456789], ,%value1%
    mstr &type1=<3>%&str2%%
    mstr RDISK=22,1,%value1%
    ifex '%&type1%'='cdrom',
    {  //如果是光驱启动,则查找光驱内标志性文件,获取配置文件所在的光驱盘符
        FORX !\Setup\安装WinPE.CMD,STPATH,1,FDRV STPATH=%STPATH%
        ENVI wzPath=%STPATH%\WEPE\WEPE.INI
    }!
    {  //如果不是光驱,就读取一下 分区信息,获取分区所在硬盘号,分区号,盘符
    part -drv list volume  \ArcName\%value1%,&part_info
    ifex '%&part_info%'<>'',
        {  //获取到了 路径对应的硬盘/分区/盘符 信息
            mstr &disk,&part,&ltr=<2><3><8>%&part_info%
            Find $"%&ltr%"="",
            {  //该卷没有被分配盘符立即分配
                fdrv -idlec &drvs=*:
                mstr &drvx=<1>%&drvs%
                DISK %&drvx%,%&disk%,%&part%,1
                ENVI wzPath=%&drvx%\WEPE\WEPE.INI
            }
        }!
        { //未知原因list volume没有获取到信息,尝试笨方法分配U启隐藏分区
            fdrv -idlec &drvs=*:
            mstr &drvx=<1>%&drvs%
            DISK %&drvx%,%RDISK%,2,1
            ENVI wzPath=%&drvx%\WEPE\WEPE.INI
        }
    }
}
IFEX %wzPath%,!
{
    MOUN !\WEPE\WEPE.INI,X:\a,1
    FILE X:\a
    FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath%
}
IFEX %wzPath%,!
{
    SHOW -1:-1
    fdrv &drvs=*:
    forx * %&drvs%,&drvx,
    {
        ifex ! %&drvx%\,subj -%&drvx%
    }
    FORX !\WEPE\WEPE.INI,fPath,1,ENVI wzPath=%fPath%
}
EXEC =!CMD /C ECHO ENVI wzPath=%wzPath% > %temp%\wzPath.INI
_END


作者: dos时代菜鸟    时间: 2022-11-6 12:06
本帖最后由 dos时代菜鸟 于 2022-11-6 12:24 编辑
D_M_GuYing 发表于 2022-11-6 11:51
boot.wim.Path-2.73还是不行。

我先用着这个对付下,这已经很感谢了,

不好意思 刚上传的 缺了一个 引号, 会新上传一个。

但是为啥 新分配的特殊分区 没有意义呢?那上面 不能读取信息么?
作者: dos时代菜鸟    时间: 2022-11-6 12:29
本帖最后由 dos时代菜鸟 于 2022-11-6 13:13 编辑
D_M_GuYing 发表于 2022-11-6 11:51
boot.wim.Path-2.73还是不行。

我先用着这个对付下,这已经很感谢了,

因为没有 你那个 磁盘环境,不能针对性的 编辑脚本,不知道 那个 分区 与其他分区的区别 可以通过什么来找出。

那个分区 居然可以被 pecmd 的 show -check 挂载。

如果 事先 对分区盘符进行了排序,按照硬盘 u盘 光盘 的顺序分配盘符,搜索时就不会有这个问题了。



作者: D_M_GuYing    时间: 2022-11-6 14:04
dos时代菜鸟 发表于 2022-11-6 12:29
因为没有 你那个 磁盘环境,不能针对性的 编辑脚本,不知道 那个 分区 与其他分区的区别 可以通过什么来 ...

DISK 也可以加载这个分区,所以,很是怪,
我正准备用最新的PECMD.EXE试试




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3