无忧启动论坛

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

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

    [复制链接]
跳转到指定楼层
1#
发表于 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 很给力!支持一下

查看全部评分

2#
发表于 2019-11-8 12:20:53 | 只看该作者
前排落定
回复

使用道具 举报

3#
发表于 2019-11-8 12:30:52 | 只看该作者
写个批处理,判断是什么模式启动后,重启在DOS下导入安装同目录下的WIM或ESD系统(或备份系统到同目录下),并能增加WIM格式的PE引导到BCD里,如此便解决了很多不会安装电脑的困扰

点评

uefi下是如何能够进入DOS的  发表于 2019-11-8 12:53
回复

使用道具 举报

4#
发表于 2019-11-8 13:08:49 | 只看该作者
温馨提示:bcdedit检查winload、wmic、powershell 、C:\Windows\Panther\setupact.log文件检测、注册表 HKLM\System\CurrentControlSet\Control\PEFirmwareType 检测什么的都不靠谱。


楼主说这些检测都不靠谱,那么你是如何检测的?
回复

使用道具 举报

5#
 楼主| 发表于 2019-11-8 13:18:42 来自手机 | 只看该作者
本帖最后由 liuzhaoyzz 于 2019-11-8 13:43 编辑

一楼不是有吗detectefi32.exe(52KB)      
回复

使用道具 举报

6#
发表于 2019-11-8 13:21:59 | 只看该作者
本帖最后由 foxfirefox 于 2019-11-8 13:24 编辑

    //1, 支持efi引导的//只有win7及以上, 所以xp, 03系统就只能够bios引导  

    //2, win7,8,8.1,10等系统, 可以用下面的代码, 本质上就是GetFirmwareEnvironmentVariableA, 或者GetFirmwareType这两个api的调用  

    #include <Windows.h>  

    #include <Winbase.h>  //GetFirmwareEnvironmentVariableA  和   GetFirmwareType的头文件  

    #include <iostream>  

    using namespace std;  

    void main()  

    {  

    //For Windows 8/Server 2012 and above可用  

    /*

    typedef enum _FIRMWARE_TYPE {

    FirmwareTypeUnknown = 0,

    FirmwareTypeBios = 1,

    FirmwareTypeUefi = 2,

    FirmwareTypeMax = 3

    } FIRMWARE_TYPE, *PFIRMWARE_TYPE;

    */  

    FIRMWARE_TYPE a;  

    GetFirmwareType(&a);  

    switch (a)  

    {  

    case FirmwareTypeUnknown:  

    cout << "不知名引导" << endl; break;  

    case FirmwareTypeBios:  

    cout << "Bios引导" << endl; break;  

    case FirmwareTypeUefi:  

    cout << "Uefi引导" << endl; break;  

    case FirmwareTypeMax:  

    cout << "Not implemented" << endl; break;  

    }  

    //Windows 7/Server 2008R2 and above可用  

    GetFirmwareEnvironmentVariableA("", "{00000000-0000-0000-0000-000000000000}", NULL, 0);  

    if (GetLastError() == ERROR_INVALID_FUNCTION)  

    //API not supported; this is a legacy BIOS  

    cout << "Bios引导" << endl;   

    else  

    //API error (expected) but call is supported.This is UEFI.  

    cout << "Uefi引导" << endl;   

    system("pause");  

    }  

这个是百度上搜来的一段代码。
楼主使用的的代码只是后面的一段。。。。

GetFirmwareEnvironmentVariableA("", "{00000000-0000-0000-0000-000000000000}", NULL, 0);  

    if (GetLastError() == ERROR_INVALID_FUNCTION)  

    //API not supported; this is a legacy BIOS  

    cout << "Bios引导" << endl;   

    else  

    //API error (expected) but call is supported.This is UEFI.  

    cout << "Uefi引导" << endl;   

    system("pause");  

    }  
回复

使用道具 举报

7#
发表于 2019-11-8 13:24:21 | 只看该作者
这个软件好用吗
回复

使用道具 举报

8#
 楼主| 发表于 2019-11-8 13:29:44 | 只看该作者
本帖最后由 liuzhaoyzz 于 2019-11-8 13:32 编辑

支持efi引导的//只有win7及以上, 所以xp, 03系统就只能够bios引导  

的确,因为我测试了在XP上面运行一楼的小程序,判断也正常,所以就说支持XP判断。
GetFirmwareEnvironmentVariableA这个函数,WIN7以上的64位系统我测试了判断也正确,32位系统我没有测试,我没有32位的UEFI环境。        

点评

然而UEFI启动XP并不能判断 23333~ [attachimg]404686[/attachimg]  详情 回复 发表于 2019-11-8 17:29
回复

使用道具 举报

