无忧启动论坛

 找回密码
 注册
搜索
最纯净的「微PE装机优盘」UEPON大师作品系统gho:最纯净好用系统下载站数据恢复、数据保护、视频编辑
Win To Go 极致利器(IXUNCIS固态U盘)无忧启动网成立20周年!广告联系 QQ:184822951 微信:wuyouceo
楼主: liuzhaoyzz

请问下有没有办法用批处理或者命令行小程序确定系统引导分区?

    [复制链接]
发表于 2021-1-8 16:25:58 | 显示全部楼层
本帖最后由 CodeHz 于 2021-1-8 16:42 编辑
liuzhaoyzz 发表于 2021-1-8 16:11
mountvol X: /S这个操作肯定是不行的,似乎只能适用于一个硬盘一个ESP分区的情况。不具有适用性 ...

2021-01-08_16-22.png
但是我研究了一下,它的原理和我的程序的原理是一致的,也是读取注册表的设置,然后再挂载的(当然具体方法有所区别,只是最终的动作就是访问了这个注册表项目,我的方案更原始,它的方案是用隐藏的系统调用让内核去读)
(而且我还为此专门逆向了内核,发现它也是这样获取引导分区的,所以其他方法大概不会比这个更好)
2021-01-08_16-24.png
回复

使用道具 举报

发表于 2021-1-8 17:00:43 来自手机 | 显示全部楼层
CodeHz 发表于 2021-1-8 15:57
(然后一顿研究之后我发现一个最最最简单的方法。。。
直接 mountvol X: /S
然后在管理员会话里X盘就是当 ...

关闭explorer进程并以管理员权限打开就能看到了。

试了一台,挂载操作对于EFI启动的7不成功,该系统也无法读取bcd

点评

是这样的,从前面他运行我那个程序的结果来看,也没法获得volume的uuid,挂载点是空的  详情 回复 发表于 2021-1-8 17:02
回复

使用道具 举报

发表于 2021-1-8 17:02:27 | 显示全部楼层
nttwqz 发表于 2021-1-8 17:00
关闭explorer进程并以管理员权限打开就能看到了。

试了一台,挂载操作对于EFI启动的7不成功,该系统也 ...

是这样的,从前面他运行我那个程序的结果来看,也没法获得volume的uuid,挂载点是空的
回复

使用道具 举报

发表于 2021-1-8 17:04:53 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-8 16:20
mountvol的方法,适用于XP WIN7 8 10好像。问题是mountvol X: /S这样的肯定不适合的。
mountvol z: \\ ...

我也考虑过,但是发现mountvol列表至少我的电脑分配完了esp分区没出来,只有/s参数能出来,所以最后用了wmic获取没分配盘符的分区的guid,再用mountvol分配。

点评

没分配的不一定是esp哦,除了手动不分配的之外,还有msix安装的程序,部份uwp游戏,也会整出一个guid出来。。  详情 回复 发表于 2021-1-8 17:11
回复

使用道具 举报

发表于 2021-1-8 17:11:13 来自手机 | 显示全部楼层
nttwqz 发表于 2021-1-8 17:04
我也考虑过,但是发现mountvol列表至少我的电脑分配完了esp分区没出来,只有/s参数能出来,所以最后用了w ...

没分配的不一定是esp哦,除了手动不分配的之外,还有msix安装的程序,部份uwp游戏,也会整出一个guid出来。。

点评

这些不会在mountvol下面显示吧?迄今为止见过的都是分区  详情 回复 发表于 2021-1-8 17:19
回复

使用道具 举报

发表于 2021-1-8 17:19:47 来自手机 | 显示全部楼层
CodeHz 发表于 2021-1-8 17:11
没分配的不一定是esp哦,除了手动不分配的之外,还有msix安装的程序,部份uwp游戏,也会整出一个guid出来 ...

这些不会在mountvol下面显示吧?迄今为止见过的都是分区

点评

[attachimg]472445[/attachimg] 当然会,图上所示是 我的世界:地下城  详情 回复 发表于 2021-1-8 17:38
回复

使用道具 举报

发表于 2021-1-8 17:21:11 来自手机 | 显示全部楼层
本帖最后由 nttwqz 于 2021-1-8 17:22 编辑

不知道BCD默认路径是不是保存在这里
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist]

