无忧启动论坛

标题: 有没有判断启动系统是legacy还是efi的办法? [打印本页]

作者: 窄口牛    时间: 2018-11-11 10:43
标题: 有没有判断启动系统是legacy还是efi的办法?
wmic可以?
作者: fuldho    时间: 2018-11-11 11:14
WinAPI


作者: 窄口牛    时间: 2018-11-11 11:16
那vbs应该就行吧,可惜不会写。
作者: tools241    时间: 2018-11-11 11:17
本帖最后由 tools241 于 2018-11-11 16:51 编辑

方法很多, 例:

1.按[Win + R]打开运行,输入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:36
本帖最后由 窄口牛 于 2018-11-11 14:39 编辑


看样子,命令无法显示了
作者: tools241    时间: 2018-11-11 16:15
本帖最后由 tools241 于 2018-11-11 16:51 编辑
窄口牛 发表于 2018-11-11 14:36
看样子,命令无法显示了

Q1.大大是要用在正常系统或PE ?
Q2.是要用在批处理?

若在正常系统, 可由 C:\Windows\Panther\setupact.log 中找 "Detected boot environment"


作者: 窄口牛    时间: 2018-11-11 17:38
微软的文档说明是pe里看注册表,系统下是二楼的方法。网络里那些都靠不住。
作者: wuyouaaa    时间: 2018-11-11 18:39


运行MSINFO32
作者: 窄口牛    时间: 2018-11-11 20:11
我的系统没有这个命令,被精简了。
作者: 窄口牛    时间: 2018-11-11 21:01
而另一个系统里msinfo32并没有bios模式这一项。
作者: tools241    时间: 2018-11-11 21:04
窄口牛 发表于 2018-11-11 20:11
我的系统没有这个命令,被精简了。

PE没添加 \Windows\System32\msinfo32.exe 及 \Windows\System32\zh-CN\msinfo32.exe.mui
作者: 窄口牛    时间: 2018-11-12 08:56

我猜msinfo32的结果来自启动菜单文件bcd,而我bcd的启动文件一栏恰恰是我删除了的,是空的。

作者: 窄口牛    时间: 2018-11-12 18:26
au3代码
  1. #include <WinAPI.au3>
  2. Global Const $ERROR_INVALID_FUNCTION=0x1
  3. DllCall("Kernel32.dll", "dword", "GetFirmwareEnvironmentVariableW", "wstr", "", "wstr", '{00000000-0000-0000-0000-000000000000}', "wstr", Null, "dword", 0)
  4. If _WinAPI_GetLastError() = $ERROR_INVALID_FUNCTION Then
  5.     MsgBox(0,'','Legacy BIOS')
  6. Else
  7.     MsgBox(0,'','UEFI Boot Mode')
  8. EndIf
复制代码

c++代码
  1. //百度很多资料都没有找到,  终于在谷歌上找到很多有用的资料了,   最后在微软的网站找到最有用的资料了.
  2. //判断流程可以这样:
  3. //1, 支持efi引导的//只有win7及以上, 所以xp, 03系统就只能够bios引导
  4. //2, win7,8,8.1,10等系统, 可以用下面的代码, 本质上就是GetFirmwareEnvironmentVariableA, 或者GetFirmwareType这两个api的调用

  5. #include <Windows.h>
  6. #include <Winbase.h>        //GetFirmwareEnvironmentVariableA  和   GetFirmwareType的头文件
  7. #include <iostream>
  8. using namespace std;
  9. void main()
  10. {
  11.         //For Windows 8/Server 2012 and above可用
  12.         /*
  13.         typedef enum _FIRMWARE_TYPE {
  14.         FirmwareTypeUnknown = 0,
  15.         FirmwareTypeBios = 1,
  16.         FirmwareTypeUefi = 2,
  17.         FirmwareTypeMax = 3
  18.         } FIRMWARE_TYPE, *PFIRMWARE_TYPE;
  19.         */
  20.         FIRMWARE_TYPE a;
  21.         GetFirmwareType(&a);
  22.         switch (a)
  23.         {
  24.         case FirmwareTypeUnknown:
  25.                 cout << "不知名引导" << endl; break;
  26.         case FirmwareTypeBios:
  27.                 cout << "Bios引导" << endl; break;
  28.         case FirmwareTypeUefi:
  29.                 cout << "Uefi引导" << endl; break;
  30.         case FirmwareTypeMax:
  31.                 cout << "Not implemented" << endl; break;
  32.         }

  33.         //Windows 7/Server 2008R2 and above可用
  34.         GetFirmwareEnvironmentVariableA("", "{00000000-0000-0000-0000-000000000000}", NULL, 0);
  35.         if (GetLastError() == ERROR_INVALID_FUNCTION)
  36.                 //API not supported; this is a legacy BIOS
  37.                 cout << "Bios引导" << endl;
  38.         else
  39.                 //API error (expected) but call is supported.This is UEFI.
  40.                 cout << "Uefi引导" << endl;
  41.                
  42.         system("pause");
  43. }

复制代码

作者: 窄口牛    时间: 2018-11-12 19:54
本帖最后由 窄口牛 于 2018-11-12 20:42 编辑

哪位有环境,方便的编译个c++的出来?

au3的 判断启动模式.rar (315.01 KB, 下载次数: 28)
作者: 2012xb21cn    时间: 2018-11-14 10:46
本帖最后由 2012xb21cn 于 2018-11-14 10:57 编辑

g++编译了一个,体积有点大

引导模式判断.rar

483.15 KB, 下载次数: 26, 下载积分: 无忧币 -2


作者: 窄口牛    时间: 2018-11-14 11:34
非常感谢出手。我其实想要命令行那样,做成ntdos的命令,这个源码都是弹出式,我以为c++的和au3不一样呢。
作者: 2012xb21cn    时间: 2018-11-14 13:21
本帖最后由 2012xb21cn 于 2018-11-14 13:32 编辑
窄口牛 发表于 2018-11-14 11:34
非常感谢出手。我其实想要命令行那样,做成ntdos的命令,这个源码都是弹出式,我以为c++的和au3不一样呢。


原来你要命令行模式啊?我还嫌命令行太丑改成弹窗式,看来是多此一举了
下面这个是命令行模式的,带暂停

引导判断.rar

482.78 KB, 下载次数: 41, 下载积分: 无忧币 -2


作者: 窄口牛    时间: 2018-11-14 13:27
叩谢,呱唧呱唧。不然怎么会发dos区的。
作者: 2012xb21cn    时间: 2018-11-14 13:35
窄口牛 发表于 2018-11-14 13:27
叩谢,呱唧呱唧。不然怎么会发dos区的。

既然是命令行调用,那还是编译一个去掉暂停的
dos窗口运行才显示结果,双击的话没显示

引导判断.rar

482.97 KB, 下载次数: 52, 下载积分: 无忧币 -2


作者: 窄口牛    时间: 2018-11-14 13:59
对,更为合理。
作者: pixcn007    时间: 2021-6-21 08:55
tools241 发表于 2018-11-11 11:17
方法很多, 例:

1.按[Win + R]打开运行,输入msinfo32,回车查看系统信息。在BIOS模式中如果显示“传统” ...

我的Dism++执行后,左上方没有提示,是空的




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3