我的计算机目前有两个适用于 Windows 的 EFI bootNNNN 条目:
Boot0004 Windows Boot Manager HD(1,GPT,[redacted],0x800,0x1ff800)/File(\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI)57494e444f5753000100000088000000780000004200430044004f0042004a004500430054003d007b00390064006500610038003600320063002d0035006300640064002d0034006500370030002d0061006300630031002d006600330032006200330034003400640034003700390035007d00000000120100000010000000040000007fff0400
Boot0009 Windows Boot Manager HD(1,GPT,[redacted],0x800,0x1ff800)/File(\EFI\MICROSOFT\BOOT\BOOTMGFW.EFI)0000424f
如您所见,除了“可选数据”有效负载(每个路径后的十六进制字符串)外,它们是相同的。我正在对启动过程进行故障排除,并希望了解每个有效负载的含义。EFI 规范仅表示这些数据逐字传递给正在启动的程序(在本例中为 BOOTMGFW.EFI),因此我推测如果有任何地方记录了这一点,它将在低级 Windows 文档中。我尝试查看 MSDN,但只找到了有关如何配置引导加载程序的说明,没有关于如何将其映射到它写入 EFI 变量的内容的信息。
较长的有效载荷中嵌入了一个 ASCII 和一个 UTF-16 字符串。以下是部分解码的版本:
WINDOWS\0
01 00 00 00
88 00 00 00
78 00 00 00
BCDOBJECT={9dea862c-5cdd-4e70-acc1-f32b344d4795}
00 00 00 12
01 00 00 00
10 00 00 00
04 00 00 00
7f ff 04 00
最后四个字节7f ff 04 00
是 EFI“结束整个设备路径”标记,但 BCDOBJECT= 字符串和该标记之间的字节序列似乎不是 EFI 设备路径。(该序列的前两个字节可能实际上属于 BCDOBJECT= 字符串,是 U+0000 字符串终止符,但 00 00 和 00 12 都不能作为有效 EFI 设备路径的开头。)
BCDOBJECT= 字符串中的 GUID 是不是主 Windows 分区(即存储的分区)的 GUID C:\WINDOWS
。
较短的“可选数据”有效负载包含两个 ASCII 字符,按顺序为“BO”,前面是我推测的两个字节的 NUL 填充。
答案1
较大的结构是一个BL_WINDOWS_LOAD_OPTIONS
结构:[1]
WINDOWS\0 # Signature
01 00 00 00 # Version
88 00 00 00 # Structure size
78 00 00 00 # Offset to BL_FILE_PATH_DESCRIPTOR structure
BCDOBJECT={9dea862c-5cdd-4e70-acc1-f32b344d4795} # Command line
00 00 # Null terminator
00 12 # Unknown, probably padding
# BL_FILE_PATH_DESCRIPTOR structure
01 00 00 00 # Version
10 00 00 00 # BL_FILE_PATH_DESCRIPTOR structure size
04 00 00 00 # Path type (4=EFI path)
7f ff 04 00 # EFI path (END_DEVICE_PATH_TYPE/END_ENTIRE_DEVICE_PATH_SUBTYPE)
BCDOBJECT GUID 指的是 BCD 启动项,可以使用以下命令列出:bcdedit /enum /v
。