无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: liuzhaoyzz

[分享] 分享个判断当前系统是BIOS还是UEFI启动的小程序

    [复制链接]
发表于 2021-11-26 19:14:16 | 显示全部楼层
liuzhaoyzz 发表于 2021-11-26 15:52
static void PrintFwInfo(void)
{
        DWORD VarSize = 0;

你这不是能看懂C吗。

点评

无论什么语言,我的水平只能写“Hello world!”  详情 回复 发表于 2021-11-27 11:46
回复

使用道具 举报

发表于 2021-11-26 20:58:52 | 显示全部楼层
liuzhaoyzz 发表于 2021-11-26 15:20
32位保护模式的程序,怎么可能运行在16位实模式的DOS上面?吹牛不打草稿

DetectEFI32感觉在 ...

正是因为不能运行,所以不影响判断结果
回复

使用道具 举报

发表于 2021-11-26 20:59:05 | 显示全部楼层
liuzhaoyzz 发表于 2021-11-26 15:20
32位保护模式的程序,怎么可能运行在16位实模式的DOS上面?吹牛不打草稿

DetectEFI32感觉在 ...

正是因为不能运行,所以不影响判断结果
回复

使用道具 举报

发表于 2021-11-26 20:59:24 | 显示全部楼层
liuzhaoyzz 发表于 2021-11-26 15:20
32位保护模式的程序,怎么可能运行在16位实模式的DOS上面?吹牛不打草稿

DetectEFI32感觉在 ...

正是因为不能运行,所以不影响判断结果
回复

使用道具 举报

发表于 2021-11-26 20:59:59 | 显示全部楼层
liuzhaoyzz 发表于 2021-11-26 15:20
32位保护模式的程序,怎么可能运行在16位实模式的DOS上面?吹牛不打草稿

DetectEFI32感觉在 ...

正是因为不能运行,所以不影响判断结果
回复

使用道具 举报

 楼主| 发表于 2021-11-27 11:46:04 | 显示全部楼层
wintoflash 发表于 2021-11-26 19:14
你这不是能看懂C吗。

无论什么语言,我的水平只能写“Hello world!”
回复

使用道具 举报

发表于 2021-12-18 15:24:50 | 显示全部楼层
WIN10 64位用不了,批出理没有显示判断结果,只有一句按任意键继续。。

点评

分享一个显示硬件信息的开源小程序nwinfo - 脚本讨论区 - 无忧启动论坛 - Powered by Discuz! http://wuyou.net/forum.php?mod=viewthread&tid=428046&extra=page%3D1 直接用wintoflash的。  详情 回复 发表于 2021-12-18 17:52
回复

使用道具 举报

 楼主| 发表于 2021-12-18 17:52:08 | 显示全部楼层
bjay2008xmy 发表于 2021-12-18 15:24
WIN10 64位用不了,批出理没有显示判断结果,只有一句按任意键继续。。

分享一个显示硬件信息的开源小程序nwinfo - 脚本讨论区 - 无忧启动论坛 - Powered by Discuz! http://wuyou.net/forum.php?mod=v ... &extra=page%3D1

直接用wintoflash的。
回复

使用道具 举报

发表于 2023-2-28 16:14:42 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 2023-2-28 20:37:41 来自手机 | 显示全部楼层
强强强
回复

使用道具 举报

发表于 2023-3-1 18:22:31 | 显示全部楼层

谢谢分享!
回复

使用道具 举报

发表于 2023-3-1 19:54:54 | 显示全部楼层
very good
回复

使用道具 举报

发表于 2023-3-4 08:52:25 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2023-3-5 07:01:48 来自手机 | 显示全部楼层
顶顶顶,这个太好了
回复

使用道具 举报

发表于 2023-3-5 08:26:03 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2023-3-5 08:31:43 | 显示全部楼层
这个直观方便
回复

使用道具 举报

发表于 2023-3-5 21:45:50 | 显示全部楼层
学习学习
回复

使用道具 举报

发表于 2023-3-6 06:02:37 来自手机 | 显示全部楼层
学习
回复

使用道具 举报

发表于 2023-3-6 07:01:56 来自手机 | 显示全部楼层
不错
回复

使用道具 举报

发表于 2023-3-12 23:49:48 | 显示全部楼层
很有用的东西
回复

使用道具 举报

发表于 2023-3-16 01:27:26 | 显示全部楼层
大佬  能写个cmd选择文件夹或文件 小程序吗

点评

可以用拖放模式啊,效果是把文件、文件夹拖到正在运行的批处理上,百度一艘一大堆,我就是百度来的。不难。  详情 回复 发表于 2023-3-16 11:50
回复

使用道具 举报

 楼主| 发表于 2023-3-16 11:50:35 | 显示全部楼层
wuhuayu 发表于 2023-3-16 01:27
大佬  能写个cmd选择文件夹或文件 小程序吗

可以用拖放模式啊,效果是把文件、文件夹拖到正在运行的批处理上,百度一艘一大堆,我就是百度来的。不难。
回复

使用道具 举报

发表于 2023-3-16 18:10:35 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2023-4-17 22:10:56 | 显示全部楼层
挖坟备忘
反编译 bcdedit.exe,可以看出它是通过 NtQuerySystemInformation 获取未公开结构体 SYSTEM_BOOT_ENVIRONMENT_INFORMATION 来判断 BIOS/UEFI 的。
(SYSTEM_INFORMATION_CLASS)90 = 0x5A = SystemBootEnvironmentInformation
  1. __int64 SiGetFirmwareType()
  2. {
  3.   unsigned int v0; // ebx
  4.   char SystemInformation[16]; // [rsp+20h] [rbp-38h] BYREF
  5.   unsigned int v3; // [rsp+30h] [rbp-28h]

  6.   v0 = 1;
  7.   if ( NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)90, SystemInformation, 0x20u, 0i64) >= 0 )
  8.   {
  9.     v0 = 0;
  10.     if ( (int)v3 < 3 )
  11.       return v3;
  12.   }
  13.   return v0;
  14. }
