无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 52196|回复: 411
打印 上一主题 下一主题

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

    [复制链接]
跳转到指定楼层
#
发表于 2020-12-24 08:56:19 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liuzhaoyzz 于 2020-12-24 09:56 编辑

请问下有没有办法用批处理或者命令行小程序确定系统引导分区?
       有时候系统引导分区不一定是C盘,比如对于VHD系统,引导分区可能是G: H:这样子的磁盘,甚至可能没有盘符,如果当前系统是WIN7 8 10,包括BIOS和UEFI环境下,有没有好的办法确定系统的“引导分区”,并且能够自动分配盘符?如果windows有相关的命令最好,比如wmic什么的,如果没有,有没有人能够写个小程序来确定系统引导分区?希望是c/c++/delphi/au3/autohotkey之类的。有没有windows API能够搞定这个?实在不行,pecmd也行,pecmd的问题是需要过360这个烦人的坎,需要很尴尬地“面向360编程”,向别人解释没有病毒太累了。
      我所考虑的问题:
      1、BIOS下面,引导分区是活动分区,遍历活动分区没有问题,问题是有可能有多个硬盘,每个硬盘都有活动分区,活动分区里面可能都有bootmgr这样子的文件,难以区分。另外还有交叉引导的问题,即硬盘0上的引导文件引导硬盘1上的系统,硬盘1上的引导文件引导硬盘0上的系统。
      2、UEFI下面,磁盘分区可能是MBR/GPT的。
(1)对于GPT硬盘,一般来说ESP分区是引导分区,但不排除一个GPT硬盘有多个ESP分区的情况,甚至有的硬盘根本不需要ESP分区,主板原生支持NTFS,全部都是NTFS分区一样可以UEFI启动。
(2)对于MBR硬盘,引导分区可能是FAT32分区,甚至不需要FAT32分区,主板原生支持NTFS,引导分区可能是某一个NTFS分区。还有多个物理硬盘的情况,多个分区可能都会存在H:\EFI\Microsoft\Boot\bootmgfw.efi这样的文件,比较复杂。
      有没有好的办法用批处理或者命令行小程序确定这个“引导分区”?有没有“现成的”小程序或者方案,不需要“重复造轮子”的?在此先谢过了!

403#
发表于 2023-4-21 15:33:02 | 只看该作者
感谢分享
回复

使用道具 举报

402#
发表于 2023-4-12 18:56:54 | 只看该作者
你这个就有点像开了多个DHCP,  该从哪个dhcp启动的问题
回复

使用道具 举报

401#
 楼主| 发表于 2023-4-11 22:43:55 | 只看该作者
wintoflash 发表于 2023-4-10 22:31
挖坟。我看 49# CodeHz 的程序里面就是直接读的注册表啊?(http://bbs.wuyou.net/forum.php?m ... 4287&f ...

我实在是记不清这些了,我也没细看CodeHz的代码
前面的帖子好像是测试过。
回复

使用道具 举报

400#
发表于 2023-4-10 22:31:06 | 只看该作者
本帖最后由 wintoflash 于 2023-4-10 22:32 编辑
liuzhaoyzz 发表于 2021-6-28 09:52
你说的这个注册表项,帖子里面讨论过了,不靠谱。