"\\REGISTRY\\MACHINE\\BCD00000000"="\\Device\\HarddiskVolume1\\Boot\\BCD"

点评

这大概也是一个方法,BCD000000的注册表就是加载自这个文件  详情 回复 发表于 2021-1-8 17:51
回复

使用道具 举报

发表于 2021-1-8 17:38:15 | 显示全部楼层
nttwqz 发表于 2021-1-8 17:19
这些不会在mountvol下面显示吧?迄今为止见过的都是分区

game.png
当然会,图上所示是 我的世界:地下城

点评

长见识了  详情 回复 发表于 2021-1-8 17:44
回复

使用道具 举报

发表于 2021-1-8 17:44:09 来自手机 | 显示全部楼层
CodeHz 发表于 2021-1-8 17:38
当然会,图上所示是 我的世界:地下城

长见识了
回复

使用道具 举报

发表于 2021-1-8 17:51:02 | 显示全部楼层
nttwqz 发表于 2021-1-8 17:21
不知道BCD默认路径是不是保存在这里
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist

这大概也是一个方法,BCD000000的注册表就是加载自这个文件
回复

使用道具 举报

发表于 2021-1-8 18:58:20 | 显示全部楼层
527104427 发表于 2021-1-8 18:49
这么神奇吗?我也是读这个位置啊,怎么就不行了呢,难道读注册表也要看人品。。。

