UEFI BootOption Variable存储字节流

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

UEFI BootOption Variable存储字节流_第1张图片
图中的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所存储的格式以各自为准

UEFI BootOption Variable存储字节流_第2张图片

你可能感兴趣的:(UEFI-BIOS,学习)