无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 8099|回复: 20
打印 上一主题 下一主题

有没有判断启动系统是legacy还是efi的办法?

[复制链接]
跳转到指定楼层
1#
发表于 2018-11-11 10:43:32 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
推荐
发表于 2018-11-11 11:14:34 | 只看该作者
WinAPI

回复

使用道具 举报

3#
 楼主| 发表于 2018-11-11 11:16:42 来自手机 | 只看该作者
那vbs应该就行吧,可惜不会写。
回复

使用道具 举报

4#
发表于 2018-11-11 11:17:57 | 只看该作者
本帖最后由 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.注册表 -- 忘了是那一项.
回复

使用道具 举报

5#
 楼主| 发表于 2018-11-11 14:36:32 | 只看该作者
本帖最后由 窄口牛 于 2018-11-11 14:39 编辑


看样子,命令无法显示了

点评

Q1.大大是要用在正常系统或PE ? Q2.是要用在批处理? 若在正常系统, 可由 C:\Windows\Panther\setupact.log 中找 "Detected boot environment" 若是在PE, 可研究 bcdedit.exe 的用法  详情 回复 发表于 2018-11-11 16:15
回复

使用道具 举报

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

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

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

回复

使用道具 举报

7#
 楼主| 发表于 2018-11-11 17:38:04 | 只看该作者
微软的文档说明是pe里看注册表,系统下是二楼的方法。网络里那些都靠不住。
回复

使用道具 举报

8#
发表于 2018-11-11 18:39:49 | 只看该作者


运行MSINFO32
回复

使用道具 举报

9#
 楼主| 发表于 2018-11-11 20:11:50 来自手机 | 只看该作者
我的系统没有这个命令,被精简了。

点评

PE没添加 \Windows\System32\msinfo32.exe 及 \Windows\System32\zh-CN\msinfo32.exe.mui  详情 回复 发表于 2018-11-11 21:04
回复

使用道具 举报

10#
 楼主| 发表于 2018-11-11 21:01:32 来自手机 | 只看该作者
而另一个系统里msinfo32并没有bios模式这一项。
回复

使用道具 举报

11#
发表于 2018-11-11 21:04:43 | 只看该作者
窄口牛 发表于 2018-11-11 20:11
我的系统没有这个命令,被精简了。

PE没添加 \Windows\System32\msinfo32.exe 及 \Windows\System32\zh-CN\msinfo32.exe.mui
回复

使用道具 举报

12#
 楼主| 发表于 2018-11-12 08:56:02 | 只看该作者

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

使用道具 举报

13#
 楼主| 发表于 2018-11-12 18:26:10 | 只看该作者
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. }

复制代码
回复

使用道具 举报

14#
 楼主| 发表于 2018-11-12 19:54:36 来自手机 | 只看该作者
本帖最后由 窄口牛 于 2018-11-12 20:42 编辑

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

au3的 判断启动模式.rar (315.01 KB, 下载次数: 28)
回复

使用道具 举报

15#
发表于 2018-11-14 10:46:21 | 只看该作者
本帖最后由 2012xb21cn 于 2018-11-14 10:57 编辑

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

引导模式判断.rar

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

回复

使用道具 举报

16#
 楼主| 发表于 2018-11-14 11:34:16 | 只看该作者
非常感谢出手。我其实想要命令行那样,做成ntdos的命令,这个源码都是弹出式,我以为c++的和au3不一样呢。

点评

原来你要命令行模式啊?我还嫌命令行太丑改成弹窗式,看来是多此一举了 下面这个是命令行模式的  详情 回复 发表于 2018-11-14 13:21
回复

使用道具 举报

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


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

引导判断.rar

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

回复

使用道具 举报

18#
 楼主| 发表于 2018-11-14 13:27:00 | 只看该作者
叩谢,呱唧呱唧。不然怎么会发dos区的。

点评

既然是命令行调用,那还是编译一个去掉暂停的 dos窗口运行才显示结果,双击的话没显示  详情 回复 发表于 2018-11-14 13:35
回复

使用道具 举报

19#
发表于 2018-11-14 13:35:12 | 只看该作者
窄口牛 发表于 2018-11-14 13:27
叩谢,呱唧呱唧。不然怎么会发dos区的。

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

引导判断.rar

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

回复

使用道具 举报

20#
 楼主| 发表于 2018-11-14 13:59:33 来自手机 | 只看该作者
对,更为合理。
回复

使用道具 举报

21#
发表于 2021-6-21 08:55:01 | 只看该作者
tools241 发表于 2018-11-11 11:17
方法很多, 例:

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

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

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-25 11:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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