UEFI——Variable的使用

news2024/9/19 3:17:58

一、Variable简介

Variable Services是Runtime Services的一部分,提供关于variable的一些服务,Variable被定义为键值对,由标识信息加上属性(键)和任意数据(值)组成。用在固件部内部和固件与操作系统之间传递信息。

变量的用途:

配置和数据存储:UEFI变量用于存储固件配置设置、系统状态、以及启动选项等信息。

操作系统启动:操作系统启动管理器使用UEFI来存储启动项

安全性:UEFI变量可用于存储安全相关的信息。如启动授权、平台密钥等。

UEFI规范为Variable Services定义了四个接口,如图所示

GetVariable接口的作用是返回一个指定Variable的值,其函数原型为:

/*
    返回指定variable的值
    每个供应商可以使用唯一的VendorGuid创建和管理自己的变量
*/
typedef
EFI_STATUS
(EFIAPI *EFI_GET_VARIABLE)(
  IN     CHAR16                      *VariableName, //指向变量名称的指针,变量名称是一个以null字符结尾的Unicode字符串
  IN     EFI_GUID                    *VendorGuid, //指向供应商GUID的指针,这个GUID用于标识变量的供应商
  OUT    UINT32                      *Attributes     OPTIONAL, //输出参数,指向变量属性的指针,如果设置非空。函数将返回变量的属性。
  IN OUT UINTN                       *DataSize, //输入,输出参数,指向变量数据大小的指针,用于指定输入的期望数据大小或输出的实际数据大小
  OUT    VOID                        *Data           OPTIONAL //输出参数,指向变量数据的指针,如果设置非空,将返回变量的数据
  );

 SetVariable接口的作用是设置变量的值,这个接口可用于创建新的变量或修改现有变量的值,函数原型为

/*
    设置变量的值
*/
typedef
EFI_STATUS
(EFIAPI *EFI_SET_VARIABLE)(
  IN  CHAR16                       *VariableName, //输入参数,指向变量名称的指针
  IN  EFI_GUID                     *VendorGuid, //输入参数,变量供应商的GUID
  IN  UINT32                       Attributes, //输入参数,变量的属性
  IN  UINTN                        DataSize, //输入参数,期望输入数据的大小,即数据缓冲区的大小(字节数)
  IN  VOID                         *Data //输入参数,变量的值
  );

其中变量的属性有三种

/// Attributes of variable.
///
#define EFI_VARIABLE_NON_VOLATILE        0x00000001  //非易失性,设置变量后,变量在系统重启后仍保持其值。
#define EFI_VARIABLE_BOOTSERVICE_ACCESS  0x00000002 //启动服务访问,变量可以在UEFI引导服务启动时被访问
#define EFI_VARIABLE_RUNTIME_ACCESS      0x00000004 //运行时访问,变量可以在UEFI运行时服务启动时被访问

变量的属性可以通过 | 来组合 ,例如

UINT32 Attributes = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS;

将创建一个非易失性变量,在UEFI引导服务启动时访问。

GetNextVariableName接口的作用是枚举当前变量名,其函数原型为

typedef
EFI_STATUS
(EFIAPI *EFI_GET_NEXT_VARIABLE_NAME)(
  IN OUT UINTN                    *VariableNameSize, //输入、输出参数,变量名缓冲区的大小
  IN OUT CHAR16                   *VariableName, //输入,输出参数,变量名称
  IN OUT EFI_GUID                 *VendorGuid //输入,输出参数,变量供应商的GUID
  );

二、Variable的简单使用

编写源代码:

#include <uefi.h>
#include <Library/UefiLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/PcdLib.h>


//ShellCEntryLib call user interface ShellAppMain
EFI_STATUS
EFIAPI
MyHVariableAppEntry(
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
)
{
  EFI_STATUS                         Status = EFI_SUCCESS;
  UINTN                              DataSize;
  UINT64                             CSDNEnable = 1;
  EFI_GUID  gEfiCsdnEnableGuid = { 0xb71604d2, 0xb8ba, 0x4d9c, { 0x78, 0x88, 0xac, 0xcf, 0x1d, 0xa2, 0x26, 0xc3 }};

  DataSize = sizeof (CSDNEnable);
  Status = gRT->SetVariable (
                  L"CSDNEnable",
                  &gEfiCsdnEnableGuid,
                  EFI_VARIABLE_NON_VOLATILE |
                  EFI_VARIABLE_BOOTSERVICE_ACCESS |
                  EFI_VARIABLE_RUNTIME_ACCESS,
                  DataSize,
                  &CSDNEnable
                  );

  ASSERT(Status);
  DEBUG ((EFI_D_ERROR," [CSDN]: Setvariable CSDNEnable 0x%x.\n", CSDNEnable));

  CSDNEnable = 0;
  DataSize = sizeof (CSDNEnable);
  Status = gRT->GetVariable (
                L"CSDNEnable",
                &gEfiCsdnEnableGuid,
                NULL,
                &DataSize,
                &CSDNEnable
                );
  ASSERT(Status);

  if (CSDNEnable) {
    DEBUG ((EFI_D_ERROR, "[CSDN] CSDNEnable\n"));
  }

  return EFI_SUCCESS;
}

