无忧启动论坛

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

[分享] 分享个判断当前系统是BIOS还是UEFI启动的小程序

    [复制链接]
跳转到指定楼层
#
发表于 2019-11-8 12:04:35 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liuzhaoyzz 于 2019-11-8 15:58 编辑

分享个判断当前系统是BIOS还是UEFI启动的小程序
DetectEFI32,50KB,adef提供,我重新编译,检测当前系统是BIOS启动还是UEFI启动。
http://bbs.wuyou.net/forum.php?m ... p;page=6#pid3792649
用VS2008重新编译,编译的时候选择静态编译,编译为32位程序,编译后exe文件52KB,亲测适用于XP,64位的WIN7 10,检测BIOS/UEFI启动模式正确无误。为了区别于adef兄的detectefiX86.exe(45KB),特地改名字为detectefi32.exe(52KB)。现奉上源代码和编译后的exe文件。

批处理调用示例.bat
  1. @echo off
  2. pushd "%~dp0"
  3. rem 检测BIOS/UEFI启动
  4. detectefi32 |find /i "Legacy" && (
  5.         set "winload=winload.exe"
  6.          goto :BIOS
  7. )||(
  8.         set "winload=winload.efi"
  9. goto :UEFI
  10. )
  11. popd

  12. :BIOS
  13.   pause
  14. exit /b

  15. :UEFI
  16.   pause
  17. exit /b
复制代码




温馨提示:bcdedit检查winload、wmic、msinfo32、powershell 、C:\Windows\Panther\setupact.log文件检测、注册表 HKLM\System\CurrentControlSet\Control\PEFirmwareType 检测什么的都不靠谱。

另外还有这个。判断当前系统是BIOS启动还是UEFI启动,分区表是MBR还是GPT(by双心)V1.3 - RAMOS - 无忧启动论坛 - Powered by Discuz! http://wuyou.net/forum.php?mod=viewthread&tid=412368

detectefi32.rar

25.46 KB, 下载次数: 434, 下载积分: 无忧币 -2

评分

参与人数 6无忧币 +40 收起 理由
wuxin9712 + 15
Hysanohsp + 5
1049616166 + 5 很给力!
liu_zhenfeng + 5 很给力!
有阴也有阳 + 5 很给力!
879792799 + 5 很给力!支持一下

查看全部评分

134#
发表于 2024-7-12 16:36:28 | 只看该作者
谢谢更新制作分享!
回复

使用道具 举报

133#
发表于 2024-7-12 05:52:43 | 只看该作者
学习学习
回复

使用道具 举报

132#
发表于 2024-7-11 16:18:47 | 只看该作者
学习一下
回复

使用道具 举报

131#
发表于 2024-7-11 16:01:42 | 只看该作者
谢谢楼主分享实用小工具
回复

使用道具 举报

130#
发表于 2024-7-8 15:22:56 | 只看该作者
谢谢分享
回复

使用道具 举报

129#
发表于 2024-7-8 12:14:53 | 只看该作者
谢谢分享
回复

使用道具 举报

128#
发表于 2024-7-6 15:36:47 | 只看该作者
感谢分享
回复

使用道具 举报

127#
发表于 2024-7-6 15:35:34 | 只看该作者
感谢分享
回复

使用道具 举报

126#
发表于 2024-3-17 12:46:47 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

125#
发表于 2023-6-28 07:09:42 来自手机 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

124#
发表于 2023-6-26 14:11:52 | 只看该作者
还蛮有用的,看看能不能成功
回复

使用道具 举报

123#
发表于 2023-6-26 14:02:19 | 只看该作者
支持了!
回复

使用道具 举报

122#
发表于 2023-6-26 13:47:49 | 只看该作者
学习了感谢分享
回复

使用道具 举报

121#
发表于 2023-5-2 19:30:49 | 只看该作者
这个得支持一下!谢谢了
回复

使用道具 举报

120#
发表于 2023-4-26 09:15:22 | 只看该作者
感谢fenx
回复

使用道具 举报

119#
发表于 2023-4-21 12:59:33 | 只看该作者
本帖最后由 wintoflash 于 2023-4-21 13:04 编辑
dos时代菜鸟 发表于 2023-4-21 11:21
bcedit 获取bcd启动信息,是通过系统api定位启动分区,找bcd的,有的系统启动环境复杂,bcdedit就不一定好 ...

mountvol 判断启动模式,和我上面说的方法一样。
  1. __int64 IsEfi()
  2. {
  3.   unsigned int v0; // ebx
  4.   SYSTEM_BOOT_ENVIRONMENT_INFORMATION SystemInformation; // [rsp+20h] [rbp-38h] BYREF

  5.   v0 = 0;
  6.   memset(&SystemInformation, 0, sizeof(SystemInformation));
  7.   if ( NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)90, &SystemInformation, 0x20u, 0i64) >= 0 )
  8.     return SystemInformation.FirmwareType == 2;
  9.   return v0;
  10. }
复制代码

回复

使用道具 举报

118#
发表于 2023-4-21 11:21:38 来自手机 | 只看该作者
本帖最后由 dos时代菜鸟 于 2023-4-21 11:28 编辑

