无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 22872|回复: 97
打印 上一主题 下一主题

[求助] 求教(已解决,pecmd脚本方案)判断当前系统是否为 uefi

  [复制链接]
跳转到指定楼层
#
发表于 2019-3-24 22:52:51 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 dos时代菜鸟 于 2021-6-18 12:30 编辑

问题已经解决,
感谢 liuzhaoyzz 、窄口牛 、adef 、liuzhaoyzz 等诸位大侠的热心回复和提供的思路。

我想弄个 cmd 实现这个功能,进而判断 系统启动类型是 uefi 还是 leagy-bios

鉴于 2021新版win10 已经不能使用以往  call dll函数 的方式,

针对新版win10 改进了一下,用了另一个 api

bootmode-2021.06.18.7z (1.82 MB, 下载次数: 97)

  1.     ENVI$# &ret=*4 0     //申请4个窄字符空间,也可以用   ENVI$ &ret=*2 0 //申请2个宽字符空间
  2.     CALL $--qd --bool --ret:&&r Kernel32.dll,GetFirmwareType,*&ret
  3.     FIND $%&&r%=,
  4.     {*
  5.         //为空,可以认为没有返回数据,当前环境不支持此API,低于Win8版本的系统
  6.         //MESS. 不支持此API。
  7.                 CALL $ --ret:r Kernel32.dll,GetFirmwareEnvironmentVariableW,"",{00000000-0000-0000-0000-000000000000},0,0
  8.                 CALL $ --ret:mode1 Kernel32.dll,GetLastError, ""
  9.                 IFEX $%mode1% = 1 ,envi BootMODE=BIOS! find $%mode1%=998 ,envi BootMODE=UEFI ! envi BootMODE=???1
  10.     }!  
  11.     {*
  12.         IFEX #%&&r%=0,MESS API Error.!  
  13.         {*
  14.             ENVI?int &ret=&ret1
  15.             IFEX #%&ret1%=0,envi BootMODE=???0。
  16.             IFEX #%&ret1%=1,envi BootMODE=BIOS
  17.             IFEX #%&ret1%=2,envi BootMODE=UEFI
  18.             IFEX #%&ret1%=3,envi BootMODE=???9
  19.         }
  20.     }
  21. mess %Bootmode%
复制代码




2021新版 pecmd 也有所改进,
改进后 的 如下:2021.01.14
bootmode.2021.2.7z (1.67 MB, 下载次数: 160)






PE下 用pecmd 脚本 bootmode.7z (1.82 MB, 下载次数: 258) 压缩包中包含 pecmd x86 /x64 所以在 本地 windows下也可以用。
有的  PE 因为 pecmd 版本不同 有的 call 指令略有不同,需要 自行对 bm.ini 进行修改。压缩包中的 pecmd 是 2018新版

脚本解决方案 是 调用 pecmd 加载 kernel32.dll 的 api 句柄
按照网上流行的做法 ,本质就是 通过 给 GetFirmwareEnvironmentVariableW 函数一个 错误的信息,其返回值必为0 ,但是其 错误代码返回值就不一样了。如果错误代码返回 1 说明是 bios ,代表 当前系统不支持 该函数运行,如果 错误代码返回值为 998 ,说明 该句柄运行了,但是运行错误。
值得一提的是,必须 将 kernel32.dll 的  GetFirmwareEnvironmentVariableW  和 getLastError 两个函数 紧连着使用,以便能够获取 真正的错误返回码。
所以 考虑 用 team 命令将两个 call 链接起来。
pecmd 脚本内容如下:
(根据自身 pecmd 版本 需要将下面源码中 红色部分修改  比如 2017版 pecmd 需要把 ** 变成 --)
--------------
  1. TEAM CALL $ --ret:mode1 Kernel32.dll,GetFirmwareEnvironmentVariableW, "",{00000000-0000-0000-0000-000000000000},0,0 | CALL $ --ret:mode1 Kernel32.dll,GetLastError, ""
  2. IFEX $%mode1% = 1 ,ENVI MODE1=BIOS! find $%mode1%=998 ,ENVI MODE1=UEFI ! ENVI MODE1=Unknow
  3. MESS %mode1%
复制代码
----------------------


exe 方案 用这个 detectefi.7z (22.24 KB, 下载次数: 143) 由 adef 提供,很好用。

如果是 win10 系统 powershell 3.0 的话 可以尝试用这个
bmx.7z (576 Bytes, 下载次数: 84)