9#
发表于 2019-11-8 14:28:13 | 只看该作者
bcdedit 工具应该是最权威的! 虽然用了系统API  GetFirmwareEnvironmentVariableA 但是 bcdedit 工具从层面上看最少也用这个API甚至用比这个还要底层的API。

点评

有些情况bcdedit根本就用不了,打不开,何谈权威?  详情 回复 发表于 2019-11-8 14:33
回复

使用道具 举报

10#
 楼主| 发表于 2019-11-8 14:33:03 | 只看该作者
610644034 发表于 2019-11-8 14:28
bcdedit 工具应该是最权威的! 虽然用了系统API  GetFirmwareEnvironmentVariableA 但是 bcdedit 工具从层 ...


有些情况bcdedit根本就用不了,打不开,何谈权威?正因为bcdedit打开不靠谱,所以要重复造轮子。        

点评

那你有想过为什么bcdedit打不开吗?在完整的硬盘安装的系统里bcdedit显示无法打开启动配置存储只有一种情况:启动分区没有配置好。如果硬盘是MBR分区表,只有使用BIOS模式,而且引导文件存在活动分区下BCD才能被正确  详情 回复 发表于 2020-5-30 23:21
都用上uefi了, bcdedit还会有根本打不开的情况?? becdedit 都不权威, 还有什么是权威的? 就一句话的命令 bcdedit /enum {current} | find /i "winload.efi", 难吗?  详情 回复 发表于 2020-5-7 11:33
说句真心话! 你要是去逆向系统API 你就会发现 API 有的还是直接查注册表数据后返回的,所以谈何靠谱?  详情 回复 发表于 2019-11-8 15:02
回复

使用道具 举报

11#
发表于 2019-11-8 14:40:10 | 只看该作者
哪个谁谁谁给楼主版主评负分!打击人吗?!

这个检测以前本坛有讨论过,方式好像有好几个。
回复

使用道具 举报

12#
发表于 2019-11-8 15:02:39 | 只看该作者
liuzhaoyzz 发表于 2019-11-8 14:33
有些情况bcdedit根本就用不了,打不开,何谈权威?正因为bcdedit打开不靠谱,所以要重复造轮子。       ...

说句真心话! 你要是去逆向系统API 你就会发现 API 有的还是直接查注册表数据后返回的,所以谈何靠谱?
回复

使用道具 举报

13#
 楼主| 发表于 2019-11-8 15:33:39 | 只看该作者
既然这样,你继续用bcdedit就是了。
回复

使用道具 举报

14#
发表于 2019-11-8 15:43:13 | 只看该作者
难道 GetFirmwareEnvironmentVariableA  不香吗
回复

使用道具 举报

15#
发表于 2019-11-8 16:37:58 | 只看该作者
感谢分享,另外请教一下大佬,现在纯脚本还是没啥好办法吗?

点评

没发现其他有效的办法。  发表于 2019-11-8 17:39
回复

使用道具 举报

16#
发表于 2019-11-8 17:29:29 | 只看该作者
liuzhaoyzz 发表于 2019-11-8 13:29
的确,因为我测试了在XP上面运行一楼的小程序,判断也正常,所以就说支持XP判断。
GetFirmwareEnvironme ...

然而UEFI启动XP并不能判断 23333~

点评

请问,这个环境用BCDEDIT来判断准确吗?  详情 回复 发表于 2020-3-19 15:25
回复

使用道具 举报

17#
 楼主| 发表于 2019-11-8 17:32:20 | 只看该作者
本帖最后由 liuzhaoyzz 于 2019-11-8 17:48 编辑

你那UEFI启动的XP是经过改造的吧,XP我测试了结果跟你截图是一样的。我没见过UEFI启动的XP。。。

点评

XP添加UEFI启动支持其实很简单,只要拷两个文件就可以。  详情 回复 发表于 2019-11-8 19:47
回复

使用道具 举报

18#
发表于 2019-11-8 17:56:51 | 只看该作者
感谢分享。
我的示例:
  1. @echo off
  2. pushd "%~dp0"
  3. rem 检测BIOS/UEFI启动
  4. for /f %%a in ('detectefi32') do set bootdect=%%a
  5. goto %bootdect%

  6. :UEFI
  7. set winload=winload.efi
  8. echo %winload%
  9. pause
  10. exit /b

  11. :Legacy
  12. set winload=winload.exe
  13. echo %winload%
  14. pause
  15. exit /b
复制代码

点评

用call会更简单。用变量组定义更更简单。  发表于 2019-11-8 20:03
不错,代码很简洁!  发表于 2019-11-8 18:22
回复

使用道具 举报