编写INF文件,运行并生成efi文件(在运行efi文件的时候卡住了,原因未知)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA工具----自动化API文档APIFOX

前言&#xff1a;想必大家在后端开发的过程过&#xff0c;最烦的就是写接口文档了。然而如果是对接前写&#xff0c;就更加烦躁&#xff0c;可能之前写好的接口文档全都要改&#xff0c;还会占用大量的时间&#xff0c;一般的小团队也耗不起这样的费时。那么使用Swagger和侵入式…

如何查询小红书、抖音等多平台品牌声量数据?

现在很多企业都需要掌握小红书、抖音、公众号、微博等各个社媒平台上&#xff0c;企业品牌声量趋势情况&#xff0c;行业内容占有率如何&#xff0c;搜索指数高低等等&#xff0c;借此来判断企业的品牌影响力、行业地位以及最近的活动/事件等营销效果。那么跨平台查询是比较麻烦…

一篇清楚的明白什么是场外个股期权?

今天带你了解一篇清楚的明白什么是场外个股期权&#xff1f;场外个股期权是一种非标准化的期权合约&#xff0c;在金融机构和投资者之间定制进行。它具有更大的灵活性&#xff0c;但也伴随着较高的信用风险和复杂性。适用于对冲风险、增强收益和设计结构性产品等多种策略。 场…

提取音频转mp3的工具哪个好?这六个新手必备

各位音乐爱好者们&#xff01;是不是有时候你会听到一首歌&#xff0c;觉得它的中间伴奏简直太棒了&#xff0c;想要把它单独提取出来&#xff0c;却发现无从下手呢&#xff1f; 别担心&#xff0c;现在有了提取音频在线工具&#xff0c;这些难题都能迎刃而解。下面&#xff0…

Jmeter_循环获取请求接口的字段,并写入文件

通过JSON提取器、计数器、beanshell&#xff0c;循环读取邮箱接口的返回字段&#xff0c;筛选出flag为3的收件人&#xff0c;并写入csv文件。 1、调用接口&#xff0c;获取所有的邮件$.data.total.count&#xff1b; 2、beanshell后置处理total转换成页码&#xff0c;这里是227…

STM32 HAL freertos零基础(二)-通过STM32CubeMX配置Freertos后在程序中进行任务创建,便于任务管理与识别。

1、简介 通过STM32CubeMX配置Freertos后&#xff0c;建立的任务都在freertos.c文件中&#xff0c;不易于观察&#xff0c;并且每次生成新任务还需要打开STM32CubeMX&#xff0c;本次教程讲解一种通过STM32CubeMX配置Freertos后在程序中进行任务创建&#xff0c;起到类似添加传…

官宣:28家重点实验室,获5750万元资金支持!

【欧亚科睿学术】 点击关注&#xff1a;关注GZH【欧亚科睿学术】&#xff0c;第一时间了解科研最新动态&#xff01; 根据省级财政专项资金管理办法有关规定&#xff0c;拟安排2024年省重点实验室28项&#xff0c;拟安排省财政资金5750万元。现予以公示&#xff1a; 本文来源…

企业如何治理“两高一弱”?

攻防演练已经落幕&#xff0c;“两高一弱”专项整治依旧如火如荼。针对高危端口、高危漏洞和弱口令这三大网络环境中最常见的关键安全挑战&#xff0c;公安机关及各行业主管部门高度重视&#xff0c;要求各级组织及时发现并消除网络和信息系统“两高一弱”问题&#xff0c;实现…

照片删除了怎么恢复回来?要学会这些数据恢复方法

在数字化时代&#xff0c;照片已经成为我们记录生活、珍藏回忆的重要载体。然而&#xff0c;有时由于误操作或其他原因&#xff0c;我们可能会不小心删除了重要的照片。面对这种情况&#xff0c;很多人会感到焦虑和无助。幸运的是&#xff0c;有多种方法可以帮助我们恢复删除的…

