【问题标题】:Setting NVRAM variable using WinAPI使用 WinAPI 设置 NVRAM 变量
【发布时间】:2019-05-30 18:09:36
【问题描述】:

我正在尝试使用 WinAPI (SetFirmwareEnvironmentVariable) 设置我自己的 NVRAM 变量 (nv+rt+bs)。它因我的变量而失败,并使用 BootOrder 成功完成。我做错了什么?是否可以使用 WinAPI 设置我自己的变量?

我正在尝试使用此代码设置我的变量

void setMyNVRAM()
{
    // here I setup SE_SYSTEM_ENVIRONMENT_NAME privilege

    uint16_t value = 0x5aa5;

    if (!SetFirmwareEnvironmentVariable(L"MY_VARIABLE",
       L"{12345678-1234-1234-1234-123456789012}", &value, sizeof (value)))
    {
        std::cout << "error while settin up MY_VARIABLE. Error code: " 
                  << GetLastError() << std::endl;
    }
    else
    {
        std::cout << "success" << std::endl;
    }
}

SetFirmwareEnvironmentVariable 返回 0,GetLastError() 返回 5(拒绝访问)。我也尝试写入BootOrder变量,成功完成。

【问题讨论】:

  • 文档表明错误代码是系统固件返回的错误的映射。如果您尝试从 EFI shell 创建相同的变量会发生什么?可能变量名称或命名空间 GUID 被限制为匹配现有值。

标签: winapi uefi


【解决方案1】:

根据MSDN上的说明。

要编写固件环境变量,需要使用的用户帐户 运行的应用程序必须具有 SE_SYSTEM_ENVIRONMENT_NAME 特权。通用 Windows 应用程序必须由管理员运行 帐户并遵循访问 UEFI 固件中列出的要求 来自通用 Windows 应用程序的变量。

Customizing user privileges for an account in Windows

类似的讨论:How i can set firmware environment variable in UEFI driver

【讨论】:

  • 谢谢你的回答。我的代码中有一条注释说我设置了 SE_SYSTEM_ENVIRONMENT_NAME 权限。我的应用程序是从管理员帐户运行的。我在另一台计算机上尝试了这段代码,它工作得很好。也许它类似于固件保护。等我发现了我就写一个答案。我不明白的一件事是如何将 Capabilities 标签添加到程序集清单。
猜你喜欢
  • 2015-10-24
  • 2011-12-29
  • 1970-01-01
  • 2012-03-01
  • 2021-05-24
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多