如何通过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
相关产品推荐
相关产品推荐

