IPv6环境下EDK2应用调用LoadImage加载mtftp文件返回EFI_NOT_FOUND问题
问题场景
基于EDK2和C开发IPv6 PXE功能应用,通过EFI_LOAD_FILE_PROTOCOL下载Windows EFI启动加载器bootmgfw.efi,未直接调用mtftp()。Wireshark抓包确认镜像已完整下载,文件大小与缓冲区数据均正常,但调用LoadImage()时返回EFI_NOT_FOUND。
调用代码:
Status = bootServices->LoadImage(TRUE, ImageHandle, loadFilePath, NULL, 0, &loadedBootProgram);
其中loadFilePath由当前镜像路径自连接生成:
*dummyPath = devPathUtilities->AppendDevicePath(thisImageFilePath, thisImageFilePath);
该逻辑在IPv4环境下稳定运行,但IPv6环境失效。已知IPv6_DEVICE_PATH可能相关,但无法创建包含该类型的设备路径对象;也可通过MEMORY_DEVICE_PATH从缓冲区加载,但目标镜像需感知网络加载状态以完成后续下载,因此不考虑此方案。
已修改pxeProtocolInterface->Mode->ProxyOffer内容,并将pxeProtocolInterface->Mode->ProxyOfferReceived设为true(IPv4环境下StartImage成功的必要操作)。LoadImage()文档未提及IPv6相关内容,且目标镜像本身无损坏——作为PXE指定的首个镜像时可正常加载。
问题排查与解决步骤
1. 修正设备路径构造逻辑
IPv4环境下的设备路径包含IP4_DEVICE_PATH节点,但IPv6环境下需替换为IPv6_DEVICE_PATH节点。当前用AppendDevicePath自连接原有路径的方式,复用了IPv4的设备路径结构,导致UEFI无法识别IPv6环境下的有效路径。
解决方法:
基于当前IPv6网络适配器重新构造设备路径:
- 获取当前IPv6网络适配器的
EFI_DEVICE_PATH_PROTOCOL - 创建
IPv6_DEVICE_PATH节点,填入正确的IPv6地址、端口等信息 - 将
IPv6_DEVICE_PATH与文件路径节点拼接成完整加载路径
示例代码片段:
// 假设已获取IPv6网络设备的device path: NetDevicePath IPv6_DEVICE_PATH Ip6Node = { { MESSAGING_DEVICE_PATH, MSG_IP6_DP, sizeof(IPv6_DEVICE_PATH) }, // 填入目标服务器IPv6地址 {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}, 69, // TFTP默认端口 // 填入本地IPv6地址 {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}, 0, // 本地端口 64, // 前缀长度 128 // 跳数限制 }; FILE_PATH_DEVICE_PATH FileNode = { { MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, sizeof(FILE_PATH_DEVICE_PATH) }, L"bootmgfw.efi" }; // 拼接完整路径:网络设备路径 + IPv6节点 + 文件节点 EFI_DEVICE_PATH_PROTOCOL *NewLoadPath = AppendDevicePath(NetDevicePath, (EFI_DEVICE_PATH_PROTOCOL*)&Ip6Node); NewLoadPath = AppendDevicePath(NewLoadPath, (EFI_DEVICE_PATH_PROTOCOL*)&FileNode);
2. 完善PXE协议IPv6上下文初始化
仅修改ProxyOffer和ProxyOfferReceived不足以适配IPv6环境,需补充初始化以下字段:
- 将
pxeProtocolInterface->Mode->Ipv6Supported设为TRUE - 正确填充
pxeProtocolInterface->Mode->Ipv6ConfigData,包括IPv6地址、网关、DNS等信息 - 确认IPv6 DHCP相关字段(如
Dhcpv6AckReceived)已正确设置
3. 调整LoadImage参数的网络上下文
IPv6环境下LoadImage需明确绑定当前IPv6网络设备的上下文,而非复用原有镜像的IPv4绑定路径。将loadFilePath替换为当前IPv6网络适配器设备路径 + 正确文件路径节点,避免UEFI因路径绑定的IPv4上下文无法定位镜像。
4. 排查UEFI固件兼容性
部分UEFI固件对IPv6 PXE的支持存在兼容性差异,可尝试:
- 更新固件至最新版本
- 检查固件设置中是否开启IPv6 PXE支持
- 在不同品牌设备上测试,排除固件特定bug
内容的提问来源于stack exchange,提问作者BVintila

