无忧启动论坛

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

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

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

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

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

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

使用道具 举报

422#
发表于 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 就能找到,唯独只读的 光盘不行。
回复

使用道具 举报

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

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

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

使用道具 举报

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

使用道具 举报

425#
 楼主| 发表于 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
回复

使用道具 举报

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

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

使用道具 举报

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

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

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

使用道具 举报

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


回复

使用道具 举报

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

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

使用道具 举报

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

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

点评

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

使用道具 举报

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

https://liuzhaoyzz.lanzoui.com/iHoXksis2ta

点评

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

使用道具 举报

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

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

使用道具 举报

433#
发表于 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
回复

使用道具 举报

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

抱歉 autoit 不是很熟。
回复

使用道具 举报

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

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

使用道具 举报

436#
发表于 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
回复

使用道具 举报

437#
发表于 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 去获取
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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


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

使用道具 举报

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

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

使用道具 举报

445#
发表于 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. }
复制代码
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-10 06:26

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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