You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Delphi应用检测计算机是UEFI还是Legacy BIOS?

检测UEFI/Legacy BIOS的Delphi实现方案

核心思路

Windows API ExGetFirmwareEnvironmentVariable 是专门用于访问UEFI环境变量的接口,Legacy BIOS环境下调用该函数会直接返回失败并设置错误码ERROR_INVALID_FUNCTION。利用这一特性,可以准确区分当前系统的固件类型。

完整实现代码

1. 函数声明(需放在interface区域)

function ExGetFirmwareEnvironmentVariable(lpName: LPCWSTR; lpGuid: LPCGUID; pBuffer: PVOID; nSize: DWORD): DWORD; stdcall; external 'kernel32.dll' name 'ExGetFirmwareEnvironmentVariableW';
const
  ERROR_INVALID_FUNCTION = $00000001;

2. IsUEFI布尔函数实现

function IsUEFI: Boolean;
const
  // UEFI全局变量的标准GUID
  EFI_GLOBAL_VARIABLE_GUID: TGUID = '{8BE4DF61-93CA-11D2-AA0D-00E098032B8C}';
var
  Data: array[0..1023] of Byte;
  DataSize: DWORD;
  LastErr: DWORD;
begin
  Result := False;
  DataSize := SizeOf(Data);
  
  // 尝试读取空名称的UEFI全局变量:
  // - UEFI环境下,若有权限则返回非0值;若无权限则返回0,错误码为ERROR_ACCESS_DENIED
  // - Legacy环境下返回0,错误码为ERROR_INVALID_FUNCTION
  if ExGetFirmwareEnvironmentVariable('', @EFI_GLOBAL_VARIABLE_GUID, @Data, DataSize) <> 0 then
    Result := True
  else
  begin
    LastErr := GetLastError;
    // 排除Legacy特有的错误码,其余情况判定为UEFI环境
    Result := LastErr <> ERROR_INVALID_FUNCTION;
  end;
end;

关键注意事项

  • 权限要求:程序必须以管理员权限运行,否则会因权限不足返回错误,导致误判。
  • 系统兼容性:仅支持Windows Vista及以上版本,Windows XP及更早系统不提供该API。
  • 错误处理:若调用返回错误码ERROR_ACCESS_DENIED,说明当前是UEFI环境但无读取权限,此时仍需判定为UEFI。

内容的提问来源于stack exchange,提问作者Shaun Roselt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 21:12:14