无忧启动论坛

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

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

    [复制链接]
31#
发表于 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
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

34#
发表于 2021-1-9 19:28:46 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-9 19:21
大神能否回复下我在楼上的第二个问题,我这边没有普通管理员的测试环境,我这边读写都正常。Nsud ...

主要是explorer自身不能提权,nsudo也不行(结束explorer的方法在我这也没法提权,它仍然会自己降低到普通用户的权限)

重复挂载这个我到时候看看,我觉得应该是可以解决的)

点评

explorer自身不能提权挺麻烦的,论坛里面有采用第三方的文件管理器解决问题的,有点绕弯,但是也是没有办法的办法。 其实我的需求很简单,就是需要返回启动分区的盘符,无论这个启动分区是MBR/GPT,无  详情 回复 发表于 2021-1-9 19:54
回复

使用道具 举报

35#
发表于 2021-1-9 20:20:28 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-9 19:54
explorer自身不能提权挺麻烦的,论坛里面有采用第三方的文件管理器解决问题的,有点绕弯,但 ...

所以我觉定加一个程序检测启动磁盘(特殊字符的驱动器不会被检测到)
用法见图,批处理可以通过判断errorlevel确定有没有找到,(我不确定能不能在各种不同情况下工作,请测试一遍,不行的话大概就检测不了了,这里面情况比较复杂,我选择了一个理论上能用的方法)


boot.zip (42.24 KB, 下载次数: 12)

点评

恳请大神把程序搞成三合一的。否则批处理就需要做大量的工作:1、执行detectfirmware-i386→ devicename: \Device\HarddiskVolume1, devicename: \Device\HarddiskVolume1→看到后面 devicename: \Device\HarddiskV  详情 回复 发表于 2021-1-9 21:29
明白了,还要将ntdll.h复制过去  详情 回复 发表于 2021-1-9 20:59
请教一下这个编译环境的用法: 我是先执行了install.bat,再把detectfirmware.tjs拷到同目录, 这时无论是将install.bat改成下图所示 还是直接双击detectfirmware.tjs,都没见生成文件,不知道该怎么使用呢  详情 回复 发表于 2021-1-9 20:56
大神,是不是把问题搞得太复杂了。你把大部分的工作都交给了批处理了。 能不能把这三个程序合成一个程序findbootdevice? 1、看下firmware-i386.exe→ FirmwareBootDevice→ [+] mountpoints→[-] mount point: \D  详情 回复 发表于 2021-1-9 20:55
回复

使用道具 举报

36#
发表于 2021-1-9 21:01:31 | 显示全部楼层
527104427 发表于 2021-1-9 20:56
请教一下这个编译环境的用法:
我是先执行了install.bat,再把detectfirmware.tjs拷到同目录,
这时无 ...

其实不用安装,只需要复制tjs.exe的路径(全部文件解压后的),然后在那几个tjs文件的目录下(cd进去)执行 <tjs的路径> xxx.tjs 即可编译运行。。
(因为install的方法只能同时用一个架构的,双击运行的时候工作目录是不对的,我这里刚好引用到了当前目录的文件,所以就出错了)
回复

使用道具 举报

37#
发表于 2021-1-9 21:04:02 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-9 20:55
大神,是不是把问题搞得太复杂了。你把大部分的工作都交给了批处理了。
能不能把这三个程序合成一个程序 ...