如果你的系统 可以运行 bcdedit 列出 bcd 内容,可以用这个
B2.7z (896 Bytes, 下载次数: 104)




点评

我发过帖子,但被两个傻瓜破坏心情,果然又倒退多年。  发表于 2019-3-26 04:49
这帖子所有回复都没抓到关键,依赖BCD都不好  发表于 2019-3-26 04:48

评分

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

查看全部评分

80#
发表于 2022-10-6 16:27:34 | 只看该作者
感谢楼主的分享
回复

使用道具 举报

79#
 楼主| 发表于 2021-6-18 12:32:39 | 只看该作者
正确答案在一楼,有更新。
回复

使用道具 举报

78#
发表于 2021-6-17 18:34:44 | 只看该作者
您没有权限
回复

使用道具 举报

77#
发表于 2021-3-2 11:23:50 | 只看该作者
2013kyj 发表于 2021-3-2 11:07
哦,能否指点一二, 我确实测试过, 能加载就是UEFI, 否则MBR

判断启动模式,贴自己都已经有了,还要什么?
回复

使用道具 举报

76#
发表于 2021-3-2 11:07:16 | 只看该作者

哦,能否指点一二, 我确实测试过, 能加载就是UEFI, 否则MBR

点评

判断启动模式,贴自己都已经有了,还要什么?  详情 回复 发表于 2021-3-2 11:23
回复

使用道具 举报

75#
发表于 2021-3-2 10:16:53 | 只看该作者
2013kyj 发表于 2021-3-2 09:50
关于Windows是否是UEFI启动[不考虑在PE的情况下], 是否可以简单用命令mountvol z: /s来识别呢? MBR的不能 ...

你的思路不对。

点评

哦,能否指点一二, 我确实测试过, 能加载就是UEFI, 否则MBR  详情 回复 发表于 2021-3-2 11:07
回复

使用道具 举报

74#
发表于 2021-3-2 09:50:16 | 只看该作者
本帖最后由 2013kyj 于 2021-3-2 09:54 编辑
liuzhaoyzz 发表于 2019-3-26 09:37
1、基于BCDEDIT的方案是不可靠的。一些情况下bcdedit根本就运行不了。
2、基于setupact.log判断的 ...

关于Windows是否是UEFI启动[不考虑在PE的情况下], 是否可以简单用命令mountvol z: /s来识别呢? MBR的不能加载EFI分区, 批处理应该怎么写呢, 欢迎讨论

点评

你的思路不对。  详情 回复 发表于 2021-3-2 10:16
回复

使用道具 举报

73#
 楼主| 发表于 2021-1-15 20:08:22 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-1-15 23:07 编辑
Anson4 发表于 2021-1-15 16:51
新版本的PECMD还能这么玩啊,不知道可靠程度如何?

这个应该可以了啦
bootmode.2021.2.7z (1.67 MB, 下载次数: 15)
回复

使用道具 举报

72#
发表于 2021-1-15 16:51:09 | 只看该作者
dos时代菜鸟 发表于 2021-1-14 12:11
新版 pecmd 有此功能支持

见1楼。

新版本的PECMD还能这么玩啊,不知道可靠程度如何?

点评

好像还是不行  详情 回复 发表于 2021-1-15 20:08
回复

使用道具 举报

71#
 楼主| 发表于 2021-1-14 12:11:16 | 只看该作者
Anson4 发表于 2020-7-30 20:40
请问楼主,在Win10 2004(19041)下,PECMD脚本返回的结果不正确,这个问题能解决了吗?

新版 pecmd 有此功能支持

见1楼。

点评

新版本的PECMD还能这么玩啊,不知道可靠程度如何?  详情 回复 发表于 2021-1-15 16:51
回复

使用道具 举报

70#
 楼主| 发表于 2020-12-15 22:39:35 | 只看该作者
本帖最后由 dos时代菜鸟 于 2020-12-15 22:41 编辑
Anson4 发表于 2020-12-15 20:32
这个是20H2的,2004的更新版。

确实 不行了,不知道还有 其他 啥好办法没有
在 20h2 中 调用老版本的 kernel32.dll 也不行,显示无法定位 程序输入点。

回复

使用道具 举报

69#
发表于 2020-12-15 20:32:31 | 只看该作者
dos时代菜鸟 发表于 2020-12-15 09:22
经测试,特意下载了一个 win10 2004的gho ,用 里面的 kernel32.dll ,通过 python 调用其 相关句柄,能 ...