19#
发表于 2019-11-8 19:26:38 | 只看该作者
有点好奇检测完了做些什么,
如果是efi的,则干些?
如果是bios的,则干些?
我一般都决定好启动前要做些什么。。。

点评

用于批处理啊,比如说修改BCD,如果是bios启动就用winload.exe,否则就用winload.efi。  详情 回复 发表于 2019-11-8 20:03
回复

使用道具 举报

20#
发表于 2019-11-8 19:36:39 | 只看该作者
不过这个问题我的思路是,提取winload.exe和winload.efi的访问时间,哪个时间迟我觉得就是哪个启动的。
回复

使用道具 举报

21#
发表于 2019-11-8 19:47:25 | 只看该作者
liuzhaoyzz 发表于 2019-11-8 17:32
你那UEFI启动的XP是经过改造的吧,XP我测试了结果跟你截图是一样的。我没见过UEFI启动的XP。。。


XP添加UEFI启动支持其实很简单,只要拷两个文件就可以。这个我早就做到了,只不过一直没公开教程而已。

点评

我敢肯定你的这个肯定不是UEFI启动。  详情 回复 发表于 2020-5-30 23:31
回复

使用道具 举报

22#
 楼主| 发表于 2019-11-8 20:03:19 | 只看该作者
江南一根葱 发表于 2019-11-8 19:26
有点好奇检测完了做些什么,
如果是efi的,则干些?
如果是bios的,则干些?

用于批处理啊,比如说修改BCD,如果是bios启动就用winload.exe,否则就用winload.efi。        

点评

其实我也暂时没有想到有什么用处。 winload 是不需要在bcd中指明的,引导程序会自动选择,bootmgfw.efi会使用winload.efi,bootmgr会使用winload.exe。bcd中需要明确的是device、osdevice、systemroot这三项。  详情 回复 发表于 2019-11-8 21:01
回复

使用道具 举报

23#
发表于 2019-11-8 21:01:02 | 只看该作者
liuzhaoyzz 发表于 2019-11-8 20:03
用于批处理啊,比如说修改BCD,如果是bios启动就用winload.exe,否则就用winload.efi。

其实我也暂时没有想到有什么用处。

winload 是不需要在bcd中指明的,引导程序会自动选择,bootmgfw.efi会使用winload.efi,bootmgr会使用winload.exe。bcd中需要明确的是device、osdevice、systemroot这三项。
回复

使用道具 举报

24#
发表于 2019-11-8 21:17:46 | 只看该作者
哦,检测bios和uefi的小工具啊,下来备用之,毕竟以后还氏有可能用到uefi主板的。。。

多谢楼主分享。
回复

使用道具 举报

25#
发表于 2019-11-10 17:24:59 来自手机 | 只看该作者
其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动

点评

PE里面哪里有msinfo32?正常系统有的都精简了,再说这里面显示的信息,怎么提取出来?比如用到某个bat vbs脚本里面? 还是API可靠。  详情 回复 发表于 2019-11-11 10:04
你那是一般的用户环境,这里是无忧,搞引导的地方,各种复杂的系统环境都有。  详情 回复 发表于 2019-11-10 18:15
回复

使用道具 举报

26#
发表于 2019-11-10 18:15:52 来自手机 | 只看该作者
ostrichb 发表于 2019-11-10 17:24
其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动

你那是一般的用户环境,这里是无忧,搞引导的地方,各种复杂的系统环境都有。
回复

使用道具 举报

27#
 楼主| 发表于 2019-11-11 10:04:15 来自手机 | 只看该作者
ostrichb 发表于 2019-11-10 17:24
其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动

        PE里面哪里有msinfo32?正常系统有的都精简了,再说这里面显示的信息,怎么提取出来?比如用到某个bat vbs脚本里面?   还是API可靠。
回复

使用道具 举报

28#
发表于 2019-11-11 12:10:13 来自手机 | 只看该作者
pe判断没有意义,要判断的是系统的启动方式,和pe没有啥关系。

点评

PE判断当然有意义,只是你没有遇到而已,我有这个需要。  详情 回复 发表于 2019-11-11 13:27
回复

使用道具 举报

29#
 楼主| 发表于 2019-11-11 13:27:52 | 只看该作者
窄口牛 发表于 2019-11-11 12:10
pe判断没有意义,要判断的是系统的启动方式,和pe没有啥关系。

PE判断当然有意义,只是你没有遇到而已,我有这个需要。
回复

使用道具 举报

30#
发表于 2020-1-3 12:47:19 | 只看该作者
执行exe文件后一闪而退,不知怎么回事

点评

先运行cmd,切换到DetectEFI32所在的目录,输入DetectEFI32,或者直接用一楼的批处理示例。  详情 回复 发表于 2020-1-5 16:21
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-28 14:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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