因为分开好修改啊(
比如需求变了,不又得重写一个了吗(
然后现在不是测试能不能用吗,如果都写在一起,其中几个步骤出错了,又得重新写一个对吧*
回复

使用道具 举报

38#
发表于 2021-1-9 21:54:12 | 显示全部楼层
我记得64位还是要保留一下的,因为有的pe只有64位,没有WoW支持,这样32位的直接就运行不了了(
所以最起码还得加个批处理

点评

32位64位如果都有最好了。一般情况下,还是32位的通用性更好。  详情 回复 发表于 2021-1-9 22:07
回复

使用道具 举报

39#
发表于 2021-1-9 23:21:31 | 显示全部楼层
本帖最后由 CodeHz 于 2021-1-9 23:24 编辑

smart.zip (9.26 KB, 下载次数: 17)
那么大概就是这个了,有问题明天修(
附上32位/64位兼容batch(主要提供给仅64位支持的pe用)
  1. @echo off
  2. setlocal enableextensions enabledelayedexpansion
  3. 2>nul call :set_arch_%PROCESSOR_ARCHITECTURE%
  4. if errorlevel 1 (goto :unsupported_arch) else (goto :start)
  5. exit /b
  6. :set_arch_AMD64
  7. set ARCH=x86_64
  8. exit /b
  9. :set_arch_x86
  10. set ARCH=i386
  11. exit /b
  12. :unsupported_arch
  13. echo Unsupported architecture: %PROCESSOR_ARCHITECTURE%
  14. exit /b
  15. :start
  16. smartmountfirmware-%ARCH% %*
  17. endlocal
复制代码

用法:smartmountfirmware mount即可获得一个盘符smartmountfirmware unmount即可取消挂载
smartmountfirmware dump用于调试目的

不想要调试输出可以用 2<nul smartmountfirmware mount 的方式去掉
也可以在批处理里拿到输出
for /f usebackq %%i in (`2^<nul smartmountfirmware mount`) do set DRIVE=%%i

点评

感谢大神,大神辛苦了! 早上起来测试了几个环境,应该没问题,晚点详细测试下,现在有事要出去。 您的批处理判断操作系统位数有问题,某些环境下会出错。  详情 回复 发表于 2021-1-10 10:01
回复

使用道具 举报

40#
发表于 2021-1-10 14:13:55 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-10 14:03
smartmountfirmware测试结果
一、UEFI下从MBR-激活FAT32启动:没有重复盘符现象,卸载启动分区盘符正常。
...

xp的dll发来给我研究一下,有如下几个
kernel32.dll
kernelbase.dll
user32.dll
advapi32.dll

点评

大神,感觉应该是编译模式选项的问题吧?VC2015下面,编译模式选择支持xp就可以了。 你说的几个dll我上传上来,kernelbase.dll-xp下面没有。  详情 回复 发表于 2021-1-10 14:24
回复

使用道具 举报

41#
发表于 2021-1-10 14:28:10 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-10 14:24
大神,感觉应该是编译模式选项的问题吧?VC2015下面,编译模式选择支持xp就可以了。
你说的几个dll我上 ...

准确说,是我发现它符号选择到了kernel32上去了,应该链接到advapi32的就能支持xp了。。。
回复

使用道具 举报

42#
发表于 2021-1-10 14:45:22 | 显示全部楼层
smartmountfirmware-i386.exe (8.67 KB, 下载次数: 7)
理论上兼容xp(就解决那一个弹框,其他的弹框就无能为力了)的版本,能用正常的版本就别用这个(

点评

还是不行啊,大神。  详情 回复 发表于 2021-1-10 15:17
回复

使用道具 举报

43#
发表于 2021-1-10 15:26:56 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-10 15:17
还是不行啊,大神。我感觉用VC做静态编译,肯定能够兼容XP。

smartmountfirmware-i386.exe (8.5 KB, 下载次数: 3)
这个版本应该可以了,我用tcc的功能重新生成了导入表,之前居然忘记了tcc有这个功能23333
用xp的dll生成导入表就可以生成兼容xp的版本了
(大概吧,也不是很确定,下个版本直接在tjs镜像里加入tcc好了

点评

结果显示不出来啊。好像出错了。  详情 回复 发表于 2021-1-10 15:31
回复

使用道具 举报

44#
发表于 2021-1-10 15:32:16 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-10 15:31
结果显示不出来啊。好像出错了。

你去注册表看看有没有这个先。。我觉得怕是根本没有)顺便把xp内核也发个来看看
ntoskrnl.exe

点评

你说的注册表是哪里? ntoskrnl.dll我上传上来。  详情 回复 发表于 2021-1-10 15:39
回复

使用道具 举报

45#
发表于 2021-1-10 15:37:35 | 显示全部楼层
江南一根葱 发表于 2021-1-10 15:32
我是来泼冷水的,我认为多硬盘多种结构的环境来“自动”确认,是不太可靠的,
我个人对这种工具也是相当不 ...

我这个不是基于文件结构来确定的,而是按照windows自己确定引导分区的方法反推注册表位置的方法来找的(
所以实际上我这个完全没有去检查硬盘的结构,插入一百个硬盘也没有关系(
(那个解析路径实际上是在nt内核对象里做符号链接解析,不会涉及实际文件的关系
回复

使用道具 举报

46#
发表于 2021-1-10 15:50:21 | 显示全部楼层
思考了一下,XP是不是启动分区和引导分区必须在同一个分区的啊(指正常引导的情况)

点评

不一定啊,很久以前xp原安装光盘好像就会创建个小的100MB的分区,并激活,把启动文件NTLDR ntdetect.com,boot.ini等等这些文件放在活动分区上面。 但我没有用过原版ISO安装,我都是用ghost版本安装,都是把那个启  详情 回复 发表于 2021-1-10 15:53
回复

使用道具 举报

47#
发表于 2021-1-10 15:51:49 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-10 15:43
HKLM\SYSTEM\CurrentControlSet\Control\FirmwareBootDevice
xp下面没有这个主键。我用"FirmwareBootDevic ...

看下 MACHINE\SYSTEM\CurrentControlSet\Control  下有那些,我这里大概猜测SystemBootDevice既是系统盘也是引导盘)

点评

你看下。[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]  详情 回复 发表于 2021-1-10 15:54
回复

使用道具 举报

48#
发表于 2021-1-10 16:01:33 | 显示全部楼层
smartmountfirmware-i386.exe (8.5 KB, 下载次数: 23)
改了下参数,现在会在FirmwareBootDevice找不到的情况下fallback到SystemBootDevice上,大概符合需求了(

点评

在虚拟机里面的xp上面试了下,可以了!大神就是大神! 友情大神把全套源代码再分享下,我收藏起来。谢谢!  详情 回复 发表于 2021-1-10 18:40
我有事出来了,手机回复,晚上回去看下,大神辛苦了,谢谢了!  详情 回复 发表于 2021-1-10 16:10
回复

使用道具 举报

49#
发表于 2021-1-10 18:57:21 | 显示全部楼层
本帖最后由 CodeHz 于 2021-1-10 19:01 编辑

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

点评

可以下载。感谢大神分享!已收藏!  详情 回复 发表于 2021-1-10 19:03

评分

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

查看全部评分

回复

使用道具 举报

50#
发表于 2021-1-11 08:46:07 来自手机 | 显示全部楼层
其实是没代码签名就会报毒,代码签名还挺贵的)

点评

我觉得不是代码签名的问题吧,bootice也没有做签名,有时候就报毒,有时候不报,大部分时候是不报的。360的报毒逻辑根本就没有逻辑,只要是他不认识的,他就认为是病毒,并以此收取保护费,这是典型的强盗逻  详情 回复 发表于 2021-1-11 08:59
回复

使用道具 举报

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

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

点评

做了下 代码页判断,英文环境下测试也通过了。看图。 [attachimg]472670[/attachimg]  详情 回复 发表于 2021-1-11 20:45
做了下 代码页判断,英文环境下测试也通过了。看图。 [attachimg]472670[/attachimg]  详情 回复 发表于 2021-1-11 20:45
看来需要判断 语言环境才行,或者 修改关键词,脚本 前段 Str1 str2 str3 三个关键词,要改成英文。  详情 回复 发表于 2021-1-11 20:33
回复

使用道具 举报

52#
发表于 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都能检测出来)(但是也有一些情况会漏)

点评

嗯,这是个问题。 diskpart 还是有局限性的。 如果 用 diskpart 找出 bcd 引导分区,在通过其他方法明确其是否 有被分配了盘符。应该能更全面些。 比如 用vbs 获取 分区对应的 盘符,记得 vbs 可以获取 同一  详情 回复 发表于 2021-1-11 21:27
回复

使用道具 举报

53#
发表于 2021-1-12 10:14:16 来自手机 | 显示全部楼层
窄口牛 发表于 2021-1-12 09:32
盘符已分配可以注册表获取。

不行,注册表里的只有持久分配的才有((subst的没有
回复

使用道具 举报

54#
发表于 2021-1-12 10:37:12 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2021-1-12 10:15
不知道pecmd 和 subst 映射的盘符,注册表能否体现出来
还是 有其他的 注册表位置 体现。


这就是为啥我用的方法是递归的解析每个盘符的实际指向目标,并分成3种情况,返回找不到的就是没这个盘,解析到引导分区的就是引导盘,解析到别的盘的就是别的情况(

点评

fsutil fsinfo drives 找出所有盘符,然后在用 diskpart 做,不管 bcd_vol 有没有被挂载盘符,只要 diskpart 没有认出来,就给啊分一个 没有被占用的盘符,然后,用完了,在卸载之, diskpart 之对 自己的行为负责,  详情 回复 发表于 2021-1-12 10:45
回复

使用道具 举报

55#
发表于 2021-1-12 10:55:57 来自手机 | 显示全部楼层
(不幸的是,fsutils的行为在不同系统有所区别,导致提取已分配盘符变得困难(https://ss64.org/viewtopic.php?id=327

点评

无非是 回车符 的站位问题,这个 我好像在 论坛里面 见过,我也解决了,忘了咋解决得了。还得研究下  详情 回复 发表于 2021-1-12 11:06
回复

使用道具 举报

56#
发表于 2021-1-13 14:18:01 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-13 14:08
可能会有影响的。比如说这个引导盘符恰巧是当前系统的我的文档所转移到的盘符,强制卸载这个盘符之后,许 ...

(思考了一下,我那个smartmountfirmware好像也会尝试卸载原有的,只不过恰好卸载不掉其他方式挂载的而已(巧合)
回复

使用道具 举报

57#
发表于 2021-1-13 14:28:54 | 显示全部楼层
说到不小心卸载正在用的盘,我之前还遇到过,直接把d盘挂没了,还好mountvol还在,恢复回来了(
幸好没把c盘卸载了,那肯定就只能强制关机了
回复

使用道具 举报

58#
发表于 2021-1-13 15:19:05 | 显示全部楼层
liuzhaoyzz 发表于 2021-1-13 15:09
大神,你那边没有vc编译环境吗?你给的源代码能否用vc编译?我感觉vc编译的程序,360应该能过吧。大学时 ...

(vc当然有,但是版本都是2019的了,xp兼容模式早就没了(
这个改成vc兼容的倒也不难把那几个宏改成空的实现应该就好了(#include <tjs.h> 改成 #define scoped(x))后果就是泄露几个句柄,但是一次性运行的程序泄露没有关系(
回复

使用道具 举报

59#
发表于 2021-1-14 00:06:51 来自手机 | 显示全部楼层
本帖最后由 CodeHz 于 2021-1-14 00:13 编辑
dos时代菜鸟 发表于 2021-1-13 21:41
发现 firmware64.exe 的问题:
当 pe 环境下 diskpart 把原本有盘符的 bcd 启动分区 更换了其他盘符,而 f ...

你是不是跑在不同的特权级别,看你标题一个管理员一个不是
这玩意挺复杂的,有全局的挂载,和会话的挂载两种方式,我firmware那个读挂载点是通过mountmgr读取的,这个读取到的是会话的挂载点信息。。。所以后面smartmount就干脆不用这个方法判断了,直接解析DosDevices,系统会帮我合并全局挂载点和会话挂载(或者符号链接)

你从我前面混乱的描述就能看出,这里起码有3种挂盘的方法。。。。(涉及3种不同的api,到内核层面都不同的那种)
subst的就是直接(会话级别的)符号链接,不会产生挂载点的(我smartmount就是利用subst相同原理,但是改了参数以支持挂载引导盘(选择这种是因为几乎没人用这个方法,不容易冲突)。。。(当然这种方法firmware读不到)

然后mountvol采用的方法是mountmgr系统服务(简单理解就是有uuid的,注册表看得到的,mountmgr负责维护uuid的对应关系)解析常规磁盘的挂载点,但是mountvol为引导分区做了特殊处理,你看显示的模式就和别的不一样,实际上是和uuid无关的(对应uuid的挂载点可以为空),所以有时候会出现mountvol读的到,而diskpart拿不到的情况(
wmi service也简单研究了一下,发现它同样也是利用mountmgr系统服务,所以它也可以拿不到已经挂载的引导分区的挂载情况

此外还有4种描述磁盘的方法,一种是直接\Device\HarddiskVolumeX(windows自己用的设备文件),一种是使用 \Device\HarddiskX\PartitionY(windows映射的符号链接,目标是前者),一种是用\ArcName\(引导时确定的,然后符号链接到前者)

还有就是用\Device里的uuid(mountmgr负责维护,也是符号链接到第一种),(然后这些路径还在\GLOBAL??里有映射,考虑有递归的情况,实际上可以有无数种路径描述同一个设备,这就是windows )

这也是我为啥放弃用mountmgr来读挂载点的原因,这玩意就坑爹,还是直接解析符号链接来的简单
回复

使用道具 举报

60#
发表于 2021-1-14 19:46:41 | 显示全部楼层
窄口牛 发表于 2021-1-14 19:12
有XP可用的bcdedit吗?

按文档是没有的,,从 win7 开始提供
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-21 06:49

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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