你是不是直接把ArcName也就是那一串multi(0)的当作DeviceName或者驱动器路径了(
一个是bios(uefi)提供的,一个是内核自己算的,有差别是很正常的(

点评

multi(0)disk(0)rdisk(2)partition(1) 就是直接提取红色部分作为磁盘号和分区号啊,不是的话,请教一下读到这个数据后怎么处理呢,有没有编程门外汉能看懂的方式?  详情 回复 发表于 2021-1-8 22:15
回复

使用道具 举报

发表于 2021-1-8 20:46:09 来自手机 | 显示全部楼层
527104427 发表于 2021-1-8 18:49
这么神奇吗?我也是读这个位置啊,怎么就不行了呢,难道读注册表也要看人品。。。

pecmd的代码看起来可真是毫无可读性,强烈建议pecmd的作者重写,参照下python,这年代很多程序流行重写,比如我的世界生成器,微软花了十年重写。

点评

这是为了兼容PECMD4.0,所有代码格式保持一致。 完全推倒重来的话,就得全新开发一个了。 我想信m大没有兴趣吧。 我们这些闲散人等就像捡到宝一样拿来玩了。我接触的东西不多不杂,还是能接受这种可读性的。  详情 回复 发表于 2021-1-8 22:19
我认为目前的这个pecmd确实有可读性问题,但是呢,这玩意可不是想象中那么容易修复的。。。倒不如直接嵌入一个语言然后提供api(  详情 回复 发表于 2021-1-8 21:22
回复

使用道具 举报

发表于 2021-1-8 21:22:09 | 显示全部楼层
nttwqz 发表于 2021-1-8 20:46
pecmd的代码看起来可真是毫无可读性,强烈建议pecmd的作者重写,参照下python,这年代很多程序流行重写, ...

我认为目前的这个pecmd确实有可读性问题,但是呢,这玩意可不是想象中那么容易修复的。。。倒不如直接嵌入一个语言然后提供api(
回复

使用道具 举报

发表于 2021-1-8 22:58:49 | 显示全部楼层
本帖最后由 CodeHz 于 2021-1-8 22:59 编辑
527104427 发表于 2021-1-8 22:15
multi(0)disk(0)rdisk(2)partition(1)
就是直接提取红色部分作为磁盘号和分区号啊,不是的话,请教一下 ...

你看楼主在用我的程序时的输出,可以看出这里并没有对应关系
我使用的方法是读取Nt内核对象\ArcName\multi... 就是把这串东西附加到\ArcName后面,然后通过
NtOpenSymbolicLinkObject打开,并通过 NtQuerySymbolicLinkObject 解析符号链接的目标,拿到真正的设备名字

2021-01-08_22-33.png

(看图就很清楚了,我这里对应,但是在其他设备上不一定,已知楼主就是属于这个情况)

当然我现在发现了另外一种方法,但是还没测试成功,已知bcdedit就是这样做的:
调用 NtQuerySystemInformation, 第一个参数设置为 SystemSystemPartitionInformation, 后续就是缓冲区和对应的长度,就应该能直接拿到解析好的路径(但是是一个结构体,我还没弄清楚结构),头文件参考 https://github.com/processhacker ... t/include/ntexapi.h

修复了32位支持的源码(附带编译好的):
boot.zip (29.69 KB, 下载次数: 10)

点评

早上起来看到了这个消息,CodeHz大神幸苦了! 结果是对的,不过有点小问题。 对于ESP分区,firmware-i386.exe程序没有自动挂载盘符,如果我用bootice或者findESP程序挂载个盘符,或者mountvol z: /s ,firmware-i3  详情 回复 发表于 2021-1-9 09:19
到底还是得用API,多谢解答。  详情 回复 发表于 2021-1-8 23:04
回复

使用道具 举报

发表于 2021-1-8 23:28:57 来自手机 | 显示全部楼层
527104427 发表于 2021-1-8 23:04
到底还是得用API,多谢解答。

有一说一,其实只要用少数几个nt开头的api就能拿到大量系统信息,建议把NtQuerySystemInformation解析好后加入pecmd(
再加上Nt对象的操作函数(就是前面截图所示的winobj.exe看到的),也可以获得大量系统信息,主要这里就是枚举对象和解析符号链接

点评

我试着跟M大提一下,看他有无兴趣  详情 回复 发表于 2021-1-8 23:48
回复

使用道具 举报

 楼主| 发表于 2021-1-9 09:19:09 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-9 09:38 编辑
CodeHz 发表于 2021-1-8 22:58
你看楼主在用我的程序时的输出,可以看出这里并没有对应关系
我使用的方法是读取Nt内核对象\ArcName\mul ...

早上起来看到了这个消息,CodeHz大神幸苦了!
结果是对的,不过有点小问题。
对于从ESP分区UEFI启动WIN10的情况,firmware-i386.exe程序没有自动挂载盘符,如果我用bootice或者findESP程序挂载个盘符,或者用微软的mountvol z: /s ,firmware-i386.exe还是没有mount,mountpoints下面是空的。

我要向这个启动的ESP分区拷贝文件,必须要给他一个盘符。这个ESP是用于启动的ESP,不是其他硬盘的ESP,是特定的ESP分区。



另外想请问下,这个firmware-i386.exe不依赖于bcdedit吧?如果bcdedit不能运行的情况,firmware-i386.exe能否正常出结果?是否有管理员要求?能否通杀XP WIN7 8 10,我不想事先先判断操作系统版本,再运行firmware-i386.exe。
esp没有挂载.jpg

点评

所以是 mountvol z: /s 成功了也没有挂载点吗,这就有点奇怪了。。有没有可以复现的镜像(  详情 回复 发表于 2021-1-9 09:41
回复

使用道具 举报

发表于 2021-1-9 09:41:55 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-9 09:19
早上起来看到了这个消息,CodeHz大神幸苦了!
结果是对的,不过有点小问题。
对于从ESP分区UEFI启动WIN ...

所以是 mountvol z: /s 成功了也没有挂载点吗,这就有点奇怪了。。有没有可以复现的镜像(另外这东西是不依赖bcdedit的,基本上是个win就能跑

点评

我确认了,mountvol z: /s 成功了没有挂载点,我的电脑里面已经有ESP的盘符了 。  详情 回复 发表于 2021-1-9 10:48
回复

使用道具 举报

发表于 2021-1-9 09:51:32 | 显示全部楼层
另外看了一眼文档,好像是可以在没有guid挂载点的情况下强行挂载的,不过我看还是会受到mountvol一样的管理员权限限定问题(((esp分区的保护似乎硬编码在内核里https://docs.microsoft.com/en-us ... untmgr_create_point

点评

权限问题如果你能够解决当然是最好的了,如果不能解决,给ESP分配个盘符也行,剩下的问题再想办法吧。  详情 回复 发表于 2021-1-9 10:49
回复

使用道具 举报

 楼主| 发表于 2021-1-9 10:48:12 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-9 10:55 编辑
CodeHz 发表于 2021-1-9 09:41
所以是 mountvol z: /s 成功了也没有挂载点吗,这就有点奇怪了。。有没有可以复现的镜像(另外这东西是不 ...


       我确认了,mountvol z: /s 成功了没有挂载点,我的电脑里面已经有ESP的盘符了 。

重现问题的镜像?我搞了个GPT分区的物理硬盘,从这个物理硬盘的ESP分区bootmgfw.efi引导→BCD→加载某个WIN10.VHD以UEFI启动WIN10,你只要有个GPT分区的硬盘,外加随便安装个系统到vhd即可,不需要我的vhd啊。

或者从虚拟机里面应该也能够重现环境吧。虚拟机里面用GPT分区,然后装个系统到VHD中。
回复

使用道具 举报

 楼主| 发表于 2021-1-9 10:49:37 来自手机 | 显示全部楼层
CodeHz 发表于 2021-1-9 09:51
另外看了一眼文档,好像是可以在没有guid挂载点的情况下强行挂载的,不过我看还是会受到mountvol一样的管理 ...

        权限问题如果你能够解决当然是最好的了,如果不能解决,给ESP分配个盘符也行,剩下的问题再想办法吧。

点评

只是不能用explorer复制文件而已,反正提权以后的批处理是可以访问的)  详情 回复 发表于 2021-1-9 11:30
回复

使用道具 举报

发表于 2021-1-9 11:30:42 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-9 10:49
权限问题如果你能够解决当然是最好的了,如果不能解决,给ESP分配个盘符也行,剩下的问题再想办 ...

只是不能用explorer复制文件而已,反正提权以后的批处理是可以访问的)

点评

你那边mountvol z: /s之后,firmware.exe,mountpoints下面有盘符了吗?  详情 回复 发表于 2021-1-9 11:35
回复

使用道具 举报

 楼主| 发表于 2021-1-9 11:35:47 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-9 11:37 编辑
CodeHz 发表于 2021-1-9 11:30
只是不能用explorer复制文件而已,反正提权以后的批处理是可以访问的)


        你那边mountvol z: /s之后,对于ESP分区,firmware.exe→FirmwareBootDevice→mountpoints下面有盘符了吗?

点评

没有,看了一眼,mountvol挂载esp分区用到的是另一个方法,不走mountmgr的流程。。。  详情 回复 发表于 2021-1-9 13:24
回复

使用道具 举报

发表于 2021-1-9 13:24:31 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-9 11:35
你那边mountvol z: /s之后,对于ESP分区,firmware.exe→FirmwareBootDevice→mountpoints下面 ...

没有,看了一眼,mountvol挂载esp分区用到的是另一个方法,不走mountmgr的流程。。。
回复

使用道具 举报

发表于 2021-1-9 15:39:30 | 显示全部楼层
于是我也试图使用mountvol的方法挂载esp分区,确实可以挂载成功

效果如图

效果如图

我也同时尝试了非特权挂载,发现挂载是没问题的,唯一的问题是explorer还是访问不到(

explorer访问出错提示

explorer访问出错提示


源码和构建出来的东西在这里
boot.zip (36.96 KB, 下载次数: 5)

点评

mountfirmware-i386 z:确实可行,这个程序很不错,如果能够判断下盘符是否存在更好。 想请问下,mountfirmware-i386 z:之后,为什么firmware-i386.exe→ FirmwareBootDevice→ [+] mountpoints还是空白的?  详情 回复 发表于 2021-1-9 17:12
回复

使用道具 举报

 楼主| 发表于 2021-1-9 17:12:46 | 显示全部楼层
CodeHz 发表于 2021-1-9 15:39
于是我也试图使用mountvol的方法挂载esp分区,确实可以挂载成功

我也同时尝试了非特权挂载,发现挂载是 ...

mountfirmware-i386 z:确实可行,这个程序很不错,如果能够判断下盘符是否存在更好。
想请问下,mountfirmware-i386 z:之后,为什么firmware-i386.exe→ FirmwareBootDevice→ [+] mountpoints还是空白的?

点评

不用判断啊,你用一些正常方式弄不出的盘符就好了,反正就是复制文件,copy什么的都支持直接复制到!:这样的分区 显示不出是因为这个方法创建的不是持久挂载,重启就没了的(和subst一样  详情 回复 发表于 2021-1-9 17:33
回复

使用道具 举报

发表于 2021-1-9 17:33:36 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-9 17:12
mountfirmware-i386 z:确实可行,这个程序很不错,如果能够判断下盘符是否存在更好。
想请问下,mountfi ...

不用判断啊,你用一些正常方式弄不出的盘符就好了,反正就是复制文件,copy什么的都支持直接复制到!:这样的分区
显示不出是因为这个方法创建的不是持久挂载,重启就没了的(和subst一样

点评

1、我还是更喜欢用普通A-Z:字母作为盘符,因为这样子的话,可以在资源管理器中看到盘符,检查文件是否拷贝进去,也可以用bootice打开其中的BCD看下文件是否正常,如果你不愿意判断,批处理判断盘符是否存在,也是很  详情 回复 发表于 2021-1-9 18:27
回复

使用道具 举报

 楼主| 发表于 2021-1-9 18:27:24 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-9 18:33 编辑
CodeHz 发表于 2021-1-9 17:33
不用判断啊,你用一些正常方式弄不出的盘符就好了,反正就是复制文件,copy什么的都支持直接复制到!:这样 ...

1、我还是更喜欢用普通A-Z:字母作为盘符,因为这样子的话,可以在资源管理器中看到盘符,检查文件是否拷贝进去,也可以用bootice打开其中的BCD看下文件是否正常,如果你不愿意判断,批处理判断盘符是否存在,也是很简单的事情。
2、现在的用法,是不是直接用mountfirmware z:分配个未占用的盘符,然后这个盘符就是启动盘盘符?这个mountfirmware z:能否提供个卸载盘符的参数?
(1)如果是UEFI从某个ESP分区启动的,需要先用mountfirmware z:分配个盘符,这个返回值就是Z:盘,如果ESP分区之前用bootice或者findesp分配了盘符G:,Z:盘和G:盘是重复的,会造成迷惑,而且findesp -unmount没法卸载mountfirmware z:分配的这个Z:盘的盘符。如果提供了卸载mountfirmware 分配盘符就不会有困扰了。
(2)如果是BIOS/UEFI从某个FAT32分区启动的,返回值可能是系统提前分配好的G:盘;也可能根本就没有盘符,用mountfirmware z:分配个盘符,拷贝文件没问题,问题是Z:盘和G:盘是重复的,内容是完全一样的,会造成迷惑,如果提供了卸载mountfirmware 分配盘符就不会有困扰了。为什么不用!:这样子的特殊符号作为盘符,上面一条说过了,需要在我的电脑里面查看文件。




点评

mountfirmware z: /d 就是卸载了 而且你可以通过%errorlevel% 判断执行结果,0就是挂载(或者卸载)成功,1就是失败,其他数字就是别的奇怪的错误 我建议是在脚本里用!:这种,确保不会冲突( 然后手动挂载的时候  详情 回复 发表于 2021-1-9 18:36
回复

使用道具 举报

发表于 2021-1-9 18:36:08 | 显示全部楼层
本帖最后由 CodeHz 于 2021-1-9 18:43 编辑
liuzhaoyzz 发表于 2021-1-9 18:27
1、我还是更喜欢用普通A-Z:字母作为盘符,因为这样子的话,可以在资源管理器中看到盘符,检查文件是否拷 ...

mountfirmware z: /D 就是卸载了 (注意大小写
而且你可以通过%errorlevel% 判断执行结果,0就是挂载(或者卸载)成功,1就是失败,其他数字就是别的奇怪的错误
我建议是在脚本里用!:这种,确保不会冲突(
然后手动挂载的时候再选一个盘符搞就可以了
手动查看这个问题,正常系统是没法没法看到的(理论上应该是可以找到已经挂载的盘符的,但是我这边研究了下好像不同挂载方式的造成的结果都不太一样,适配起来挺麻烦的。。。

点评

mountfirmware z: /D原来必须用大写的字母D才行啊?小写的号不行。 [+] open Registry [+] query FirmwareBootDevice [-] arcname: multi(0)disk(0)rdisk(0)partition(1) [+] resolve arcname [-] devic  详情 回复 发表于 2021-1-9 18:45
回复

使用道具 举报

 楼主| 发表于 2021-1-9 18:45:15 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-9 18:52 编辑
CodeHz 发表于 2021-1-9 18:36
mountfirmware z: /D 就是卸载了 (注意大小写
而且你可以通过%errorlevel% 判断执行结果,0就是挂载(或 ...

mountfirmware z: /D原来必须用大写的字母D才行啊?小写的号不行。

[+] open Registry
[+] query FirmwareBootDevice
[-] arcname: multi(0)disk(0)rdisk(0)partition(1)
[+] resolve arcname
[-] devicename: \Device\Harddisk2\Partition1
[-] invalid argument: /d



手动查看这个问题,正常系统是没法没法看到的(理论上应该是可以找到已经挂载的盘符的,但是我这边研究了下好像不同挂载方式的造成的结果都不太一样,适配起来挺麻烦的。。。
我这边的电脑都是以内置超级管理员身份登陆的,用mountfirmware z:命令分配的盘符,读写没有任何问题,根本不需要重启explorer.exe(其他人可能存在读写权限的问题),内置超级管理员身份和administrators组的管理员还是有很大的区别的。这个是微软explorer自动降权的限制,要想突破这个限制,估计只有提权了吧,我不知道Nsudo能否搞定这个,这个似乎不是mountfirmware应该考虑的,如果能够搞定当然最好;如果比较难搞,或者吃力不讨好,不如交给用户,让用于右击以管理员身份运行mountfirmware.exe应该就可以解决问题吧?还是必须要重启下explorer?

点评

是的,我懒得写大小写转换了,反正就一个参数)  详情 回复 发表于 2021-1-9 18:49
回复

使用道具 举报

发表于 2021-1-9 18:49:24 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-9 18:45
mountfirmware z: /D原来必须用大写的字母D才行啊?小写的号不行。

[+] open Registry

是的,我懒得写大小写转换了,反正就一个参数)

点评

大神能否回复下我在楼上的第二个问题,我这边没有普通管理员的测试环境,我这边读写都正常。Nsudo能否搞定mountfirmware挂载ESP分区后的的写入权限问题?以管理员身份运行mountfirmware.exe z:能否搞定ESP分  详情 回复 发表于 2021-1-9 19:21
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2021-2-27 02:40

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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