分享个判断当前系统是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
前排落定 写个批处理,判断是什么模式启动后,重启在DOS下导入安装同目录下的WIM或ESD系统(或备份系统到同目录下),并能增加WIM格式的PE引导到BCD里,如此便解决了很多不会安装电脑的困扰 温馨提示:bcdedit检查winload、wmic、powershell 、C:\Windows\Panther\setupact.log文件检测、注册表 HKLM\System\CurrentControlSet\Control\PEFirmwareType 检测什么的都不靠谱。
楼主说这些检测都不靠谱,那么你是如何检测的? 本帖最后由 liuzhaoyzz 于 2019-11-8 13:43 编辑
一楼不是有吗detectefi32.exe(52KB) 本帖最后由 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");
} 这个软件好用吗 本帖最后由 liuzhaoyzz 于 2019-11-8 13:32 编辑
支持efi引导的//只有win7及以上, 所以xp, 03系统就只能够bios引导
的确,因为我测试了在XP上面运行一楼的小程序,判断也正常,所以就说支持XP判断。
GetFirmwareEnvironmentVariableA这个函数,WIN7以上的64位系统我测试了判断也正确,32位系统我没有测试,我没有32位的UEFI环境。 bcdedit 工具应该是最权威的! 虽然用了系统APIGetFirmwareEnvironmentVariableA 但是 bcdedit 工具从层面上看最少也用这个API甚至用比这个还要底层的API。 610644034 发表于 2019-11-8 14:28
bcdedit 工具应该是最权威的! 虽然用了系统APIGetFirmwareEnvironmentVariableA 但是 bcdedit 工具从层 ...
有些情况bcdedit根本就用不了,打不开,何谈权威?正因为bcdedit打开不靠谱,所以要重复造轮子。 哪个谁谁谁给楼主版主评负分!打击人吗?!
这个检测以前本坛有讨论过,方式好像有好几个。 liuzhaoyzz 发表于 2019-11-8 14:33
有些情况bcdedit根本就用不了,打不开,何谈权威?正因为bcdedit打开不靠谱,所以要重复造轮子。 ...
说句真心话! 你要是去逆向系统API 你就会发现 API 有的还是直接查注册表数据后返回的,所以谈何靠谱? 既然这样,你继续用bcdedit就是了。 难道 GetFirmwareEnvironmentVariableA不香吗 感谢分享,另外请教一下大佬,现在纯脚本还是没啥好办法吗? liuzhaoyzz 发表于 2019-11-8 13:29
的确,因为我测试了在XP上面运行一楼的小程序,判断也正常,所以就说支持XP判断。
GetFirmwareEnvironme ...
然而UEFI启动XP并不能判断 23333~
本帖最后由 liuzhaoyzz 于 2019-11-8 17:48 编辑
你那UEFI启动的XP是经过改造的吧,XP我测试了结果跟你截图是一样的。我没见过UEFI启动的XP。。。 感谢分享。
我的示例:
@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 有点好奇检测完了做些什么,
如果是efi的,则干些?
如果是bios的,则干些?
我一般都决定好启动前要做些什么。。。 不过这个问题我的思路是,提取winload.exe和winload.efi的访问时间,哪个时间迟我觉得就是哪个启动的。
liuzhaoyzz 发表于 2019-11-8 17:32
你那UEFI启动的XP是经过改造的吧,XP我测试了结果跟你截图是一样的。我没见过UEFI启动的XP。。。
XP添加UEFI启动支持其实很简单,只要拷两个文件就可以。这个我早就做到了,只不过一直没公开教程而已。 江南一根葱 发表于 2019-11-8 19:26
有点好奇检测完了做些什么,
如果是efi的,则干些?
如果是bios的,则干些?
用于批处理啊,比如说修改BCD,如果是bios启动就用winload.exe,否则就用winload.efi。 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这三项。 哦,检测bios和uefi的小工具啊,下来备用之,毕竟以后还氏有可能用到uefi主板的。。。
多谢楼主分享。{:1_183:} 其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动 ostrichb 发表于 2019-11-10 17:24
其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动
你那是一般的用户环境,这里是无忧,搞引导的地方,各种复杂的系统环境都有。 ostrichb 发表于 2019-11-10 17:24
其实要判断有一个简单的方法:运行msinfo32里面看一行字写的是传统就是BIOS uefi就是uefi启动
PE里面哪里有msinfo32?正常系统有的都精简了,再说这里面显示的信息,怎么提取出来?比如用到某个bat vbs脚本里面? 还是API可靠。 pe判断没有意义,要判断的是系统的启动方式,和pe没有啥关系。 窄口牛 发表于 2019-11-11 12:10
pe判断没有意义,要判断的是系统的启动方式,和pe没有啥关系。
PE判断当然有意义,只是你没有遇到而已,我有这个需要。 执行exe文件后一闪而退,不知怎么回事