UEFI BootOption Variable存储字节流

news/2024/9/23 3:15:59/

uefi shell 使用dmpstore命令可以看到所存储的所有Variable变量数据。这里随便举2个例子

在这里插入图片描述
图中的Boot0000就是存储启动项Boot0000的属性变量名称,启动路径的数据。

//
// Common structure definition for DriverOption and BootOption
//
typedef struct {
//
// Data read from UEFI NV variables
//
UINTN OptionNumber; // #### numerical value, could be LoadOptionNumberUnassigned
EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType; // LoadOptionTypeBoot or LoadOptionTypeDriver
UINT32 Attributes; // Load Option Attributes
CHAR16 *Description; // Load Option Description
EFI_DEVICE_PATH_PROTOCOL *FilePath; // Load Option Device Path
UINT8 *OptionalData; // Load Option optional data to pass into image
UINT32 OptionalDataSize; // Load Option size of OptionalData
EFI_GUID VendorGuid;

//
// Used at runtime
//
EFI_STATUS Status; // Status returned from boot attempt gBS->StartImage ()
CHAR16 *ExitData; // Exit data returned from gBS->StartImage ()
UINTN ExitDataSize; // Size of ExitData
} EFI_BOOT_MANAGER_LOAD_OPTION;

这个是BootOption结构体,但是实际上的存储并不是按照这个格式存储的。

平常我们是通过这个函数来EfiBootManagerVariableToLoadOptionEx------>GetVariable2之后,再把数据整合成EFI_BOOT_MANAGER_LOAD_OPTION结构体

EFI_STATUS
EFIAPI
EfiBootManagerVariableToLoadOptionEx (
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
IN OUT EFI_BOOT_MANAGER_LOAD_OPTION *Option
)
具体实现如下:

//
// Get the option attribute
//
VariablePtr = Variable;
Attribute = ReadUnaligned32 ((UINT32 *) VariablePtr);
VariablePtr += sizeof (UINT32);

//
// Get the option’s device path size
//
FilePathSize = ReadUnaligned16 ((UINT16 *) VariablePtr);
VariablePtr += sizeof (UINT16);
//
// Get the option’s description string
//
Description = (CHAR16 *) VariablePtr;

//
// Get the option’s description string size
//
VariablePtr += StrSize ((CHAR16 *) VariablePtr);
//
// Get the option’s device path
//
FilePath = (EFI_DEVICE_PATH_PROTOCOL *) VariablePtr;
VariablePtr += FilePathSize;

可以知道Attribute占4个字节,路径长度FilePathSize 2个字节。然后是设备描述,是Unicode字串串,以0x0,0x0结尾,然后跟着的就是FilePath.

可以看到Boot0000,Attribute 0x108, 是unactive的,FilePathSize 0x2c,描述就是,**** Setupo Utility。然后后面跟着路径。

不同的Variable所存储的格式以各自为准

在这里插入图片描述


http://www.ppmy.cn/news/38654.html

相关文章

vue尚品汇商城项目-day07【51.路由懒加载】

文章目录51.路由懒加载本人其他相关文章链接51.路由懒加载 官网介绍: 理解 (1) 当打包构建应用时,JS包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件&…

前端必备技术之——AJAX

简介 AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML(现在已经基本被json取代)。通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX 不是新的编程语言,而是一种将现有的标准组…

图解Redis,Redis主从复制与Redis哨兵机制

目录专栏导读一、Redis复制是什么?二、Redis复制能干嘛?三、Redis复制的缺点1、复制延迟2、master宕机四、乐观复制策略五、Redis复制常用命令1、info replication2、replicaof 主库Ip 主库port3、slaveof 主库IP 主库port4、slaveof no one六、Redis复制…

哪些产品需要做3C认证

​可做3C的产品目录: 1、电线电缆 2、高低压成套电气设备、元器件及其附件 3、电动机、电动工具、电焊机 4、家用电器及其配件 5、、数码 6、电脑、办公 7、机械、商用机械 8、电器附件 9、照明电器及其配件 10、汽车、摩托车、其他交通设备及其零部件 1…

IOC、AOP以及spring框架的面试汇总

一、控制反转(IOC) 将创建管理对象的工作交给容器来做。在容器初始化(或在某个时间节点)通过反射机制创建好对象,在使用时直接从容器中获取。 控制反转:将对象的控制权反过来交给容器管理。 官方解释 控…

基于网络安全的 Docker 逃逸

如何判断当前机器是否为 Docker 容器环境 Metasploit 中的 checkcontainer 模块、(判断是否为虚拟机,checkvm 模块) 搭配学习教程 1. 检查根目录下是否存在.dockerenv 文件 2. 检查/proc/1/cgroup 是否存在还有 docker 字符串 cat /proc/1…

图片怎么格式转换成jpg?介绍几种思路

在现代数字世界中,图片格式转换是一项非常重要的技能。不同的图片格式适合不同的用途,例如PNG格式适合用于图像透明处理,而JPG格式则适合用于图像压缩和共享。本文将介绍如何将不同格式的图片转换为JPG,以及一些转换软件来实现这一…

域名批量查询功能常用查询方法教程

一些用户在抱怨,要找到好域名怎么就那么不容易呢,能不能让我批量查下不含0的数字啊,能不能查下不含4的数字啊,能不能查下AABBB这样的域名啊…… 别着急,这就给您支招啦:通过西部数码强大的批量查询功能&am…