挖坟。我看 49# CodeHz 的程序里面就是直接读的注册表啊?(http://bbs.wuyou.net/forum.php?m ... 4287&fromuid=487838)
firmware.tjs
  1. int getctrl(wchar_t *entry) {
  2.         HKEY scoped(pcloseKey) control;
  3.         CheckReg(RegOpenKey(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control", &control));
  4.         LocalBuffer(wchar_t, device, 4096);
  5.         DWORD xtype = REG_SZ;
  6.         CheckReg(RegQueryValueEx(control, entry, 0, &xtype, (LPBYTE) device, &device_len));
  7.         ...
  8. }

  9. #define ReportCtrl(name) ({ wprintf(L" [+] key: %s\n", name); int code = getctrl(name); if (code != 0) wprintf(L"failed to read %s: %08X\n", name, code); })
  10. #define ReportStatus(msg, action) ({ wprintf(L" [+] %s\n", msg); int code = action; if (code != 0) wprintf(L"failed to %s: %08X\n", msg, code); })

  11. int main() {
  12.         ReportCtrl(L"FirmwareBootDevice");
  13.         ReportCtrl(L"SystemBootDevice");
  14. }
复制代码

点评

我实在是记不清这些了,我也没细看CodeHz的代码  详情 回复 发表于 2023-4-11 22:43
回复

使用道具 举报

399#
发表于 2022-12-1 16:54:07 | 只看该作者
liuzhaoyzz 发表于 2022-11-28 12:37
抱歉没注意到你的回帖。
bcdedit必须要以管理员身份运行,否则就有问题,对于UEFI+MBR硬盘需要/efi/mi ...

不行的。您可以试试,使用CodeHz大神开发的小程序挂载的盘符,bcdedit识别不到。使用diskpart加载出来的盘符是可以的。
回复

使用道具 举报

398#
 楼主| 发表于 2022-11-28 12:37:44 来自手机 | 只看该作者
2000lg 发表于 2022-11-21 17:51
斑竹请教一个问题,用楼上CodeHz大神开发的小程序,虽然挂载引导分区盘符都正常。复制文件进去也正常。    ...


抱歉没注意到你的回帖。
bcdedit必须要以管理员身份运行,否则就有问题,对于UEFI+MBR硬盘需要/efi/microsoft/bcd所在的分区是活动分区才行。
回复

使用道具 举报

397#
发表于 2022-11-25 17:17:09 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

396#
发表于 2022-11-25 17:16:54 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

395#
发表于 2022-11-21 17:51:14 | 只看该作者
斑竹请教一个问题,用楼上CodeHz大神开发的小程序,虽然挂载引导分区盘符都正常。复制文件进去也正常。   但是如果使用bcdedit /store命令修改ESP分区下的efi\microsoft\boot\bcd启动菜单,提示找不到路径。这个怎么解决?

点评

抱歉没注意到你的回帖。 bcdedit必须要以管理员身份运行,否则就有问题,对于MBR硬盘需要/boot/microsoft/bcd所在的分区是活动分区才行。  详情 回复 发表于 2022-11-28 12:37
回复

使用道具 举报

394#
发表于 2022-11-20 11:18:56 | 只看该作者
学习了,厉害!
回复

使用道具 举报

393#
发表于 2022-4-27 12:05:21 | 只看该作者
Bluebells 发表于 2022-4-26 14:39
由于 PECMD 只会简单的一些语句, 所以看不懂
其实我只要获取得到启动分区的磁盘分区编号或卷编号就可以 ...

不用知道 原理,只要 拿到结果 就行了。
批处理 调用  pecmd 脚本结果,再拿结果用。
回复

使用道具 举报

392#
发表于 2022-4-26 14:39:31 | 只看该作者
dos时代菜鸟 发表于 2022-4-26 10:32
本帖 ,369楼 就是。
把 cmd 中 的  reg 改为 api ,批处理就会 调用 api 来确定 启动分区,
如果 是re ...

由于 PECMD 只会简单的一些语句, 所以看不懂
其实我只要获取得到启动分区的磁盘分区编号或卷编号就可以了(如 \Device\HarddiskX\PartitionX 或 \Device\HarddiskVolumeX)
我之前是使用注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 的值 FirmwareBootDevice 的数据去获取启动分区的磁盘分区编号, 但据说在某些情况下, 这种判断方式会不正确, 因此想通过 WinAPI 去获取

点评

不用知道 原理,只要 拿到结果 就行了。 批处理 调用 pecmd 脚本结果,再拿结果用。  详情 回复 发表于 2022-4-27 12:05
回复

使用道具 举报

391#
发表于 2022-4-26 10:32:39 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-4-26 10:41 编辑
Bluebells 发表于 2022-4-26 09:49
能否给出你在调用 NtQuerySystemInformation 函数获取启动分区时所使用的参数及其类型? 谢谢!

本帖 ,369楼 就是。
把 cmd 中 的  reg 改为 api ,批处理就会 调用 api 来确定 启动分区,
如果 是reg ,批处理会 通过读取 注册表指定位置,获取 启动分区 ,然后还是要用 api 转化一下格式。

注册表 得到的是bcd 位置分区,api 得到的是 bios 调用的分区。

表达 分区的格式 ,需要用  另外的 api 转一下。不然 ,用不了。

本帖  362楼 是 单独 用 api 方式的 pecmd 脚本。

点评

由于 PECMD 只会简单的一些语句, 所以看不懂 其实我只要获取得到启动分区的磁盘分区编号或卷编号就可以了(如 \Device\HarddiskX\PartitionX 或 \Device\HarddiskVolumeX) 我之前是使用注册表项 HKEY_LOCAL_MACHINE  详情 回复 发表于 2022-4-26 14:39
回复

使用道具 举报

390#
发表于 2022-4-26 09:49:14 | 只看该作者
dos时代菜鸟 发表于 2022-4-26 08:22
抱歉 autoit 不是很熟。

能否给出你在调用 NtQuerySystemInformation 函数获取启动分区时所使用的参数及其类型? 谢谢!

点评

本帖 ,369楼 就是。  详情 回复 发表于 2022-4-26 10:32
回复

使用道具 举报

389#
发表于 2022-4-26 08:22:40 | 只看该作者
Bluebells 发表于 2022-4-23 20:42
你好! 请问怎么用 autoit 调用 api 获取启动分区的磁盘分区编号?
仅获取启动分区的磁盘分区编号相关信息 ...

抱歉 autoit 不是很熟。

点评

能否给出你在调用 NtQuerySystemInformation 函数获取启动分区时所使用的参数及其类型? 谢谢!  详情 回复 发表于 2022-4-26 09:49
回复

使用道具 举报

388#
发表于 2022-4-23 20:42:31 | 只看该作者
dos时代菜鸟 发表于 2021-1-28 10:40
用 pecmd 调用 api 或者 reg  实现 bcd启动分区的 挂载与卸载
具体 可以到 cmd 中设置 模式。

你好! 请问怎么用 autoit 调用 api 获取启动分区的磁盘分区编号?
仅获取启动分区的磁盘分区编号相关信息, 无需挂载启动分区

点评

抱歉 autoit 不是很熟。  详情 回复 发表于 2022-4-26 08:22
回复

使用道具 举报

387#
发表于 2021-8-12 09:39:37 | 只看该作者
liuzhaoyzz 发表于 2021-8-12 08:05
https://liuzhaoyzz.lanzoui.com/iHoXksis2ta

这是很好的学习范本,感谢分享!
回复

使用道具 举报

386#
 楼主| 发表于 2021-8-12 08:05:04 | 只看该作者
Anson4 发表于 2021-8-12 01:02
请问有比这个更新的版本吗?
源码很有学习价值,求分享!

https://liuzhaoyzz.lanzoui.com/iHoXksis2ta

点评

这是很好的学习范本,感谢分享!  详情 回复 发表于 2021-8-12 09:39
回复

使用道具 举报

385#
发表于 2021-8-12 01:02:14 | 只看该作者
liuzhaoyzz 发表于 2021-1-20 22:59
我传上来。我感觉出错的原因可能是ChkMBRPBR尝试卸载光驱所在的盘符导致出错。

请问有比这个更新的版本吗?
源码很有学习价值,求分享!

点评

https://liuzhaoyzz.lanzoui.com/iHoXksis2ta  详情 回复 发表于 2021-8-12 08:05
回复

使用道具 举报

384#
发表于 2021-7-4 00:13:20 | 只看该作者
dos时代菜鸟 发表于 2021-6-28 16:43
PE下,几个方案综合处理,
逐个对可识别分区,用 PECMD 映射到某盘符,确定分区是否存在WINDOWS,
是否存 ...

嗯,,,,,我一般是从网络启动的,
唷,从网络分区引导的,想知道怎么找出来
回复

使用道具 举报

383#
发表于 2021-6-28 16:43:43 | 只看该作者
PE下,几个方案综合处理,
逐个对可识别分区,用 PECMD 映射到某盘符,确定分区是否存在WINDOWS,
是否存在BCD,对WINDOWS 文件夹分析,对BCD分析。
这是最常规的办法。
特殊的情况千千万,弄不清楚,比如,我用GRUB调用一个 IMG里的BCD启动系统的,你咋找出来。
所以,能在本地当前系统下通过API找出直接的启动分区,就不错了。


点评

嗯,,,,,我一般是从网络启动的, 唷,从网络分区引导的,想知道怎么找出来  详情 回复 发表于 2021-7-4 00:13
回复

使用道具 举报

382#
 楼主| 发表于 2021-6-28 12:06:23 | 只看该作者
江南一根葱 发表于 2021-6-28 10:37
是怎么个不靠谱,有实际大量试验过概率吗

我前面有测试啊,具体场景忘了,但是真的是对不上,你看下前面的帖子就知道了。无非是几种测试:
1、bootmgr+MBR硬盘。
2、bootmgfw.efi+MBR硬盘。好像是这个情况下结果不对,记不清了,总之是不对。
3、bootmgfw.efi+GPT硬盘。

最后还是Windows API更靠谱。
        
回复

使用道具 举报

381#
发表于 2021-6-28 10:37:42 | 只看该作者
liuzhaoyzz 发表于 2021-6-28 09:52
你说的这个注册表项,帖子里面讨论过了,不靠谱。

是怎么个不靠谱,有实际大量试验过概率吗

点评

我前面有测试啊,具体场景忘了,但是真的是对不上,你看下前面的帖子就知道了。无非是几种测试: 1、bootmgr+MBR硬盘。 2、bootmgfw.efi+MBR硬盘。好像是这个情况下结果不对,记不清了,总之是不对。 3、bootmgfw  详情 回复 发表于 2021-6-28 12:06
回复

使用道具 举报

380#
 楼主| 发表于 2021-6-28 09:52:31 来自手机 | 只看该作者
江南一根葱 发表于 2021-6-27 00:24
我在pe群深入学习发现
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control
有个SystemBootDevice值,很色 ...

你说的这个注册表项,帖子里面讨论过了,不靠谱。      

点评

我看 49# CodeHz 的程序里面就是直接读的注册表啊?(http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=423468&pid=4214287&fromuid=487838)  详情 回复 发表于 2023-4-10 22:31
是怎么个不靠谱,有实际大量试验过概率吗  详情 回复 发表于 2021-6-28 10:37
回复

使用道具 举报

379#
发表于 2021-6-27 00:24:07 | 只看该作者
我在pe群深入学习发现
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control
有个SystemBootDevice值,很色情地描写了系统是从哪个分区启动的,

点评

你说的这个注册表项,帖子里面讨论过了,不靠谱。  详情 回复 发表于 2021-6-28 09:52
回复

使用道具 举报

378#
发表于 2021-6-26 08:20:20 | 只看该作者
dos时代菜鸟 发表于 2021-6-25 22:21
那个 api  的最初目的是 为了 在系统安装的第一次启动时 找到 bcd 并完善之。
你用 光盘启动,这个 api  ...

用 u 盘启动 pe ,是可以识别到 启动分区是 u盘的。

如此说来,依旧没办法正确识别硬盘上的系统引导,比如PE下安装系统后,需要引导修复,那么这些系统安装工具也是不能准确做出引导修复,它们也只是判断个大概,或者默认指定第一磁盘第一分区之类的方式来修复,而无法做到真正识别到原有系统的引导分区来加以修复的情况了?
回复

使用道具 举报

377#
发表于 2021-6-25 22:21:36 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-6-25 22:23 编辑
ESD 发表于 2021-6-23 16:29
请教一下版主,不论是DOS时代菜单的dpx脚本,还是CodeHz的工具,都没有办法在通过光盘引导进pe后,在PE里面 ...

那个 api  的最初目的是 为了 在系统安装的第一次启动时 找到 bcd 并完善之。
你用 光盘启动,这个 api 当然 就找不到了。
不光是光盘启动 找不到,就是 用 grub 启动以后 调用 其他分区的 Bcd 启动,api 也会认为启动分区是 grub 所在分区 ,而注册表 中记录的 是 bcd 所在的分区,此时 安装程序会发现 这个 启动分区(grub) 与启动自身的 bcd 分区 不一致,安装过程也会中止。

另外说一下,用 u 盘启动 pe ,是可以识别到 启动分区是 u盘的。
你的 BIOS调用的启动介质 是 硬盘 u 盘,api 就能找到,唯独只读的 光盘不行。
回复

使用道具 举报

376#
发表于 2021-6-25 21:20:08 | 只看该作者
liuzhaoyzz 发表于 2021-6-25 19:28
从PE里面启动判断引导分区?这个问题和思路就不对。这种情况下,你说说看什么叫做引导分区?
对于BIOS ...

嗯 感谢回复这么多,辛苦了。

如此来看,那些PE下的系统安装工具,估计也是默认指定某块硬盘(比如第一块硬盘,或SSD)的某个分区(如ESP分区)来进行引导修复,照此来看还是存在判断失误的情况,是吧?

我开始不明白,以为系统安装工具能准确识别引导并且修复,而这个工具无法判断,还以为是自己使用错了(虽然不适合在PE下用)。
回复

使用道具 举报

375#
 楼主| 发表于 2021-6-25 19:28:54 来自手机 | 只看该作者
本帖最后由 liuzhaoyzz 于 2021-6-25 19:37 编辑
ESD 发表于 2021-6-23 16:29
请教一下版主,不论是DOS时代菜单的dpx脚本,还是CodeHz的工具,都没有办法在通过光盘引导进pe后,在PE里面 ...


从PE里面启动判断引导分区?这个问题和思路就不对。这种情况下,你说说看什么叫做引导分区?
对于BIOS启动,一般是活动分区,每个带有引导文件的活动分区都有可能是引导分区,比如优盘移动硬盘,本地多个硬盘,都有可能是,你说通过程序怎么判断?而且g4d启动根本就不需要活动分区,只要MBR是g4d,可以从随便一个MBR分区启动windows,你怎么判断?

UEFI情况类似,什么叫做引导分区?ESP分区能算引导分区吗?不一定,有的电脑就没有ESP分区,全部都是NTFS分区都可以启动windows。存在/efi/microsoft/boot/bootmgfw.efi的算启动分区吗?可能多硬盘都有这个文件。

我的意思是bootmgr/bootmgfw.efi作为主引导引导硬盘或者vhd里面的windows或者硬盘里面的pe.wim的时判断引导分区,而不是PE.ISO启动的环境下去判断。PE知道啥?他怎么知道他是怎么被引导的?是ISO还是wim?那么多引导方式,如果用g4d/g4e/grub2用wimboot/ntloader/ntboot引导pe.wim,pe应该是无法确定你想要的那个引导分区,有g4d/g4e/grub2引导文件的分区算是“引导分区”吗?!显然未必是。有很多歧义,没有确定性答案,也就是没有答案。      
回复

使用道具 举报

374#
发表于 2021-6-23 16:29:07 | 只看该作者
请教一下版主,不论是DOS时代菜单的dpx脚本,还是CodeHz的工具,都没有办法在通过光盘引导进pe后,在PE里面正确找到引导分区,因我是虚拟机测试,我猜想实际情况从U盘进入的PE,也是找不到。

把PE安装到硬盘,从硬盘启动PE,那么则可正确找到,想必这些工具是通过启动系统自带的BCD之类的查询,

现在请问,是我的用法不对还是这些工具本身就不具备我上述所的功能呢?

点评

那个 api 的最初目的是 为了 在系统安装的第一次启动时 找到 bcd 并完善之。 你用 光盘启动,这个 api 当然 就找不到了。 不光是光盘启动 找不到,就是 用 grub 启动以后 调用 其他分区的 Bcd 启动,api 也会认为  详情 回复 发表于 2021-6-25 22:21
从PE里面启动判断引导分区?这个问题和思路就不对。这种情况下,你说说看什么叫做引导分区? 对于BIOS启动,一般是活动分区,每个带有引导文件活动分区都有可能是引导分区,比如优盘移动硬盘,本地多个硬盘,都有可  详情 回复 发表于 2021-6-25 19:28
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-12 04:09

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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