一次性了解Neo4j图形数据库

Neo4j高性能的NoSQL图形数据库 它将结构化数据存储在网络&#xff08;从数学角度叫做图&#xff09;上而不是传统的表格中。 Neo4j是一个嵌入式的、基于磁盘的、具备完全事务特性的Java持久化引擎。 但它在数据表示上采用了图形模型&#xff0c;即数据以节点&#xff08;Nod…

Facebook与区块链的结合:推动社交平台的去中心化

随着区块链技术的崛起&#xff0c;全球各大科技公司纷纷探索其应用潜力。Facebook作为全球领先的社交媒体平台&#xff0c;也在区块链领域中迈出了关键一步&#xff0c;试图通过去中心化技术来提升用户体验并应对传统社交平台所面临的挑战。本文将探讨Facebook与区块链结合的潜…

vue elementUI更改Checkbox 多选框禁用状态下文本颜色

最近在做vue项目中&#xff0c;根据需求要改变CheckBox禁用状态下的文本颜色&#xff0c;原因是默认的文本颜色太浅&#xff0c;要自定义颜色 找了半天终于解决问题 记录一下 话不多说&#xff0c;上代码 希望能够帮到你~ 点赞加关注&#xff0c;下次再找不迷路~~~~

儿童自闭症康复:找到孩子的微小进步,看见希望

星贝育园的康复之旅 在自闭症儿童康复的漫长道路上&#xff0c;每一个微小的进步都是家长心中的巨大希望之光。星贝育园&#xff0c;作为全国领先的自闭症康复机构&#xff0c;以其独特的教育理念、专业的师资团队和显著的康复效果&#xff0c;为无数家庭带来了希望和改变。 …

ICC2:对指定信号线设置ndr rule

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接:

从程序员到外卖员,再到AI绘画大佬:我的逆袭之路

一、行业之卷&#xff0c;失业之痛 大家好&#xff0c;我是一名初代程序员。曾几何时&#xff0c;我也在互联网行业的光环下&#xff0c;享受着高薪和尊敬。然而&#xff0c;随着行业竞争加剧&#xff0c;就业环境变得越来越差&#xff0c;我最终没能逃脱被大厂裁员的命运。 …

[STM32]从零开始的STM32串口使用教程(小白向)

一、我们为什么需要串口&#xff1f; 在嵌入式通信中&#xff0c;我们常常把像SPI&#xff0c;USART&#xff0c;I2C这些 串行通信接口&#xff0c;统称为串口。但是在我们的日常使用中&#xff0c;我们说的串口通常是指的USART接口。下面我们就来了解USART接口&#xff0c;USA…

在 RT-Thread 上使用单色屏 UI 库 - U8G2

U8g2 是一个用于嵌入式设备的单色图形库。U8g2支持单色OLED和LCD&#xff0c;并支持如SSD1306等多种类型的OLED驱动。 U8g2的官方开源地址为&#xff1a;https://github.com/olikraus/u8g2 由于官方已经对 RT-Thread 做了一定的适配&#xff0c;并且存在于 RT-Thread 的软件包…

用Python实现时间序列模型实战——Day 15: 时间序列模型的选择与组合

一、学习内容 1. 模型选择的标准与方法&#xff08;如 AIC、BIC&#xff09; 在时间序列建模中&#xff0c;模型的选择是非常重要的&#xff0c;常用的模型选择标准包括 AIC (Akaike Information Criterion) 和 BIC (Bayesian Information Criterion)。 AIC (Akaike Informat…

U盘管控软件|禁止拷贝怎么解决?防止U盘拷贝的6款专业软件推荐

某公司员工将U盘插入公司电脑拷贝了重要的研发资料&#xff0c;随后该员工跳槽至竞争对手公司&#xff0c;导致公司商业机密外泄&#xff0c;造成了巨大的经济损失。 随着移动设备的普及&#xff0c;U盘的使用为工作带来了便利&#xff0c;但同时也增加了数据泄密的风险。这一案…

记一次knife4j文档请求异常 SyntaxError: Unexpected token ‘<‘, ... is not valid JSON

knife4j页面报错问题定位 前几天开发新接口&#xff0c;开发完成后想使用knife4j测试一下接口功能&#xff0c;突然发现访问页面报错提示&#xff1a;knife4j文档请求异常&#xff0c;但之前运行还是正常的&#xff0c;想想会不会与升级依赖有关系&#xff0c;启动其他微服务发…