无忧启动论坛

 找回密码
 注册
搜索
WEPE笔记本电脑手机维修小包 IT发烧友的必备工具最纯净的「微PE装机优盘」UEPON大师作品卡瑞飞系统和装机二合一超级U盘
无忧启动论坛唯一网址:bbs.wuyou.net系统gho:最纯净好用系统下载站广告联系 QQ:184822951 微信:wuyouceo
查看: 680|回复: 35

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

  [复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式
本帖最后由 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, 下载次数: 109, 下载积分: 无忧币 -2

评分

参与人数 4无忧币 +13 收起 理由
liu_zhenfeng + 5 很给力!
有阴也有阳 + 5 很给力!
879792799 + 5 很给力!支持一下
wxh0712 -2 神马都是浮云

查看全部评分

发表于 6 天前 | 显示全部楼层
前排落定
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
写个批处理,判断是什么模式启动后,重启在DOS下导入安装同目录下的WIM或ESD系统(或备份系统到同目录下),并能增加WIM格式的PE引导到BCD里,如此便解决了很多不会安装电脑的困扰

点评

uefi下是如何能够进入DOS的  发表于 6 天前
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
温馨提示:bcdedit检查winload、wmic、powershell 、C:\Windows\Panther\setupact.log文件检测、注册表 HKLM\System\CurrentControlSet\Control\PEFirmwareType 检测什么的都不靠谱。


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

使用道具 举报

 楼主| 发表于 6 天前 来自手机 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2019-11-8 13:43 编辑

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

使用道具 举报

发表于 6 天前 | 显示全部楼层
本帖最后由 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");  

    }  
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
这个软件好用吗
回复

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
本帖最后由 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]  详情 回复 发表于 6 天前
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
bcdedit 工具应该是最权威的! 虽然用了系统API  GetFirmwareEnvironmentVariableA 但是 bcdedit 工具从层面上看最少也用这个API甚至用比这个还要底层的API。

点评

有些情况bcdedit根本就用不了,打不开,何谈权威?  详情 回复 发表于 6 天前
回复

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
610644034 发表于 2019-11-8 14:28
bcdedit 工具应该是最权威的! 虽然用了系统API  GetFirmwareEnvironmentVariableA 但是 bcdedit 工具从层 ...


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

点评

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2019-11-14 04:19

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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