这个是20H2的,2004的更新版。
kernel32.7z (281.41 KB, 下载次数: 6)

点评

确实 不行了,不知道还有 其他 啥好办法没有  详情 回复 发表于 2020-12-15 22:39
回复

使用道具 举报

68#
 楼主| 发表于 2020-12-15 09:22:56 | 只看该作者
本帖最后由 dos时代菜鸟 于 2020-12-15 11:23 编辑



经测试,特意下载了一个 win10 2004的gho ,用 里面的 kernel32.dll ,通过 python 调用其 相关句柄,能够正常返回 启动类型是 bios 。
效果如图,说明,原有方案是有效的。
如果出现 返回值 1314 的,多半 应该是 权限问题。


奶奶的,下载下来的 居然 是 1903 ,
谁有 2004 的 kernel32.dll 发上来,测试下,、





点评

这个是20H2的,2004的更新版。  详情 回复 发表于 2020-12-15 20:32
回复

使用道具 举报

67#
 楼主| 发表于 2020-12-15 08:46:47 | 只看该作者
Anson4 发表于 2020-7-31 16:35
G550确实有点老了,不过我的i5-M520也不年轻,性能应该比G550差一些,关键是我装了一块固态硬盘,一般上 ...

把 2004 20h4 里的 kernel32.dll 拿来,用一下试试,
或者干脆调用 1809 低版本里的 kernel32.dll 的函数句柄。
回复

使用道具 举报

66#
发表于 2020-11-22 22:10:28 | 只看该作者
多谢分享,,,,,,,,,,,,,,
回复

使用道具 举报

65#
发表于 2020-7-31 16:35:05 | 只看该作者
dos时代菜鸟 发表于 2020-7-31 16:24
只能说你还是年轻呀。

我用的是 赛扬 G550 @ 2.60GHz .安装个系统 很费劲,下载个系统也很费劲。

G550确实有点老了,不过我的i5-M520也不年轻,性能应该比G550差一些,关键是我装了一块固态硬盘,一般上上论坛还可以。

点评

把 2004 20h4 里的 kernel32.dll 拿来,用一下试试, 或者干脆调用 1809 低版本里的 kernel32.dll 的函数句柄。  详情 回复 发表于 2020-12-15 08:46
回复

使用道具 举报

64#
 楼主| 发表于 2020-7-31 16:24:23 | 只看该作者
Anson4 发表于 2020-7-31 16:04
我的移动CPU一代i5都在用2004,还有啥机器用不了呢?

只能说你还是年轻呀。

我用的是 赛扬 G550 @ 2.60GHz .安装个系统 很费劲,下载个系统也很费劲。

点评

G550确实有点老了,不过我的i5-M520也不年轻,氢能应该比G550差一些,关键是我装了一块固态硬盘,一般上上论坛还可以。  详情 回复 发表于 2020-7-31 16:35
回复

使用道具 举报

63#
发表于 2020-7-31 16:04:23 | 只看该作者
dos时代菜鸟 发表于 2020-7-31 15:20
没用过 那么先进的 系统呀,我这都是老古董。
也不知道 2004 中 dll 调用 句柄是啥。

我的移动CPU一代i5都在用2004,还有啥机器用不了呢?

点评

只能说你还是年轻呀。 我用的是 赛扬 G550 @ 2.60GHz .安装个系统 很费劲,下载个系统也很费劲。  详情 回复 发表于 2020-7-31 16:24
回复

使用道具 举报

62#
 楼主| 发表于 2020-7-31 15:20:12 | 只看该作者
Anson4 发表于 2020-7-30 20:40
请问楼主,在Win10 2004(19041)下,PECMD脚本返回的结果不正确,这个问题能解决了吗?

没用过 那么先进的 系统呀,我这都是老古董。
也不知道 2004 中 dll 调用 句柄是啥。

点评

我的移动CPU一代i5都在用2004,还有啥机器用不了呢?  详情 回复 发表于 2020-7-31 16:04
回复

使用道具 举报

61#
发表于 2020-7-30 20:40:21 | 只看该作者
请问楼主,在Win10 2004(19041)下,PECMD脚本返回的结果不正确,这个问题能解决了吗?

点评

新版 pecmd 有此功能支持 见1楼。  详情 回复 发表于 2021-1-14 12:11
没用过 那么先进的 系统呀,我这都是老古董。 也不知道 2004 中 dll 调用 句柄是啥。  详情 回复 发表于 2020-7-31 15:20
回复

使用道具 举报

60#
发表于 2020-5-10 08:27:09 | 只看该作者

