liuzhaoyzz 发表于 2019-11-8 12:04:35

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

本帖最后由 liuzhaoyzz 于 2019-11-8 15:58 编辑

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

批处理调用示例.bat
@echo off
pushd "%~dp0"
rem 检测BIOS/UEFI启动
detectefi32 |find /i "Legacy" && (
        set "winload=winload.exe"
       goto :BIOS
)||(
        set "winload=winload.efi"
goto :UEFI
)
popd

:BIOS
pause
exit /b

:UEFI
pause
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

maghreb 发表于 2019-11-8 12:20:53

前排落定

maghreb 发表于 2019-11-8 12:30:52

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

指南针 发表于 2019-11-8 13:08:49

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

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

liuzhaoyzz 发表于 2019-11-8 13:18:42

本帖最后由 liuzhaoyzz 于 2019-11-8 13:43 编辑

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

foxfirefox 发表于 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");

    }

wxh0712 发表于 2019-11-8 13:24:21

这个软件好用吗

liuzhaoyzz 发表于 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环境。      

610644034 发表于 2019-11-8 14:28:13

bcdedit 工具应该是最权威的! 虽然用了系统APIGetFirmwareEnvironmentVariableA 但是 bcdedit 工具从层面上看最少也用这个API甚至用比这个还要底层的API。

liuzhaoyzz 发表于 2019-11-8 14:33:03

610644034 发表于 2019-11-8 14:28
bcdedit 工具应该是最权威的! 虽然用了系统APIGetFirmwareEnvironmentVariableA 但是 bcdedit 工具从层 ...

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

chishingchan 发表于 2019-11-8 14:40:10

哪个谁谁谁给楼主版主评负分!打击人吗?!

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

610644034 发表于 2019-11-8 15:02:39

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

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

liuzhaoyzz 发表于 2019-11-8 15:33:39

既然这样,你继续用bcdedit就是了。

2012jiashanni 发表于 2019-11-8 15:43:13

难道 GetFirmwareEnvironmentVariableA不香吗

moran 发表于 2019-11-8 16:37:58

感谢分享,另外请教一下大佬,现在纯脚本还是没啥好办法吗?

朱玛12345678 发表于 2019-11-8 17:29:29

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

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

liuzhaoyzz 发表于 2019-11-8 17:32:20

本帖最后由 liuzhaoyzz 于 2019-11-8 17:48 编辑

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

hilsonma 发表于 2019-11-8 17:56:51

感谢分享。
我的示例:
@echo off
pushd "%~dp0"
rem 检测BIOS/UEFI启动
for /f %%a in ('detectefi32') do set bootdect=%%a
goto %bootdect%

:UEFI
set winload=winload.efi
echo %winload%
pause
exit /b

:Legacy
set winload=winload.exe
echo %winload%
pause
exit /b

江南一根葱 发表于 2019-11-8 19:26:38

有点好奇检测完了做些什么,
如果是efi的,则干些?
如果是bios的,则干些?
我一般都决定好启动前要做些什么。。。

江南一根葱 发表于 2019-11-8 19:36:39

不过这个问题我的思路是,提取winload.exe和winload.efi的访问时间,哪个时间迟我觉得就是哪个启动的。

朱玛12345678 发表于 2019-11-8 19:47:25

liuzhaoyzz 发表于 2019-11-8 17:32
你那UEFI启动的XP是经过改造的吧,XP我测试了结果跟你截图是一样的。我没见过UEFI启动的XP。。。

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

liuzhaoyzz 发表于 2019-11-8 20:03:19

江南一根葱 发表于 2019-11-8 19:26
有点好奇检测完了做些什么,
如果是efi的,则干些?
如果是bios的,则干些?


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

hilsonma 发表于 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这三项。

gnuxwy 发表于 2019-11-8 21:17:46

哦,检测bios和uefi的小工具啊,下来备用之,毕竟以后还氏有可能用到uefi主板的。。。

多谢楼主分享。{:1_183:}

ostrichb 发表于 2019-11-10 17:24:59

其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动

窄口牛 发表于 2019-11-10 18:15:52

ostrichb 发表于 2019-11-10 17:24
其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动

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

liuzhaoyzz 发表于 2019-11-11 10:04:15

ostrichb 发表于 2019-11-10 17:24
其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动

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

窄口牛 发表于 2019-11-11 12:10:13

pe判断没有意义,要判断的是系统的启动方式,和pe没有啥关系。

liuzhaoyzz 发表于 2019-11-11 13:27:52

窄口牛 发表于 2019-11-11 12:10
pe判断没有意义,要判断的是系统的启动方式,和pe没有啥关系。

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

brook 发表于 2020-1-3 12:47:19

执行exe文件后一闪而退,不知怎么回事
页: [1] 2 3 4 5
查看完整版本: 分享个判断当前系统是BIOS还是UEFI启动的小程序