窄口牛 发表于 2018-11-11 10:43:32

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

wmic可以?

fuldho 发表于 2018-11-11 11:14:34

WinAPI

窄口牛 发表于 2018-11-11 11:16:42

那vbs应该就行吧,可惜不会写。

tools241 发表于 2018-11-11 11:17:57

本帖最后由 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:36:32

本帖最后由 窄口牛 于 2018-11-11 14:39 编辑


看样子,命令无法显示了

tools241 发表于 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"

窄口牛 发表于 2018-11-11 17:38:04

微软的文档说明是pe里看注册表,系统下是二楼的方法。网络里那些都靠不住。

wuyouaaa 发表于 2018-11-11 18:39:49

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

窄口牛 发表于 2018-11-11 20:11:50

我的系统没有这个命令,被精简了。

窄口牛 发表于 2018-11-11 21:01:32

而另一个系统里msinfo32并没有bios模式这一项。

tools241 发表于 2018-11-11 21:04:43

窄口牛 发表于 2018-11-11 20:11
我的系统没有这个命令,被精简了。

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

窄口牛 发表于 2018-11-12 08:56:02


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

窄口牛 发表于 2018-11-12 18:26:10

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 19:54:36

本帖最后由 窄口牛 于 2018-11-12 20:42 编辑

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

au3的

2012xb21cn 发表于 2018-11-14 10:46:21

本帖最后由 2012xb21cn 于 2018-11-14 10:57 编辑

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

窄口牛 发表于 2018-11-14 11:34:16

非常感谢出手。我其实想要命令行那样,做成ntdos的命令,这个源码都是弹出式,我以为c++的和au3不一样呢。

2012xb21cn 发表于 2018-11-14 13:21:46

本帖最后由 2012xb21cn 于 2018-11-14 13:32 编辑

窄口牛 发表于 2018-11-14 11:34
非常感谢出手。我其实想要命令行那样,做成ntdos的命令,这个源码都是弹出式,我以为c++的和au3不一样呢。

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

窄口牛 发表于 2018-11-14 13:27:00

叩谢,呱唧呱唧。不然怎么会发dos区的。

2012xb21cn 发表于 2018-11-14 13:35:12

窄口牛 发表于 2018-11-14 13:27
叩谢,呱唧呱唧。不然怎么会发dos区的。

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

窄口牛 发表于 2018-11-14 13:59:33

对,更为合理。

pixcn007 发表于 2021-6-21 08:55:01

tools241 发表于 2018-11-11 11:17
方法很多, 例:

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

我的Dism++执行后,左上方没有提示,是空的
页: [1]
查看完整版本: 有没有判断启动系统是legacy还是efi的办法?