手上没有2004的PE
不过,我觉得不是权限的问题,因为同样的操作,在1909以及更低版本的系统下运行正常。
回复

使用道具 举报

59#
 楼主| 发表于 2020-5-9 21:18:15 | 只看该作者
Anson4 发表于 2020-5-8 12:29
已经用了管理员权限了

pe 下呢?

点评

手上没有2004的PE 不过,我觉得不是权限的问题,因为同样的操作,在1909以及更低版本的系统下运行正常。  详情 回复 发表于 2020-5-10 08:27
回复

使用道具 举报

58#
发表于 2020-5-8 12:29:45 | 只看该作者
dos时代菜鸟 发表于 2020-5-8 07:01
好吧,好吧,看来 还要等正式的出来了,才能再确定下。
还要看看,那几个 exe 方案能否有效。另外 1314  ...

已经用了管理员权限了

点评

pe 下呢?  详情 回复 发表于 2020-5-9 21:18
回复

使用道具 举报

57#
 楼主| 发表于 2020-5-8 07:01:52 | 只看该作者
本帖最后由 dos时代菜鸟 于 2020-5-8 07:08 编辑
Anson4 发表于 2020-5-7 22:51
1909的版本号是Windows 10.0.0.18363,2004的版本号才是Windows 10.0.0.19041,其正式版即将到来。

好吧,好吧,看来 还要等正式的出来了,才能再确定下。
还要看看,那几个 exe 方案能否有效。另外 1314 码 对应的应该是 权限问题,你不妨 用管理员权限 运行 再试试。

点评

已经用了管理员权限了  详情 回复 发表于 2020-5-8 12:29
回复

使用道具 举报

56#
发表于 2020-5-7 22:51:43 | 只看该作者
dos时代菜鸟 发表于 2020-5-7 09:47
特意 弄个 1909 的 win10 测试了下,没问题。
有图有真相。

1909的版本号是Windows 10.0.0.18363,2004的版本号才是Windows 10.0.0.19041,其正式版即将到来。

点评

好吧,好吧,看来 还要等正式的出来了,才能再确定下。 还要看看,那几个 exe 方案能否有效。  详情 回复 发表于 2020-5-8 07:01
回复

使用道具 举报

55#
 楼主| 发表于 2020-5-7 09:47:23 | 只看该作者
Anson4 发表于 2020-3-19 14:27
1楼的PECMD代码已经不能适应 Windows 10.0.0.19041,无论是UEFI环境还是LEGACY环境,检测出来的结果都是“1 ...

特意 弄个 1909 的 win10 测试了下,没问题。
有图有真相。


点评

1909的版本号是Windows 10.0.0.18363,2004的版本号才是Windows 10.0.0.19041,其正式版即将到来。  详情 回复 发表于 2020-5-7 22:51
回复

使用道具 举报

54#
发表于 2020-3-19 14:27:44 | 只看该作者
1楼的PECMD代码已经不能适应 Windows 10.0.0.19041,无论是UEFI环境还是LEGACY环境,检测出来的结果都是“1314”,而不是“1”或者“998”。

点评

特意 弄个 1909 的 win10 测试了下,没问题。 有图有真相。 [attachimg]431849[/attachimg]  详情 回复 发表于 2020-5-7 09:47
回复

使用道具 举报

53#
发表于 2020-2-11 00:30:12 | 只看该作者
多谢分享,,,,,,,,,,,,,,
回复

使用道具 举报

52#
发表于 2020-1-4 22:17:25 | 只看该作者
多谢分享,,,,,,,,,,,,,,
回复

使用道具 举报

51#
发表于 2019-5-18 18:23:02 | 只看该作者

分享

本帖最后由 liuzhaoyzz 于 2019-5-18 18:24 编辑

    求人不如求己啊!我下载了adef兄的https://github.com/xcat2/xcat-co ... cat/netboot/windows源代码,然后用VS2008重新编译,编译的时候选择静态编译,右键项目,属性->配置属性->常规->MFC的使用,选择“在静态库中使用MFC”。编译为32位程序,编译后exe文件52KB,亲测适用于XP,64位的WIN7 10,检测BIOS/UEFI启动模式正确无误。为了区别于adef兄的detectefiX86.exe(45KB),特地改名字为detectefi32.exe(52KB)。现奉上源代码和编译后的exe文件。

   

detectefi32.rar

25.19 KB, 下载次数: 125, 下载积分: 无忧币 -2

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-29 22:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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