无忧启动论坛

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

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

    [复制链接]
发表于 2021-1-6 10:05:25 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-6 09:50
怎么选中1 3 5 7?按任意键就直接退出了啊。

忘了,dpinfo输入

点评

哦,在WIN10-ramos里面,能够运行dpinfo。我把信息传上来。 WIN7.VHD里面运行不了,不知道怎么回事。  详情 回复 发表于 2021-1-6 10:54
回复

使用道具 举报

 楼主| 发表于 2021-1-6 10:31:24 | 显示全部楼层
dpinfo也不行啊。显示不出来。去你的帖子刚才下载的最新版的dpinfo
QQ拼音截图20210106103056.png

点评

是不是diskpart被精简掉了  详情 回复 发表于 2021-1-6 13:09
回复

使用道具 举报

 楼主| 发表于 2021-1-6 10:54:00 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-6 10:55 编辑
nttwqz 发表于 2021-1-6 10:05
忘了,dpinfo输入

哦,在WIN10-ramos里面,能够运行dpinfo。我把信息传上来。

WIN7.VHD里面运行不了,不知道怎么回事。

dpinfo_2.6输出的磁盘信息.rar

17.24 KB, 下载次数: 1, 下载积分: 无忧币 -2

点评

看了一下,脚本本身的判断并没有出错,方法有点问题,原方法就是找出启动磁盘为是的磁盘,mbr的活动分区就必定是了,这个单硬盘有效,多硬盘没有测试。不太明白这个启动磁盘具体含义,原以为是代表引导文件所在磁盘  详情 回复 发表于 2021-1-6 13:19
回复

使用道具 举报

发表于 2021-1-6 13:09:36 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-6 10:31
dpinfo也不行啊。显示不出来。去你的帖子刚才下载的最新版的dpinfo

是不是diskpart被精简掉了
回复

使用道具 举报

发表于 2021-1-6 13:19:33 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-6 10:54
哦,在WIN10-ramos里面,能够运行dpinfo。我把信息传上来。

WIN7.VHD里面运行不了,不知道怎么回事。

看了一下,脚本本身的判断并没有出错,方法有点问题,原方法就是找出启动磁盘为是的磁盘,mbr的活动分区就必定是了,这个单硬盘有效,多硬盘没有测试。不太明白这个启动磁盘具体含义,原以为是代表引导文件所在磁盘,目前看来可能是指启动的系统所在磁盘,若如此只能分析bcd了。
回复

使用道具 举报

发表于 2021-1-6 13:20:23 来自手机 | 显示全部楼层
本帖最后由 nttwqz 于 2021-1-6 13:29 编辑

BCD分析的原理是:
先将所有激活或ESP分区分配个盘符,然后bcdedit新建一个临时项,遍历这个项目BCD所在分区,即为引导分区。最后删除这个新建的项。
不知道分配盘符后,是否所有的bcdedit都能成功写入,如果不能,又是多硬盘,多引导分区并存时,则无法判断。
只要一个硬盘或多个硬盘中只有一个引导分区中有引导文件都好判断。
至于通过多个BCD判断哪个是当前系统的,没有好的思路。

点评

就怕有的电脑bcdedit都运行不了。如果能用windows API之类的搞定就好了。 我上面的磁盘列表都是MBR硬盘,还没有涉及到GPT硬盘。  详情 回复 发表于 2021-1-6 14:27
回复

使用道具 举报

 楼主| 发表于 2021-1-6 14:27:40 | 显示全部楼层
nttwqz 发表于 2021-1-6 13:20
BCD分析的原理是:
先将所有激活或ESP分区分配个盘符,然后bcdedit新建一个临时项,遍历这个项目BCD所在分 ...

就怕有的电脑bcdedit都运行不了。如果能用windows API之类的搞定就好了。

我上面的磁盘列表都是MBR硬盘,还没有涉及到GPT硬盘。

点评

缺胳膊少腿的系统不在我的考虑范围内,你可以自己补全相关文件。 API只能等其它高手了,条件是他们愿意动手。  详情 回复 发表于 2021-1-6 17:57
回复

使用道具 举报

