无忧启动论坛

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

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

    [复制链接]
181#
 楼主| 发表于 2021-1-10 15:53:23 | 只看该作者
CodeHz 发表于 2021-1-10 15:50
思考了一下,XP是不是启动分区和引导分区必须在同一个分区的啊(指正常引导的情况)

不一定啊,很久以前xp原安装光盘好像就会创建个小的100MB的分区,并激活,把启动文件NTLDR ntdetect.com,boot.ini等等这些文件放在活动分区上面。
但我没有用过原版ISO安装,我都是用ghost版本安装,都是把那个启动用的激活小分区合并到C盘了。
我有事出去下。
回复

使用道具 举报

182#
 楼主| 发表于 2021-1-10 15:54:47 | 只看该作者
CodeHz 发表于 2021-1-10 15:51
看下 MACHINE\SYSTEM\CurrentControlSet\Control  下有那些,我这里大概猜测SystemBootDevice既是系统盘 ...

你看下。[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]



CurrentControlSet.rar

53.18 KB, 下载次数: 5, 下载积分: 无忧币 -2

回复

使用道具 举报

183#
发表于 2021-1-10 16:01:33 | 只看该作者
smartmountfirmware-i386.exe (8.5 KB, 下载次数: 23)
改了下参数,现在会在FirmwareBootDevice找不到的情况下fallback到SystemBootDevice上,大概符合需求了(
回复

使用道具 举报

184#
 楼主| 发表于 2021-1-10 16:10:17 来自手机 | 只看该作者
CodeHz 发表于 2021-1-10 16:01
改了下参数,现在会在FirmwareBootDevice找不到的情况下fallback到SystemBootDevice上,大概符合需求了( ...

我有事出来了,手机回复,晚上回去看下,大神辛苦了,谢谢了!
回复

使用道具 举报

185#
 楼主| 发表于 2021-1-10 18:40:38 | 只看该作者
CodeHz 发表于 2021-1-10 16:01
改了下参数,现在会在FirmwareBootDevice找不到的情况下fallback到SystemBootDevice上,大概符合需求了( ...

在虚拟机里面的xp上面试了下,可以了!大神就是大神!

友情大神把全套源代码再分享下,我收藏起来。谢谢!

Windows XP Professional-2021-01-10-18-38-58.png (30.98 KB, 下载次数: 123)

Windows XP Professional-2021-01-10-18-38-58.png
回复

使用道具 举报

186#
发表于 2021-1-10 18:57:21 | 只看该作者
本帖最后由 CodeHz 于 2021-1-10 19:01 编辑

boot.zip (51.64 KB, 下载次数: 37)
(刚无忧崩了一下,不知道有没有上传成功)
附带一个简单的文档(

评分

参与人数 1无忧币 +10 收起 理由
liuzhaoyzz + 10 很给力!

查看全部评分

回复

使用道具 举报

187#
发表于 2021-1-10 19:01:45 | 只看该作者
liuzhaoyzz 发表于 2021-1-10 15:40
不需要泼冷水,只要微软的bootmgr/bootmgfw.efi启动的情况,我在167楼上测试了,没问题。大不了再让用户 ...

那有些机是oem激活,比如小马激活的情况,有些版本就不是直接bootmgr启动的
回复

使用道具 举报

188#
发表于 2021-1-10 19:02:41 | 只看该作者
如果是在特定的环境,那怎么判断都没问题,自己立个flag判断不就行了,
回复

使用道具 举报

189#
 楼主| 发表于 2021-1-10 19:03:50 | 只看该作者
CodeHz 发表于 2021-1-10 18:57
(刚无忧崩了一下,不知道有没有上传成功)
附带一个简单的文档(

可以下载。感谢大神分享!已收藏!
回复

使用道具 举报

190#
 楼主| 发表于 2021-1-10 19:05:53 | 只看该作者
江南一根葱 发表于 2021-1-10 19:01
那有些机是oem激活,比如小马激活的情况,有些版本就不是直接bootmgr启动的

一般情况下都是bootmgr/bootmgfw.efi为第一引导启动的。大不了加个提示罢了。足够用了。只能考虑大众的情况,其余情况不用考虑了。CodeHz大神的程序完美地解决了我的问题!
回复

使用道具 举报

191#
发表于 2021-1-10 20:27:35 | 只看该作者
liuzhaoyzz 发表于 2021-1-10 19:05
一般情况下都是bootmgr/bootmgfw.efi为第一引导启动的。大不了加个提示罢了。足够用了。只能考虑大众的情 ...

也是,不过反正各地区的大众不一样的
回复

使用道具 举报

192#
 楼主| 发表于 2021-1-11 08:18:01 | 只看该作者
本帖最后由 liuzhaoyzz 于 2021-1-11 08:23 编辑

我提交的误报反馈,360直接拒绝了,无语啊!搞不过他们!这些强盗公司什么时候倒闭!

亲爱的软件开发者
您好!
经360软件开放平台检测,您于2021-01-10 19:13:29提交的软件ID:3762225的smartmountfirmware-i386-xp.rar审核未通过。
您提交的备注信息:smartmountfirmware mount
显示启动分区。

拒绝原因:软件存在风险未通过检测,如有需要请添加本地信任使用

请参考360软件开放平台软件检测标准: http://open.soft.360.cn/guide/guide_2.html?i=4
感谢您对360软件开放平台的支持,如果您在使用过程中遇到问题,请及时与我们联系。
申诉邮箱:opensoft@360.cn 本邮件为系统自动发送,请勿直接回复!360软件开放平台
2021年01月10日
回复

使用道具 举报

193#
发表于 2021-1-11 08:46:07 来自手机 | 只看该作者
其实是没代码签名就会报毒,代码签名还挺贵的)
回复

使用道具 举报

194#
 楼主| 发表于 2021-1-11 08:59:37 | 只看该作者
本帖最后由 liuzhaoyzz 于 2021-1-11 09:06 编辑
CodeHz 发表于 2021-1-11 08:46
其实是没代码签名就会报毒,代码签名还挺贵的)

       我觉得不是代码签名的问题吧,bootice也没有做签名,有时候就报毒,有时候不报,大部分时候是不报的。360的报毒逻辑根本就没有逻辑,只要是他不认识的,他就认为是病毒,并以此收取保护费,这是典型的强盗逻辑,360哪里有什么查毒杀毒技术,360安全卫士是傅盛做出来的东西,后来因为三观不合,直接被周鸿祎踢出了管理层。

       smartmountfirmware已被我应用于RAMOS一键制作工具之中,如果这个被杀掉比较麻烦,但我已做了容错处理。


       我觉得如果用VC编译下smartmountfirmware,应该不会报毒吧。
回复

使用道具 举报

195#
发表于 2021-1-11 09:20:49 来自手机 | 只看该作者
试一下,修改了bootmgfw位置行不行,不要用第三方,直接efishell下运行它启动bug10,win7不能改变默认路径。

点评

我只能按照大众环境测试,改bootmgfw.efi位置的情况没有测试,你可以试试看,我估计只要是用bootmgfw.efi启动的都可以,包括放在/EFI/BOOT/bootmgfw.efi应该都可以。另外没兴趣尝试uefi-shell,你尝试下,把  详情 回复 发表于 2021-1-11 09:32
回复

使用道具 举报

196#
 楼主| 发表于 2021-1-11 09:32:05 来自手机 | 只看该作者
本帖最后由 liuzhaoyzz 于 2021-1-11 09:40 编辑
窄口牛 发表于 2021-1-11 09:20
试一下,修改了bootmgfw位置行不行,不要用第三方,直接efishell下运行它启动bug10,win7不能改变默认路径 ...


       我只能按照大众环境测试,改bootmgfw.efi位置的情况没有测试,你可以试试看,我估计只要是用bootmgfw.efi启动的windows都可以,包括放在/EFI/BOOT/bootx64.efi(bootmgfw.efi)应该都可以。我在开会呢。另外没兴趣尝试uefi-shell,你尝试下,把结果发上来看看。uefi-shell相对于微软的bootmgfw.efi,一样是相当于第三方,和g4e/grub2一样都是第三方引导器。
回复

使用道具 举报

197#
发表于 2021-1-11 10:58:31 来自手机 | 只看该作者
liuzhaoyzz 发表于 2021-1-11 08:18
我提交的误报反馈,360直接拒绝了,无语啊!搞不过他们!这些强盗公司什么时候倒闭!

感谢您对360软件 ...

感觉都是给没掏钱的没权没势的组织用的,一般很多小白下软件装一个附送一大堆的都装着360卫士和杀毒,但是都装进去了,明显不符合这个标准。
回复

使用道具 举报

198#
发表于 2021-1-11 15:39:23 | 只看该作者
diskpart 似乎有这功能呀
回复

使用道具 举报

199#
 楼主| 发表于 2021-1-11 15:52:18 | 只看该作者
dos时代菜鸟 发表于 2021-1-11 15:39
diskpart 似乎有这功能呀

diskpart似乎不能确定这个吧。
回复

使用道具 举报

200#
发表于 2021-1-11 19:30:53 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-11 19:59 编辑
liuzhaoyzz 发表于 2021-1-11 15:52
diskpart似乎不能确定这个吧。

dpx_3.7z (730 Bytes, 下载次数: 8)

如下 cmd 脚本代码,检测 当前操作系统(非pe) 所在卷盘符,以及 bcd 卷,并自动分配盘符。win10 win7 环境基本通过,xp 环境不知道行不行。可能 xp 下的 diskpart 不行。
另外一些 引导分区 是 id=12 的 特殊分区,win 不识别的,可能也不行。

要求在 管理员权限下运行。语言环境 简体中文,cmd 脚本编码:ansi


  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set str1=卷
  4. set str2=系统
  5. set str3=启动

  6. set ltrs=ABCDEFGHIJKLMNOPQRSTUVWXYZ

  7. for /f "delims=" %%c in ('echo list vol ^| diskpart') do (
  8.         for /f "tokens=1,2" %%h in ("%%c") do (
  9.                 if %%h==!str1! (if not %%i==### (
  10.                         set l0=%%c && set "l0= !l0:~1!"
  11.                         SET "ltr=!l0:~14,3!" && set "ltr=!ltr: =!"
  12.                         if "!ltr!"=="" set "ltr=*"
  13.                         for  %%x in (!ltr!) do  (set ltrs=!ltrs:%%x=!)
  14.                         SET info=!l0:~-9!  && set info=!info: =!
  15.                         if !info!==!str2! set BCD_VOL=%%i,!ltr!
  16.                         if !info!==!str3! set WIN_VOL=%%i,!ltr!
  17.                 ))
  18.         )
  19. )

  20. if /i "%1"=="/d" (
  21.         if not "!bcd_vol:~-1,1!"=="*" (
  22.                 echo !BCD_VOL! ==^> *
  23.                 (
  24.                         echo sele vol !bcd_vol:~0,1!
  25.                         echo remove
  26.                 ) >"%temp%\diskpart_temp.txt"
  27.                 diskpart /s "%temp%\diskpart_temp.txt"
  28.                 del "%temp%\diskpart_temp.txt"
  29.                 set bcd_vol=!bcd_vol:~0,1!,*
  30.         )
  31. ) else (
  32.         if "!bcd_vol:~-1,1!"=="*" (
  33.                 set 2ltr=!ltrs:~-1!
  34.                 echo !BCD_VOL! ==^> !2ltr!
  35.                 (
  36.                         echo sele vol !bcd_vol:~0,1!
  37.                         echo assign letter=!2ltr!
  38.                 ) >"%temp%\diskpart_temp.txt"
  39.                 diskpart /s "%temp%\diskpart_temp.txt"
  40.                 del "%temp%\diskpart_temp.txt"
  41.                 set bcd_vol=!bcd_vol:~0,1!,!2ltr!
  42.         )
  43. )

  44. echo.
  45. echo.
  46. echo.
  47. echo -----------------------------------------------------------------

  48. echo BCD_VOL=!BCD_VOL!
  49. ECHO WIN_VOL=!WIN_VOL!

  50. pause
复制代码


脚本自动找到 bcd_vol 卷,并判断是否配有盘符,如果没有,就把最后一个可用盘符分配给它。
附带参数 /d 用于 卸载 bcd_vol 卷。




回复

使用道具 举报

201#
发表于 2021-1-11 19:35:52 来自手机 | 只看该作者
liuzhaoyzz 发表于 2021-1-11 09:32
我只能按照大众环境测试,改bootmgfw.efi位置的情况没有测试,你可以试试看,我估计只要是用boo ...

意料之中,失败了。有的笔记本可以直接选择文件启动,我手里没有这种的了。

点评

试下 我那个 用 diskpart 的脚本,行不行。  详情 回复 发表于 2021-1-11 19:49
回复

使用道具 举报

202#
发表于 2021-1-11 19:49:24 | 只看该作者
窄口牛 发表于 2021-1-11 19:35
意料之中,失败了。有的笔记本可以直接选择文件启动,我手里没有这种的了。

试下 我那个 用 diskpart 的脚本,行不行。
回复

使用道具 举报

203#
发表于 2021-1-11 20:17:16 来自手机 | 只看该作者
dos时代菜鸟 发表于 2021-1-11 19:49
试下 我那个 用 diskpart 的脚本,行不行。

测试通过,xp和grub2主引导也成功。
回复

使用道具 举报

204#
发表于 2021-1-11 20:22:28 | 只看该作者
dos时代菜鸟 发表于 2021-1-11 19:30
如下 cmd 脚本代码,检测 当前操作系统(非pe) 所在卷盘符,以及 bcd 卷,并自动分配盘符。win10 win7 ...

研究了一下,至少在我这没有成功(
虽然语言是中文,但是diskpart还是以英文显示的,这就很尴尬(
然后我修改了脚本,这回能用了(卷 => Volume 系统 => System 引导 => Boot),然后发现它没有检测出原有的ESP分区(
如图

回复

使用道具 举报

205#
发表于 2021-1-11 20:33:06 | 只看该作者
CodeHz 发表于 2021-1-11 20:22
研究了一下,至少在我这没有成功(
虽然语言是中文,但是diskpart还是以英文显示的,这就很尴尬(
然后 ...

看来需要判断 语言环境才行,或者 修改关键词,脚本 前段 Str1 str2 str3 三个关键词,要改成英文。
回复

使用道具 举报

206#
发表于 2021-1-11 20:45:03 | 只看该作者
CodeHz 发表于 2021-1-11 20:22
研究了一下,至少在我这没有成功(
虽然语言是中文,但是diskpart还是以英文显示的,这就很尴尬(
然后 ...


做了下 代码页判断,英文环境下测试也通过了。看图。


  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. rem 找出bcd启动分区并分配盘符。 参数 /d 用于卸载

  4. for /f "tokens=2 delims=:" %%c in ('chcp') do (set page=%%c)
  5. if !page! equ 936 (
  6.         set str1=卷
  7.         set str2=系统
  8.         set str3=启动
  9. ) else (
  10.         set str1=Volume
  11.         set str2=System
  12.         set str3=boot
  13. )

  14. set ltrs=ABCDEFGHIJKLMNOPQRSTUVWXYZ

  15. echo -----------------------------------------------------------------

  16. for /f "delims=" %%c in ('echo list vol ^| diskpart') do (
  17.         for /f "tokens=1,2" %%h in ("%%c") do (
  18.                 if /i %%h==!str1! (if /i not %%i==### (
  19.                         echo %%c
  20.                         set l0=%%c && set "l0= !l0:~1!"
  21.                         SET "ltr=!l0:~14,3!" && set "ltr=!ltr: =!"
  22.                         if /i "!ltr!"=="" set "ltr=*"
  23.                         for  %%x in (!ltr!) do  (set ltrs=!ltrs:%%x=!)
  24.                         SET info=!l0:~-9!  && set info=!info: =!
  25.                         if /i !info!==!str2! set BCD_VOL=%%i,!ltr!
  26.                         if /i !info!==!str3! set WIN_VOL=%%i,!ltr!
  27.                 ))
  28.         )
  29. )

  30. echo.
  31. echo.
  32. echo !ltrs!
  33. if /i "%1"=="/d" (
  34.         if /i not "!bcd_vol:~-1,1!"=="*" (
  35.                 echo !BCD_VOL! ==^> *
  36.                 (
  37.                         echo sele vol !bcd_vol:~0,1!
  38.                         echo remove
  39.                         echo list vol
  40.                 ) >"%temp%\diskpart_temp.txt"
  41.                 set bcd_vol=!bcd_vol:~0,1!,*
  42.         )
  43. ) else (
  44.         if /i "!bcd_vol:~-1,1!"=="*" (
  45.                 set 2ltr=!ltrs:~-1!
  46.                 echo !BCD_VOL! ==^> !2ltr!
  47.                 (
  48.                         echo sele vol !bcd_vol:~0,1!
  49.                         echo assign letter=!2ltr!
  50.                         echo list vol
  51.                 ) >"%temp%\diskpart_temp.txt"
  52.                 set bcd_vol=!bcd_vol:~0,1!,!2ltr!
  53.         )
  54. )
  55. if exist "%temp%\diskpart_temp.txt" (
  56.         diskpart /s "%temp%\diskpart_temp.txt"
  57.         del "%temp%\diskpart_temp.txt"
  58. )

  59. echo.
  60. echo -----------------------------------------------------------------

  61. echo BCD_VOL=!BCD_VOL!
  62. ECHO WIN_VOL=!WIN_VOL!
  63. echo.
  64. echo.

  65. pause
复制代码






回复

使用道具 举报

207#
发表于 2021-1-11 20:45:40 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-11 20:47 编辑

咋还 重复回复了呢?

改了下 代码页判断。也不知道行不行。

bcd_vol2.PNG (29.11 KB, 下载次数: )

bcd_vol2.PNG

dpx_3.1.cmd.7z

817 Bytes, 下载次数: , 下载积分: 无忧币 -2

回复

使用道具 举报

208#
发表于 2021-1-11 20:52:28 | 只看该作者
本帖最后由 CodeHz 于 2021-1-11 21:19 编辑
dos时代菜鸟 发表于 2021-1-11 20:45
咋还 重复回复了呢?

改了下 代码页判断。也不知道行不行。

你有没有注意到另一个问题,我前面截图已经有ESP分区在Z盘,但是diskpart没有扫描出来(研究了一下, subst出来的东西也不会在diskpart上显示。。。
mountvol Z: /S出来的也不会显示
我的那个工具整出来的也不显示()
合计这半天只有diskpart自己挂载的能显示(
这边看来,还是mountvol显示的全面一点,至少我测试各种工具挂载的ESP都能检测出来)(但是也有一些情况会漏)
回复

使用道具 举报

209#
发表于 2021-1-11 21:27:54 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-11 21:30 编辑
CodeHz 发表于 2021-1-11 20:52
你有没有注意到另一个问题,我前面截图已经有ESP分区在Z盘,但是diskpart没有扫描出来(研究了一下, subs ...

嗯,这是个问题。

diskpart 还是有局限性的。
如果 用 diskpart 找出 bcd 引导分区,在通过其他方法明确其是否 有被分配了盘符。应该能更全面些。

比如 用vbs 获取 分区对应的 盘符,
再比如 pecmd 记得 pecmd 可以获取 同一个卷对应的 多个盘符的情况,就是如果一个卷 被分配了 不止一个盘符,也可以找出来。
回复

使用道具 举报

210#
 楼主| 发表于 2021-1-11 22:31:26 | 只看该作者
dos时代菜鸟 发表于 2021-1-11 20:45
咋还 重复回复了呢?

改了下 代码页判断。也不知道行不行。

我测试了下UEFI下从ESP分区启动WIN10.VHD是正确的,/d参数卸载没问题。
UEFI下从FAT32分区启动WIN7.VHD是正确的,/d参数卸载没问题。
我一个帖子引来众多高手啊!你的代码很简洁,谢谢分享。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-23 15:40

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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