有没有判断启动系统是legacy还是efi的办法?
wmic可以? WinAPI那vbs应该就行吧,可惜不会写。 本帖最后由 tools241 于 2018-11-11 16:51 编辑
方法很多, 例:
1.按打开运行,输入msinfo32,回车查看系统信息。在BIOS模式中如果显示“传统”,
表示系统启动方式为Legacy BIOS;如果为UEFI,则显示UEFI。
注: 一般PE没添加 msinfo32.exe
2.在 C:\Windows\Panther\setupact.log 中找 "Detected boot environment" 其后为 BIOS 或 UEIF, 例:
...
2018-11-07 13:38:26, Info IBS Callback_BootEnvironmentDetect: Detected boot environment: BIOS
...
注: 一般PE不一定添加了 \Windows\Panther
3.Dism++执行后看左上方.
4.注册表 -- 忘了是那一项. 本帖最后由 窄口牛 于 2018-11-11 14:39 编辑
看样子,命令无法显示了 本帖最后由 tools241 于 2018-11-11 16:51 编辑
窄口牛 发表于 2018-11-11 14:36
看样子,命令无法显示了
Q1.大大是要用在正常系统或PE ?
Q2.是要用在批处理?
若在正常系统, 可由 C:\Windows\Panther\setupact.log 中找 "Detected boot environment"
微软的文档说明是pe里看注册表,系统下是二楼的方法。网络里那些都靠不住。 https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/94/73/metablogapi/1007.image_thumb_494C44B9.png
运行MSINFO32 我的系统没有这个命令,被精简了。 而另一个系统里msinfo32并没有bios模式这一项。 窄口牛 发表于 2018-11-11 20:11
我的系统没有这个命令,被精简了。
PE没添加 \Windows\System32\msinfo32.exe 及 \Windows\System32\zh-CN\msinfo32.exe.mui
我猜msinfo32的结果来自启动菜单文件bcd,而我bcd的启动文件一栏恰恰是我删除了的,是空的。
au3代码
#include <WinAPI.au3>
Global Const $ERROR_INVALID_FUNCTION=0x1
DllCall("Kernel32.dll", "dword", "GetFirmwareEnvironmentVariableW", "wstr", "", "wstr", '{00000000-0000-0000-0000-000000000000}', "wstr", Null, "dword", 0)
If _WinAPI_GetLastError() = $ERROR_INVALID_FUNCTION Then
MsgBox(0,'','Legacy BIOS')
Else
MsgBox(0,'','UEFI Boot Mode')
EndIf
c++代码
//百度很多资料都没有找到,终于在谷歌上找到很多有用的资料了, 最后在微软的网站找到最有用的资料了.
//判断流程可以这样:
//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");
}
本帖最后由 窄口牛 于 2018-11-12 20:42 编辑
哪位有环境,方便的编译个c++的出来?
au3的 本帖最后由 2012xb21cn 于 2018-11-14 10:57 编辑
g++编译了一个,体积有点大 非常感谢出手。我其实想要命令行那样,做成ntdos的命令,这个源码都是弹出式,我以为c++的和au3不一样呢。 本帖最后由 2012xb21cn 于 2018-11-14 13:32 编辑
窄口牛 发表于 2018-11-14 11:34
非常感谢出手。我其实想要命令行那样,做成ntdos的命令,这个源码都是弹出式,我以为c++的和au3不一样呢。
原来你要命令行模式啊?我还嫌命令行太丑改成弹窗式,看来是多此一举了
下面这个是命令行模式的,带暂停 叩谢,呱唧呱唧。不然怎么会发dos区的。 窄口牛 发表于 2018-11-14 13:27
叩谢,呱唧呱唧。不然怎么会发dos区的。
既然是命令行调用,那还是编译一个去掉暂停的
dos窗口运行才显示结果,双击的话没显示 对,更为合理。 tools241 发表于 2018-11-11 11:17
方法很多, 例:
1.按打开运行,输入msinfo32,回车查看系统信息。在BIOS模式中如果显示“传统” ...
我的Dism++执行后,左上方没有提示,是空的
页:
[1]