发表于 2021-1-6 17:57:33 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-6 14:27
就怕有的电脑bcdedit都运行不了。如果能用windows API之类的搞定就好了。

我上面的磁盘列表都是MBR硬 ...

缺胳膊少腿的系统不在我的考虑范围内,你可以自己补全相关文件。

API只能等其它高手了,条件是他们愿意动手。
回复

使用道具 举报

发表于 2021-1-6 18:54:06 | 显示全部楼层
通过逆向 bcdedit 我找到了如下几个可能相关的,但是没文档的 api :
NtEnumerateBootEntries
NtQueryBootOptions
NtQueryBootEntryOrder
我先看看其他人怎么用的,不行的话看看内核怎么实现的(

点评

NtEnumerateBootEntries( OUT PVOID Buffer, IN OUT PULONG BufferLength );Routine Description: This function returns a list of all existing boot entries. N.B. This service requires the system en  详情 回复 发表于 2021-1-6 19:18
回复

使用道具 举报

发表于 2021-1-6 19:18:38 | 显示全部楼层
本帖最后由 plusv 于 2021-1-6 19:20 编辑
CodeHz 发表于 2021-1-6 18:54
通过逆向 bcdedit 我找到了如下几个可能相关的,但是没文档的 api :
NtEnumerateBootEntries
NtQueryBoo ...


NtEnumerateBootEntries(
  OUT PVOID Buffer,
  IN OUT PULONG BufferLength
  );

Routine Description:

    This function returns a list of all existing boot entries.

    N.B. This service requires the system environment privilege.

Arguments:

    Buffer - Supplies the address of the buffer that is to receive the
        returned data. The returned data is a sequence of BOOT_ENTRY_LIST
        structures.

    BufferLength - On input, supplies the length in bytes of the buffer.
        On output, returns the length in bytes of the returned data.
        If the input buffer is large enough, then BufferLength indicates
        the amount of data copied into Buffer. If the input buffer
        is too small, then BufferLength indicates the required buffer length.

Return Value:

    STATUS_SUCCESS              The function succeeded.
    STATUS_BUFFER_TOO_SMALL     The input buffer was too small.
    STATUS_INVALID_PARAMETER    One of the parameters is invalid.
    STATUS_NOT_IMPLEMENTED      This function is not supported on this platform.
    STATUS_UNSUCCESSFUL         The firmware returned an unrecognized error.
    STATUS_PRIVILEGE_NOT_HELD   The caller does not have the required privilege.
    STATUS_ACCESS_VIOLATION     One of the input parameters cannot be read,
                                or one of the output parameters cannot be written.

==================================================================================
NtQueryBootOptions(
  OUT PBOOT_OPTIONS BootOptions,
  IN OUT PULONG BootOptionsLength
  );

Routine Description:

    This function returns the system's global boot options.

    N.B. This service requires the system environment privilege.

Arguments:

    BootOptions - Supplies the address of the buffer that is to receive the
        returned data.

    BootOptionsLength - On input, supplies the length in bytes of the buffer.
        On output, returns the length in bytes of the returned data.
        If the input buffer is large enough, then BootOptionsLength indicates
        the amount of data copied into BootOptions. If the input buffer
        is too small, then BootOptionsLength indicates the required buffer
        length.

Return Value:

    STATUS_SUCCESS              The function succeeded.
    STATUS_BUFFER_TOO_SMALL     The input buffer was too small.
    STATUS_INVALID_PARAMETER    One of the parameters is invalid.
    STATUS_NOT_IMPLEMENTED      This function is not supported on this platform.
    STATUS_UNSUCCESSFUL         The firmware returned an unrecognized error.
    STATUS_PRIVILEGE_NOT_HELD   The caller does not have the required privilege.
    STATUS_ACCESS_VIOLATION     One of the input parameters cannot be read,
                                or one of the output parameters cannot be written.
==================================================================================
NtQueryBootEntryOrder(
  OUT PULONG Ids,
  IN OUT PULONG Count
  );

Routine Description:

    This function returns the system boot order list.

    N.B. This service requires the system environment privilege.

Arguments:

    Ids - Supplies the address of the buffer that is to receive the
        returned data. The returned data is an array of ULONG boot
        entry identifiers.

    Count - On input, supplies the length in ULONGs of the buffer.
        On output, returns the length in ULONGs of the returned data.
        If the input buffer is large enough, then Count indicates
        the amount of data copied into Buffer. If the input buffer
        is too small, then Count indicates the required buffer length.

Return Value:

    STATUS_SUCCESS              The function succeeded.
    STATUS_BUFFER_TOO_SMALL     The input buffer was too small.
    STATUS_INVALID_PARAMETER    One of the parameters is invalid.
    STATUS_NOT_IMPLEMENTED      This function is not supported on this platform.
    STATUS_UNSUCCESSFUL         The firmware returned an unrecognized error.
    STATUS_PRIVILEGE_NOT_HELD   The caller does not have the required privilege.
    STATUS_ACCESS_VIOLATION     One of the input parameters cannot be read,
                                or one of the output parameters cannot be written.

回复

使用道具 举报

发表于 2021-1-6 19:35:07 | 显示全部楼层
查了 Google
可能有用的 API

NtAddBootEntry
NtDeleteBootEntry
NtModifyBootEntry
NtEnumerateBootEntries

NtQueryBootEntryOrder
NtQueryBootOptions

NtSetBootEntryOrder
NtSetBootOptions

点评

头文件和相关结构体定义也在process hacker的源码里找到了(  详情 回复 发表于 2021-1-6 19:49
回复

使用道具 举报

发表于 2021-1-6 19:49:38 | 显示全部楼层
plusv 发表于 2021-1-6 19:35
查了 Google
可能有用的 API

头文件和相关结构体定义也在process hacker的源码里找到了(
回复

使用道具 举报

发表于 2021-1-6 20:31:32 | 显示全部楼层
此版完全放弃了启动磁盘+活动+ESP分区+分析BCD的方法,改为全部使用分析BCD的方法。

同上一版一样,我的电脑判断正常。

checkbootpart_v2.zip

16.51 KB, 下载次数: 9, 下载积分: 无忧币 -2

点评

试了下,这个版本结果是对的。我的环境是ESP分区启动一个vhd。带星号的就是ESP分区。 晚点换个环境继续测试下。  详情 回复 发表于 2021-1-7 07:45
回复

使用道具 举报

发表于 2021-1-6 20:35:58 | 显示全部楼层
2021-01-06_20-33.png
一顿研究后发现,bcdedit 确定启动磁盘似乎就是读取这个符号链接。。。
直接列出目录然后看符号链接指向的磁盘就好了

点评

静候佳音! @CodeHz @plusv大神  详情 回复 发表于 2021-1-7 10:33
回复

使用道具 举报

 楼主| 发表于 2021-1-7 07:45:30 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-7 08:38 编辑
nttwqz 发表于 2021-1-6 20:31
此版完全放弃了启动磁盘+活动+ESP分区+分析BCD的方法,改为全部使用分析BCD的方法。

同上一版一样,我的 ...

试了下,这个版本结果是对的。我的环境是ESP分区启动一个vhd。带星号的就是ESP分区。 checkbootpart截图.jpg



晚点换个环境继续测试下。结果如下:

从一个MBR的激活的FAT32分区UEFI启动,这个版本结果是对的。但是好像没有自动分配盘符?
checkbootpart截图2.jpg

点评

我也发现了问题,该分配的没有分配,该删除的没有删除。  详情 回复 发表于 2021-1-7 09:35
回复

使用道具 举报

 楼主| 发表于 2021-1-7 07:47:20 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-7 08:41 编辑
527104427 发表于 2021-1-7 00:49
最后憋个大招,看有没有用:

5大,这个版本检测结果不对,我的环境是ESP分区启动一个vhd。结果定位到了另一个FAT32分区F,这个分区确实是有启动文件,但是不是从这个盘符启动的。请看下上面的截图1,本来应该是Z,结果chkmbrpbr定位到了F。

换了个环境,截图2,从一个MBR的激活的FAT32分区UEFI启动,chkmbrpbr定位到了D盘,实际上应该是第7个FAT32那个分区

点评

麻烦看下HKLM\SYSTEM\ControlSet001\Control\\FirmwareBootDevice的值是什么  详情 回复 发表于 2021-1-7 08:16
回复

使用道具 举报

 楼主| 发表于 2021-1-7 08:41:18 | 显示全部楼层
527104427 发表于 2021-1-7 08:16
麻烦看下HKLM\SYSTEM\ControlSet001\Control\\FirmwareBootDevice的值是什么

        那台电脑在家里。我截图之后出来了,晚点看看。

点评

这么一看似乎就是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareBootDevice 和 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SystemBootDevice 风别为引导盘和启动盘了(  详情 回复 发表于 2021-1-7 20:28
回复

使用道具 举报

发表于 2021-1-7 09:35:00 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-7 07:45
试了下,这个版本结果是对的。我的环境是ESP分区启动一个vhd。带星号的就是ESP分区。



我也发现了问题,该分配的没有分配,该删除的没有删除。

点评

有时候感觉checkbootpart执行起来很慢,大概有1-2分钟之久,不清楚原因。  详情 回复 发表于 2021-1-7 09:54
回复

使用道具 举报

 楼主| 发表于 2021-1-7 09:54:53 | 显示全部楼层
nttwqz 发表于 2021-1-7 09:35
我也发现了问题,该分配的没有分配,该删除的没有删除。

有时候感觉checkbootpart执行起来很慢,大概有1-2分钟之久,不清楚原因。

点评

dpinfo有调试功能,将开头的改为set debug=on 这样会显示各步执行时间,看那一段时间长,在前面加句 cls & echo on,这样应该可以判断慢的原因,或者将开头回显打开以判断这个脚本慢的原因。  详情 回复 发表于 2021-1-7 10:39
获取磁盘信息需要执行两次diskpart,分配和删除盘符又需要两次,多硬盘系统所在磁盘一般不休眠,但是其它硬盘会休眠,休眠需要唤醒,唤醒需要时间,初次diskpart初始化也需要时间,分析本身是很快的,这就是我当初说  详情 回复 发表于 2021-1-7 10:19
回复

使用道具 举报

发表于 2021-1-7 10:19:29 来自手机 | 显示全部楼层
本帖最后由 nttwqz 于 2021-1-7 10:20 编辑
liuzhaoyzz 发表于 2021-1-7 09:54
有时候感觉checkbootpart执行起来很慢,大概有1-2分钟之久,不清楚原因。


获取磁盘信息需要执行两次diskpart,分配和删除盘符又需要两次,多硬盘系统所在磁盘一般不休眠,但是其它硬盘会休眠,休眠需要唤醒,唤醒需要时间,初次diskpart初始化也需要时间,分析本身是很快的,这就是我当初说慢的原因,diskpart本身运行慢和硬盘唤醒慢没办法解决,你不介意的话我可以用mountvol来替代didkpart删除盘符,遮阳可以减少一次

点评

我搞不清楚为啥有的电脑执行起来比较快,大概10秒钟左右(没有秒表测试),有的居然要1-2分钟。 diskpart,用于中文版、英文版关键字不一样怎么解决?  详情 回复 发表于 2021-1-7 10:27
回复

使用道具 举报

 楼主| 发表于 2021-1-7 10:27:43 | 显示全部楼层
nttwqz 发表于 2021-1-7 10:19
获取磁盘信息需要执行两次diskpart,分配和删除盘符又需要两次,多硬盘系统所在磁盘一般不休眠,但是其 ...

我搞不清楚为啥有的电脑执行起来比较快,大概10秒钟左右(没有秒表测试),有的居然要1-2分钟。似乎不是diskpart本身运行慢的问题。
diskpart,用于中文版、英文版关键字不一样怎么解决?

点评

暂不考虑支持英文版,感觉中文版都没几个人用  详情 回复 发表于 2021-1-7 10:53
回复

使用道具 举报

 楼主| 发表于 2021-1-7 10:33:08 | 显示全部楼层
CodeHz 发表于 2021-1-6 20:35
一顿研究后发现,bcdedit 确定启动磁盘似乎就是读取这个符号链接。。。
直接列出目录然后看符号链接指向 ...

静候佳音!
@CodeHz @plusv大神

点评

你先试试用winobj (sys internals 套件里的那个) 管理员权限打开后能不能在我截图的位置看到正确的结果,可以的话我就做个小工具读(并在已经挂载的情况下拿到盘符)  详情 回复 发表于 2021-1-7 12:12
回复

使用道具 举报

发表于 2021-1-7 10:39:52 来自手机 | 显示全部楼层
本帖最后由 nttwqz 于 2021-1-7 10:41 编辑
liuzhaoyzz 发表于 2021-1-7 09:54
有时候感觉checkbootpart执行起来很慢,大概有1-2分钟之久,不清楚原因。


dpinfo有调试功能,将开头的改为set debug=on
这样会显示各步执行时间,看那一段时间长,在前面加句 cls & echo on,这样应该可以判断慢的原因,或者将开头回显打开以判断整个脚本慢的原因。

点评

dpino在WIN10电脑用时1.7秒。 但是上面的checkbootpartV2有时候慢。看了下用时8秒。  详情 回复 发表于 2021-1-7 10:49
回复

使用道具 举报

 楼主| 发表于 2021-1-7 10:49:59 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-7 10:58 编辑
nttwqz 发表于 2021-1-7 10:39
dpinfo有调试功能,将开头的改为set debug=on
这样会显示各步执行时间,看那一段时间长,在前面加句 c ...

dpinfo在WIN10电脑用时1.7秒。
但是上面的checkbootpartV2有时候慢。看了下用时8秒。

点评

那你在:sel后面加一句cls & echo on并删除后来所有的cls,然后看看那地方慢  详情 回复 发表于 2021-1-7 11:03
回复

使用道具 举报

发表于 2021-1-7 10:53:55 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-7 10:27
我搞不清楚为啥有的电脑执行起来比较快,大概10秒钟左右(没有秒表测试),有的居然要1-2分钟。似乎不是d ...

暂不考虑支持英文版,感觉中文版都没几个人用
回复

使用道具 举报

发表于 2021-1-7 11:03:25 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-7 10:49
dpinfo在WIN10电脑用时1.7秒。
但是上面的checkbootpartV2有时候慢。看了下用时8秒。

那你在:sel后面加一句cls & echo on并删除后来所有的cls,然后看看那地方慢

点评

我瞎改了一通,你看看记录。  详情 回复 发表于 2021-1-7 11:13
回复

使用道具 举报

 楼主| 发表于 2021-1-7 11:13:39 | 显示全部楼层
nttwqz 发表于 2021-1-7 11:03
那你在:sel后面加一句cls & echo on并删除后来所有的cls,然后看看那地方慢

我瞎改了一通,你看看记录。

命令记录.rar

5.6 KB, 下载次数: 1, 下载积分: 无忧币 -2

点评

我的本意是改了之后看哪里卡的时间长。。。  详情 回复 发表于 2021-1-7 11:47
回复

使用道具 举报

发表于 2021-1-7 11:47:03 来自手机 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-7 11:13
我瞎改了一通,你看看记录。

我的本意是改了之后看哪里卡的时间长。。。
回复

使用道具 举报

发表于 2021-1-7 12:12:16 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-7 10:33
静候佳音!
@CodeHz @plusv大神

你先试试用winobj (sys internals 套件里的那个) 管理员权限打开后能不能在我截图的位置看到正确的结果,可以的话我就做个小工具读(并在已经挂载的情况下拿到盘符)

点评

那个工具我找不到了,请分享个网址。谢谢!  详情 回复 发表于 2021-1-7 12:43
回复

使用道具 举报

 楼主| 发表于 2021-1-7 12:22:16 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2021-1-7 12:23 编辑
527104427 发表于 2021-1-7 08:16
麻烦看下HKLM\SYSTEM\ControlSet001\Control\\FirmwareBootDevice的值是什么
76楼图1的环境:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control
FirmwareBootDevice=multi(0)disk(0)rdisk(2)partition(1)


回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2021-2-27 20:16

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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