bcedit 获取bcd启动信息,是通过系统api定位启动分区,找bcd的,有的系统启动环境复杂,bcdedit就不一定好用,有的,bcd中没有指明启动文件winload.efi位置,系统也能启动。有时用grub调用 其他分区上 甚至虚拟盘上的bootmgr 启动系统的,bcdedit可能会把bcd定位到grub所在分区或找不到bootmgr分区,进而找不到bcd。情况太多了。

所以,需要用单独的程序调用系统api检测启动模式。

另外,可以试试 Mountvol  。

点评

mountvol 判断启动模式,和我上面说的方法一样。  详情 回复 发表于 2023-4-21 12:59
回复

使用道具 举报

117#
发表于 2023-4-20 13:01:31 | 只看该作者
回复

使用道具 举报

116#
发表于 2023-4-19 11:05:53 | 只看该作者
支持一下
回复

使用道具 举报

115#
 楼主| 发表于 2023-4-18 17:49:07 | 只看该作者
wintoflash 发表于 2023-4-17 22:17
另外关于这个帖子 请问下有没有命令行工具添加UEFI引导序列?
记得有人说过用 bootice 不能修改 UEFI 启动 ...

好像见到论坛上有人反馈过,用bootice不能添加或者修改UEFI启动项,但我没有经历过,或者有经历过,忘了。
感觉上BOOTICE1.4版本对于添加修改UEFI启动项,有代码修正。
我联系过pauly,希望他开源,他没有答应。

回复

使用道具 举报

114#
发表于 2023-4-17 22:17:10 | 只看该作者
另外关于这个帖子 请问下有没有命令行工具添加UEFI引导序列?
记得有人说过用 bootice 不能修改 UEFI 启动项。
我在某些环境下重现了这个问题,就是用 API SetFirmwareEnvironmentVariable 设置 UEFI 变量失败。
但是诡异的是,执行一次 bcdedit /enum FIRMWARE 之后就正常了。
反编译 bcdedit 可知,它根本不用微软公开的这个 API,而是用了未公开的 ZwQueryBootOptions 和 ZwSetBootOptions 。

点评

好像见到论坛上有人反馈过,用bootice不能添加或者修改UEFI启动项,但我没有经历过,或者有经历过,忘了。 感觉上BOOTICE1.4版本对于添加修改UEFI启动项,有代码修正。 我联系过pauly,希望他开源,他没有答应。  详情 回复 发表于 2023-4-18 17:49
回复

使用道具 举报

113#
发表于 2023-4-17 22:10:56 | 只看该作者
挖坟备忘
反编译 bcdedit.exe,可以看出它是通过 NtQuerySystemInformation 获取未公开结构体 SYSTEM_BOOT_ENVIRONMENT_INFORMATION 来判断 BIOS/UEFI 的。
(SYSTEM_INFORMATION_CLASS)90 = 0x5A = SystemBootEnvironmentInformation
  1. __int64 SiGetFirmwareType()
  2. {
  3.   unsigned int v0; // ebx
  4.   char SystemInformation[16]; // [rsp+20h] [rbp-38h] BYREF
  5.   unsigned int v3; // [rsp+30h] [rbp-28h]

  6.   v0 = 1;
  7.   if ( NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)90, SystemInformation, 0x20u, 0i64) >= 0 )
  8.   {
  9.     v0 = 0;
  10.     if ( (int)v3 < 3 )
  11.       return v3;
  12.   }
  13.   return v0;
  14. }
复制代码

https://www.geoffchappell.com/st ... ent_information.htm

EFIGuard 也用了这个方法,看来应该更靠谱。
回复

使用道具 举报

112#
发表于 2023-3-16 18:10:35 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

111#
 楼主| 发表于 2023-3-16 11:50:35 | 只看该作者
wuhuayu 发表于 2023-3-16 01:27
大佬  能写个cmd选择文件夹或文件 小程序吗

可以用拖放模式啊,效果是把文件、文件夹拖到正在运行的批处理上,百度一艘一大堆,我就是百度来的。不难。
回复

使用道具 举报

110#
发表于 2023-3-16 01:27:26 | 只看该作者
大佬  能写个cmd选择文件夹或文件 小程序吗

点评

可以用拖放模式啊,效果是把文件、文件夹拖到正在运行的批处理上,百度一艘一大堆,我就是百度来的。不难。  详情 回复 发表于 2023-3-16 11:50
回复

使用道具 举报

109#
发表于 2023-3-12 23:49:48 | 只看该作者
很有用的东西
回复

使用道具 举报

108#
发表于 2023-3-6 07:01:56 来自手机 | 只看该作者
不错
回复

使用道具 举报

107#
发表于 2023-3-6 06:02:37 来自手机 | 只看该作者
学习
回复

使用道具 举报

106#
发表于 2023-3-5 21:45:50 | 只看该作者
学习学习
回复

使用道具 举报

105#
发表于 2023-3-5 08:31:43 | 只看该作者
这个直观方便
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-28 19:27

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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