liuzhaoyzz 发表于 2021-1-9 19:21:17

本帖最后由 liuzhaoyzz 于 2021-1-9 19:23 编辑

CodeHz 发表于 2021-1-9 18:49
是的,我懒得写大小写转换了,反正就一个参数)
      大神能否回复下我在楼上的第二个问题,我这边没有普通管理员的测试环境,我这边读写都正常。Nsudo能否搞定mountfirmware挂载ESP分区后的的写入权限问题?以管理员身份运行mountfirmware.exe z:能否搞定ESP分区的写入权限问题?

另外,mountfirmware.exe能否直接规避盘符重复挂载的问题,比如说如果启动分区已经有了一个盘符G:了,用户已经很明确地知道这个G:盘就是启动盘,mountfirmware.exe z:会让用户迷惑,引导分区不是G:盘吗,怎么变成了Z:盘了?这个问题用批处理结合firmware-i386.exe→ FirmwareBootDevice→ [+] mountpoints→[-] mount point: \DosDevices\是否是空白的,可以规避,但我总感觉如果mountfirmware.exe提前判断下,更好。

CodeHz 发表于 2021-1-9 19:28:46

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

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

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

liuzhaoyzz 发表于 2021-1-9 19:54:54

本帖最后由 liuzhaoyzz 于 2021-1-9 19:56 编辑

