首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UEFI LoadImage挂起

UEFI LoadImage挂起
EN

Stack Overflow用户
提问于 2015-07-09 12:30:06
回答 1查看 1.3K关注 0票数 0

我正在研究如何使用Bootservices函数LoadImage从内存中加载UEFI应用程序映像。功能参数是:

代码语言:javascript
复制
typedef
EFI_STATUS
LoadImage (
  IN BOOLEAN BootPolicy,
  IN EFI_HANDLE ParentImageHandle,
  IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
  IN VOID *SourceBuffer OPTIONAL,
  IN UINTN SourceSize,
  OUT EFI_HANDLE *ImageHandle
  );

我在内存中有资源缓冲区,并填充了要加载的PE/COFF映像。

我在SourceBuffer下传递它,并将DevicePath设置为:

代码语言:javascript
复制
MEMMAP_DEVICE_PATH mempath[2];
        mempath[0].Header.Type = HARDWARE_DEVICE_PATH;
    mempath[0].Header.SubType = HW_MEMMAP_DP;
    mempath[0].Header.Length[0] = (UINT8)sizeof(mempath);
    mempath[0].Header.Length[1] = (UINT8)(sizeof(mempath)>> 8);
    mempath[0].MemoryType = EfiLoaderCode;
    mempath[0].StartingAddress = (UINT32)buff_ptr;
    mempath[0].EndingAddress = (UINT32)(buff_ptr + BUFF_SIZE);

    mempath[1].Header.Type = END_DEVICE_PATH_TYPE;
    mempath[1].Header.SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
    mempath[1].Header.Length[0] = (UINT8)sizeof(EFI_DEVICE_PATH);
    mempath[1].Header.Length[1] = (UINT8)(sizeof(EFI_DEVICE_PATH)>> 8);

当我调用load映像时,应用程序挂起。我已经设置了visual,允许我调试UEFI EDK2源代码,并在我被困的地方进行隔离。下面是我似乎被困在其中的EDK2调用。DevicePath设置为我前面设置的mempath。我是否配置的路径不正确,以致于我永远不会退出下面的内容?

代码语言:javascript
复制
EFI_STATUS
EFIAPI
CoreLocateDevicePath (
  IN EFI_GUID                       *Protocol,
  IN OUT EFI_DEVICE_PATH_PROTOCOL   **DevicePath,
  OUT EFI_HANDLE                    *Device
  )
{
......
      EFI_DEVICE_PATH_PROTOCOL    *SourcePath;
  SourcePath = *DevicePath;
  TmpDevicePath = SourcePath;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//I NEVER GET OUT OF THIS LOOP!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  while (!IsDevicePathEnd (TmpDevicePath)) {
    if (IsDevicePathEndInstance (TmpDevicePath)) {
      break;
    }
    TmpDevicePath = NextDevicePathNode (TmpDevicePath);
  }

关于更多的上下文,这是我陷入困境的UDK调用堆栈

代码语言:javascript
复制
DxeCore.dll!CoreLocateDevicePath(GUID * Protocol, EFI_DEVICE_PATH_PROTOCOL * * DevicePath, void * * Device) Line 452    C
DxeCore.dll!CoreLoadImageCommon(unsigned char BootPolicy, void * ParentImageHandle, EFI_DEVICE_PATH_PROTOCOL * FilePath, void * SourceBuffer, unsigned int SourceSize, unsigned __int64 DstBuffer, unsigned int * NumberOfPages, void * * ImageHandle, unsigned __int64 * EntryPoint, unsigned int Attribute) Line 1089 C
DxeCore.dll!CoreLoadImage(unsigned char BootPolicy, void * ParentImageHandle, EFI_DEVICE_PATH_PROTOCOL * FilePath, void * SourceBuffer, unsigned int SourceSize, void * * ImageHandle) Line 1425    C
MyApplication.dll!efi_main(void * ImageHandle, EFI_SYSTEM_TABLE * SystemTable) Line 2588    C
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-10 20:17:32

找到了我的答案,在此与其他人分享:

我基于grub源:http://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/loader/arm64/linux.c?id=7a210304ebfd6d704b4fc08fe496a0c417441879#n249的原始mempath

我将结束点的类型更改为实例,即标题的大小字段。我现在正确地退出了循环。我原来的头有整个结构的大小,所以我相信当试图迭代到下一个端点时,它是用一个无效的端点结束的,而不是转到正确的第二个元素。以下是我所用的:

代码语言:javascript
复制
mempath[0].Header.Type = HARDWARE_DEVICE_PATH;
mempath[0].Header.SubType = HW_MEMMAP_DP;
mempath[0].Header.Length[0] = (UINT8)sizeof(MEMMAP_DEVICE_PATH);
mempath[0].Header.Length[1] = (UINT8)(sizeof(MEMMAP_DEVICE_PATH)>> 8);
mempath[0].MemoryType = EfiLoaderCode;
mempath[0].StartingAddress = (UINT32)buff_ptr;
mempath[0].EndingAddress = (UINT32)(buff_ptr + SIZEOF_HELLO_EFI);

mempath[1].Header.Type = END_DEVICE_PATH_TYPE;
mempath[1].Header.SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;
mempath[1].Header.Length[0] = (UINT8)sizeof(EFI_DEVICE_PATH);
mempath[1].Header.Length[1] = (UINT8)(sizeof(EFI_DEVICE_PATH)>> 8);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31317566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档