复制代码

https://www.geoffchappell.com/st ... ent_information.htm

EFIGuard 也用了这个方法,看来应该更靠谱。
回复

使用道具 举报

发表于 2023-4-17 22:17:10 | 显示全部楼层
另外关于这个帖子 请问下有没有命令行工具添加UEFI引导序列?
记得有人说过用 bootice 不能修改 UEFI 启动项。
我在某些环境下重现了这个问题,就是用 API SetFirmwareEnvironmentVariable 设置 UEFI 变量失败。
但是诡异的是,执行一次 bcdedit /enum FIRMWARE 之后就正常了。
反编译 bcdedit 可知,它根本不用微软公开的这个 API,而是用了未公开的 ZwQueryBootOptions 和 ZwSetBootOptions 。

点评

好像见到论坛上有人反馈过,用bootice不能添加或者修改UEFI启动项,但我没有经历过,或者有经历过,忘了。 感觉上BOOTICE1.4版本对于添加修改UEFI启动项,有代码修正。 我联系过pauly,希望他开源,他没有答应。  详情 回复 发表于 2023-4-18 17:49
回复

使用道具 举报

 楼主| 发表于 2023-4-18 17:49:07 | 显示全部楼层
wintoflash 发表于 2023-4-17 22:17
另外关于这个帖子 请问下有没有命令行工具添加UEFI引导序列?
记得有人说过用 bootice 不能修改 UEFI 启动 ...

好像见到论坛上有人反馈过,用bootice不能添加或者修改UEFI启动项,但我没有经历过,或者有经历过,忘了。
感觉上BOOTICE1.4版本对于添加修改UEFI启动项,有代码修正。
我联系过pauly,希望他开源,他没有答应。

回复

使用道具 举报

发表于 2023-4-19 11:05:53 | 显示全部楼层
支持一下
回复

使用道具 举报

发表于 2023-4-20 13:01:31 | 显示全部楼层
回复

使用道具 举报

发表于 2023-4-21 11:21:38 来自手机 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2023-4-21 11:28 编辑

bcedit 获取bcd启动信息,是通过系统api定位启动分区,找bcd的,有的系统启动环境复杂,bcdedit就不一定好用,有的,bcd中没有指明启动文件winload.efi位置,系统也能启动。有时用grub调用 其他分区上 甚至虚拟盘上的bootmgr 启动系统的,bcdedit可能会把bcd定位到grub所在分区或找不到bootmgr分区,进而找不到bcd。情况太多了。

所以,需要用单独的程序调用系统api检测启动模式。

另外,可以试试 Mountvol  。

点评

mountvol 判断启动模式,和我上面说的方法一样。  详情 回复 发表于 2023-4-21 12:59
回复

使用道具 举报

发表于 2023-4-21 12:59:33 | 显示全部楼层
本帖最后由 wintoflash 于 2023-4-21 13:04 编辑
dos时代菜鸟 发表于 2023-4-21 11:21
bcedit 获取bcd启动信息,是通过系统api定位启动分区,找bcd的,有的系统启动环境复杂,bcdedit就不一定好 ...

mountvol 判断启动模式,和我上面说的方法一样。
  1. __int64 IsEfi()
  2. {
  3.   unsigned int v0; // ebx
  4.   SYSTEM_BOOT_ENVIRONMENT_INFORMATION SystemInformation; // [rsp+20h] [rbp-38h] BYREF

  5.   v0 = 0;
  6.   memset(&SystemInformation, 0, sizeof(SystemInformation));
  7.   if ( NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)90, &SystemInformation, 0x20u, 0i64) >= 0 )
  8.     return SystemInformation.FirmwareType == 2;
  9.   return v0;
  10. }
复制代码

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-3-28 22:08

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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