能否在EDKII EFI应用内启用Secure Boot?写入变量遇写保护错误
Secure Boot模式切换失败(EFI_WRITE_PROTECTED错误)排查
问题概述
已成功读写PK、KEK、DB等Secure Boot密钥变量,且确认系统处于Setup Mode,但调用EDKII的SetVariable修改SecureBoot变量时,返回EFI错误码8(EFI_WRITE_PROTECTED),无法启用Secure Boot。其他Secure Boot变量可正常写入,仅该变量修改失败。
使用的代码片段:
SecureBootMode = 1; Status = gRT->SetVariable( EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | TIME_BASED_AUTHENTICATED_WRITE_ACCESS, sizeof(UINT8), &SecureBootMode ); if (EFI_ERROR(Status)) { Print (L"Could not write to SecureBoot State. Error Code: %d\r\n", Status); }
错误原因分析
错误码8对应EFI_WRITE_PROTECTED,核心问题在于变量属性设置不符合Setup Mode下的修改规则:
TIME_BASED_AUTHENTICATED_WRITE_ACCESS属性要求写入操作必须经过时间戳签名认证,但在Setup Mode(PK变量不存在/已清除)下,修改SecureBoot变量不需要签名认证,添加该属性会触发固件的写保护校验。
解决方案
1. 修正变量属性
移除TIME_BASED_AUTHENTICATED_WRITE_ACCESS属性,仅保留非易失性、Boot Service访问、Runtime访问属性。修改后的代码:
SecureBootMode = 1; Status = gRT->SetVariable( EFI_SECURE_BOOT_MODE_NAME, &gEfiGlobalVariableGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, sizeof(UINT8), &SecureBootMode ); if (EFI_ERROR(Status)) { Print (L"Could not write to SecureBoot State. Error Code: %d\r\n", Status); }
2. 验证Setup Mode状态
确保系统确实处于Setup Mode,可通过读取PK变量确认:
UINTN PkSize = 0; EFI_STATUS Status = gRT->GetVariable( L"PK", &gEfiGlobalVariableGuid, NULL, &PkSize, NULL ); if (Status == EFI_NOT_FOUND) { Print(L"System is in Setup Mode.\r\n"); } else { Print(L"System is NOT in Setup Mode. Please clear PK first.\r\n"); }
若返回EFI_NOT_FOUND,说明PK不存在,系统处于Setup Mode;若PK存在,需先清除PK进入Setup Mode。
3. 固件限制处理
若上述操作仍失败,可能是厂商固件限制了直接修改SecureBoot变量:
- 尝试通过BIOS界面手动开启Secure Boot;
- 联系设备厂商获取专用的Secure Boot配置工具。
内容的提问来源于stack exchange,提问作者Mabensur
相关产品推荐
相关产品推荐