CodeHz 发表于 2021-1-9 19:28
主要是explorer自身不能提权,nsudo也不行(结束explorer的方法在我这也没法提权,它仍然会自己降低到普 ...

      
explorer自身不能提权挺麻烦的,论坛里面有采用第三方的文件管理器解决问题的,有点绕弯,但是也是没有办法的办法。

其实我的需求很简单,就是需要返回启动分区的盘符,无论这个启动分区是MBR/GPT,无论分区格式是FAT32/NTFS/ESP,程序只需要告诉我这个启动分区的盘符倒底是什么就行了,如果原来有盘符就直接告诉我,如果没有盘符就分配个盘符告诉我,并且提供个参数卸载程序分配的盘符,用于恢复现场,原来没有分配盘符的删除盘符之后恢复用户原来的原状。当然你的两个程序里面输出的结果很多很详细,这是非常好的!用于定位问题很方便。

CodeHz 发表于 2021-1-9 20:20:28

liuzhaoyzz 发表于 2021-1-9 19:54
explorer自身不能提权挺麻烦的,论坛里面有采用第三方的文件管理器解决问题的,有点绕弯,但 ...
所以我觉定加一个程序检测启动磁盘(特殊字符的驱动器不会被检测到)
用法见图,批处理可以通过判断errorlevel确定有没有找到,(我不确定能不能在各种不同情况下工作,请测试一遍,不行的话大概就检测不了了,这里面情况比较复杂,我选择了一个理论上能用的方法)




liuzhaoyzz 发表于 2021-1-9 20:55:43

本帖最后由 liuzhaoyzz 于 2021-1-9 21:04 编辑

CodeHz 发表于 2021-1-9 20:20
所以我觉定加一个程序检测启动磁盘(特殊字符的驱动器不会被检测到)
用法见图,批处理可以通过判断erro ...
大神,是不是把问题搞得太复杂了。你把大部分的工作都交给了批处理了。
能不能把这三个程序合成一个程序findbootdevice?
1、看下firmware-i386.exe→ FirmwareBootDevice→ [+] mountpoints→[-] mount point: \DosDevices\是否是空白的,如果\DosDevices\不是空白,比如G:,直接作为findbootdevice的返回值G:告知用户即可,任务完成。
2、如果\DosDevices\是空白,在26个字母中查找空白盘符,以z:为例,用mountfirmware z:挂载启动分区,并用Z:作为findbootdevice的返回值告知用户即可。26个字母盘符已经足够用了啊,谁能有26个分区盘符?
3、用户侧可以用findbootdevice z: /D这样子的命令删除启动盘符,恢复现场,当然用户侧不删除启动盘符也行,看他自己的需求。
上面的1 2 3您的程序里面都已经实现了啊,为啥要把大量的工作交给批处理?
我想要的是执行
1、findbootdevice,返回g:或者z:
2、findbootdevice z: /D恢复原状



CodeHz 发表于 2021-1-9 21:01:31

527104427 发表于 2021-1-9 20:56
请教一下这个编译环境的用法:
我是先执行了install.bat,再把detectfirmware.tjs拷到同目录,
这时无 ...

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

CodeHz 发表于 2021-1-9 21:04:02

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

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

liuzhaoyzz 发表于 2021-1-9 21:29:32

本帖最后由 liuzhaoyzz 于 2021-1-9 21:32 编辑

CodeHz 发表于 2021-1-9 20:20
所以我觉定加一个程序检测启动磁盘(特殊字符的驱动器不会被检测到)
用法见图,批处理可以通过判断erro ...
恳请大神把程序搞成三合一的。否则批处理就需要做大量的工作:
1、执行detectfirmware-i386→ devicename: \Device\HarddiskVolume1, devicename: \Device\HarddiskVolume1→看到后面 devicename: \Device\HarddiskVolume1没有盘符。
2、遍历26个字母查找空盘,以Z:为例。
3、执行mountfirmware-i386.exe Z:把启动分区盘符赋值为Z:。
4、执行mountfirmware-i386.exe Z: /D恢复现场。
第1步里面,批处理不容易判断\Device\HarddiskVolume1在后面有没有盘符,这个是变量。detectfirmware-i386也没有给个关键字让批处理便于搜索\Device\HarddiskVolume1倒底有没有盘符。
第1步~第3步完全可以在程序内部搞定,然后一个命令就足够了。但是如果让批处理搞定,都是一片片的代码,太复杂了!友情大神看下nttwqz和5大的程序返回值,只是需要一个盘符,非常简单啊。当然您的程序里面中间返回值非常好,建议保留。







liuzhaoyzz 发表于 2021-1-9 21:50:29

527104427 发表于 2021-1-9 21:36
detectfirmware-i386 2>nul就只返回盘符,没有就为空

不是这个意思。。。mountfirmware-i386.exe 2>nul没有返回有用的信息。
[?] usage: mountfirmware-i386.exe ?:

CodeHz 发表于 2021-1-9 21:54:12

我记得64位还是要保留一下的,因为有的pe只有64位,没有WoW支持,这样32位的直接就运行不了了(
所以最起码还得加个批处理

liuzhaoyzz 发表于 2021-1-9 21:58:49

detectfirmware-i386 2>nul 这个( 用 for in 就能提取了
如果提取不到呢?批处理再找空盘,然后再调用mountfirmware-i386.exe Z:?
就不能简单点吗?找空盘、调用mountfirmware-i386.exe Z:都可以放在程序内部一起搞定即可。
我只是要个盘符啊!就只要一个字母而已,难道就这么难吗?

liuzhaoyzz 发表于 2021-1-9 22:07:59

CodeHz 发表于 2021-1-9 21:54
我记得64位还是要保留一下的,因为有的pe只有64位,没有WoW支持,这样32位的直接就运行不了了(
所以最起 ...

      32位64位如果都有最好了。一般情况下,还是32位的通用性更好。

CodeHz 发表于 2021-1-9 23:21:31

本帖最后由 CodeHz 于 2021-1-9 23:24 编辑


那么大概就是这个了,有问题明天修(
附上32位/64位兼容batch(主要提供给仅64位支持的pe用)
@echo off
setlocal enableextensions enabledelayedexpansion
2>nul call :set_arch_%PROCESSOR_ARCHITECTURE%
if errorlevel 1 (goto :unsupported_arch) else (goto :start)
exit /b
:set_arch_AMD64
set ARCH=x86_64
exit /b
:set_arch_x86
set ARCH=i386
exit /b
:unsupported_arch
echo Unsupported architecture: %PROCESSOR_ARCHITECTURE%
exit /b
:start
smartmountfirmware-%ARCH% %*
endlocal
用法:smartmountfirmware mount即可获得一个盘符smartmountfirmware unmount即可取消挂载
smartmountfirmware dump用于调试目的

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

liuzhaoyzz 发表于 2021-1-10 10:01:56

本帖最后由 liuzhaoyzz 于 2021-1-10 15:25 编辑

CodeHz 发表于 2021-1-9 23:21
那么大概就是这个了,有问题明天修(
附上32位/64位兼容batch(主要提供给仅64位支持的pe用)


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

liuzhaoyzz 发表于 2021-1-10 14:03:42

本帖最后由 liuzhaoyzz 于 2021-1-11 09:37 编辑

smartmountfirmware测试结果
一、UEFI下从MBR-激活FAT32启动:没有重复盘符现象,卸载启动分区盘符正常。
1、WIN10.VHD,启动分区有盘符,OK!√
2、WIN10.VHD,启动分区无盘符,自动分配了盘符,OK!√
3、WIN8.1.VHD,启动分区有盘符,OK!√
4、WIN8.1.VHD,启动分区无盘符,自动分配了盘符,OK!√
5、WIN7.VHD,启动分区有盘符,OK!√
6、WIN7.VHD,启动分区无盘符,自动分配了盘符,OK!√
7、bootmgfw.efi→WIN10PE.WIM,启动分区有盘符,OK!√
7、bootmgfw.efi→WIN10PE.WIM,启动分区无盘符,自动分配了盘符,OK!√
8、grub2x64.efi→WIN10PE.ISO,结果是空值,这是正确的结果!OK!√


二、UEFI下从GPT硬盘ESP启动:没有重复盘符现象,卸载启动分区盘符正常。ESP分区读写正常(我是在内置超级管理员用户下测试的)。
1、WIN10.VHD,启动分区提前用bootice或者guyue2011的findESP程序分配盘符,smartmountfirmware准确找到,并且能够精准卸载,OK!√
2、WIN10.VHD,启动分区无盘符,自动分配了盘符,OK!√
3、WIN8.1.VHD,启动分区提前用bootice或者guyue2011的findESP程序分配盘符,smartmountfirmware准确找到,并且能够精准卸载,OK!√
4、WIN8.1.VHD,启动分区无盘符,自动分配了盘符,OK!√
5、WIN7.VHD,启动分区提前用bootice或者guyue2011的findESP程序分配盘符,smartmountfirmware准确找到,并且能够精准卸载,OK!√
6、WIN7.VHD,启动分区无盘符,自动分配了盘符,OK!√
7、bootmgfw.efi→WIN10PE.WIM,启动分区提前用bootice或者guyue2011的findESP程序分配盘符,smartmountfirmware准确找到,并且能够精准卸载,OK!√
7、bootmgfw.efi→WIN10PE.WIM,启动分区无盘符,自动分配了盘符,OK!√
8、grub2x64.efi→WIN10PE.ISO,结果是空值,这是正确的结果!OK!√

三、BIOS下从MBR-激活FAT32启动:
1、WIN10.VHD,启动分区有盘符,OK!√
2、WIN10.VHD,启动分区无盘符,自动分配了盘符,OK!√
3、WIN8.1.VHD,启动分区有盘符,OK!√
4、WIN8.1.VHD,启动分区无盘符,自动分配了盘符,OK!√
5、WIN7.VHD,启动分区有盘符,OK!√
6、WIN7.VHD,启动分区无盘符,自动分配了盘符,OK!√
7、bootmgr→WIN10PE.WIM,启动分区有盘符,OK!√
7、bootmgr→WIN10PE.WIM,启动分区无盘符,自动分配了盘符,OK!√
8、bootmgr→grldr中转→WIN10PE.ISO,结果是空值,这是正确的结果!OK!√
9、ntldr→32位的xp系统,结果是空值,弹出错误,“无法定位程序输入点RegCloseKey于动态链接库kerne132.dl1上”,卸载盘符也出错。看样子不支持XP???


四、360安全卫士扫描:通过扫描,没有被杀!但是突然报了个病毒。(大家都知道没有病毒,我只是看程序能否在360的恶劣环境中生存!78楼。我已向360流氓卫士发起误报反馈!360软件开放平台误报反馈 https://open.soft.360.cn/report.php)



衷心感谢大神CodeHz!



CodeHz 发表于 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

liuzhaoyzz 发表于 2021-1-10 14:24:37

本帖最后由 liuzhaoyzz 于 2021-1-13 07:28 编辑

CodeHz 发表于 2021-1-10 14:13
xp的dll发来给我研究一下,有如下几个
kernel32.dll
kernelbase.dll

大神,感觉应该是编译模式选项的问题吧?VC2015下面,编译模式选择支持xp就可以了。项目菜单->项目属性->配置属性->常规->平台工具集,选择“Visual Studio 2015 - Windows XP (v140_xp)”。
你说的几个dll我上传上来,kernelbase.dll-xp下面没有。

CodeHz 发表于 2021-1-10 14:28:10

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

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

CodeHz 发表于 2021-1-10 14:45:22


理论上兼容xp(就解决那一个弹框,其他的弹框就无能为力了)的版本,能用正常的版本就别用这个(

liuzhaoyzz 发表于 2021-1-10 15:17:54

本帖最后由 liuzhaoyzz 于 2021-1-10 15:19 编辑

CodeHz 发表于 2021-1-10 14:45
理论上兼容xp(就解决那一个弹框,其他的弹框就无能为力了)的版本,能用正常的版本就别用这个(
还是不行啊,大神。我感觉用VC做静态编译,肯定能够兼容XP。

CodeHz 发表于 2021-1-10 15:26:56

liuzhaoyzz 发表于 2021-1-10 15:17
还是不行啊,大神。我感觉用VC做静态编译,肯定能够兼容XP。


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

liuzhaoyzz 发表于 2021-1-10 15:31:01

CodeHz 发表于 2021-1-10 15:26
这个版本应该可以了,我用tcc的功能重新生成了导入表,之前居然忘记了tcc有这个功能23333
用xp的dll生 ...

结果显示不出来啊。好像出错了。

CodeHz 发表于 2021-1-10 15:32:16

liuzhaoyzz 发表于 2021-1-10 15:31
结果显示不出来啊。好像出错了。
你去注册表看看有没有这个先。。我觉得怕是根本没有)顺便把xp内核也发个来看看
ntoskrnl.exe

江南一根葱 发表于 2021-1-10 15:32:32

我是来泼冷水的,我认为多硬盘多种结构的环境来“自动”确认,是不太可靠的,
我个人对这种工具也是相当不屑的

CodeHz 发表于 2021-1-10 15:37:35

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

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

liuzhaoyzz 发表于 2021-1-10 15:39:13

CodeHz 发表于 2021-1-10 15:32
你去注册表看看有没有这个先。。我觉得怕是根本没有)顺便把xp内核也发个来看看
ntoskrnl.exe

你说的注册表是哪里?
ntoskrnl.dll我上传上来。

liuzhaoyzz 发表于 2021-1-10 15:40:12

本帖最后由 liuzhaoyzz 于 2021-1-10 15:41 编辑

江南一根葱 发表于 2021-1-10 15:32
我是来泼冷水的,我认为多硬盘多种结构的环境来“自动”确认,是不太可靠的,
我个人对这种工具也是相当不 ...
不需要泼冷水,只要微软的bootmgr/bootmgfw.efi启动的情况,我在167楼上测试了,没问题。大不了再让用户确认下罢了。

liuzhaoyzz 发表于 2021-1-10 15:43:52

本帖最后由 liuzhaoyzz 于 2021-1-10 15:51 编辑

HKLM\SYSTEM\CurrentControlSet\Control\FirmwareBootDevice
xp下面没有这个主键。我用"FirmwareBootDevice"作为关键字搜索了下,整个注册表都没有这个关键字。但我用“bootdevice”作为关键字,搜索到了这个:

"CurrentUser"="USERNAME"
"WaitToKillServiceTimeout"="5000"
"SystemStartOptions"="NOEXECUTE=OPTINFASTDETECT"
"SystemBootDevice"="multi(0)disk(0)rdisk(0)partition(1)"


"SystemBootDevice"="multi(0)disk(0)rdisk(0)partition(1)"这个好像是对的。

CodeHz 发表于 2021-1-10 15:50:21

思考了一下,XP是不是启动分区和引导分区必须在同一个分区的啊(指正常引导的情况)

CodeHz 发表于 2021-1-10 15:51:49

liuzhaoyzz 发表于 2021-1-10 15:43
HKLM\SYSTEM\CurrentControlSet\Control\FirmwareBootDevice
xp下面没有这个主键。我用"FirmwareBootDevic ...

看下 MACHINE\SYSTEM\CurrentControlSet\Control下有那些,我这里大概猜测SystemBootDevice既是系统盘也是引导盘)
页: 1 2 3 4 5 [6] 7 8 9 10 11 12 13 14
查看完整版本: 请问下有没有办法用批处理或者命令行小程序确定系统引导分区?