首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UEFI LoadImage不支持类型

UEFI LoadImage不支持类型
EN

Stack Overflow用户
提问于 2015-07-13 18:33:06
回答 1查看 1.1K关注 0票数 1

我试图使用Bootservices.loadImage从内存中加载UEFI应用程序映像。内存中的缓冲区包含HellowWorld.efi应用程序的二进制内容。当我试图从内存中加载它时,我得到的是一个不受支持的文件类型。

然而,在运行UDK内核时,我发现当我开始处理文件头时,我没有正确地从缓冲区读取文件头。所有的神奇数字都没有排列起来,所以它把它看作是一种无法识别的文件格式。但是我一直无法追踪我指向源的指针在哪里被弄乱了。

我猜问题在UDK源代码中,所以这是我如何调用函数的问题。

代码:

代码语言:javascript
复制
    #define SIZEOF_HELLO_EFI 39679
    UINT8 hexData[SIZEOF_HELLO_EFI] =  {//CONTENTS OF helloworld.efi
  0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
 0xFF, 0xFF, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 
0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 
0x21, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 
0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 
0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20, 0x6D, 0x6F, 0x64, 0x65, 
0x2E, 0x0D, 0x0D, 0x0A, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 
0x45, 0x00, 0x00, 0x4C, 0x01, 0x07, 0x00, 0x24, 0x80, 0x00, 0x00, 0x00, 0x7E, 
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x06, 0x03, 0x0B, 0x01, 0x02, 
0x18, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0xB8, 0x84, 0x00, 
0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
    //CONTINUES FOR MANY MORE BYTES, BUT HERE IS THE HEADER INFO};
void copy_helloefi(UINT8* buff)
{
    int counter = 0;
    while(counter < SIZEOF_HELLO_EFI){
        buff[counter] = hexData[counter];
        counter++;
    }

}

EFI_STATUS
efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
        EFI_BOOT_SERVICES *BootServicesTable;
        UINT8* buff_ptr;
        EFI_STATUS status;
        MEMMAP_DEVICE_PATH mempath[2];
       EFI_HANDLE myLoadedImage = NULL;
        BootServicesTable = SystemTable->BootServices;
        BootServicesTable->AllocatePool(EfiLoaderCode, SIZEOF_HELLO_EFI, (void **)&buff_ptr);
        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);

        copy_helloefi(buff_ptr); //put the contents of helloworld.efi in buffer

        status = BootServicesTable->LoadImage(FALSE, ImageHandle, (EFI_DEVICE_PATH*)&mempath, &buff_ptr, SIZEOF_HELLO_EFI, &myLoadedImage);
        if (EFI_ERROR(status)) {
            Print((CHAR16*)L"Could not LoadImage %r %x \r\n", status, status);
        }
        Print((CHAR16*)L"Loaded Image Handle %x\r\n", myLoadedImage);

        //__debugbreak();
        BootServicesTable->FreePool(buff_ptr);
    return EFI_SUCCESS;
}

我做错了什么?HelloWorld.efi是PE/COFF,如果我直接调用它,它运行良好,因此我知道它是一个有效的efi二进制文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-15 20:22:31

解决它,正如预期的那样,它是一些小的和烦人的,但在这里张贴希望帮助别人。

修正是将buff_ptr作为一个空*而不是一个空**发送

因此,将对loadimage的调用更新为:

代码语言:javascript
复制
status = BootServicesTable->LoadImage(FALSE, ImageHandle, 
(EFI_DEVICE_PATH*)&mempath, buff_ptr, SIZEOF_HELLO_EFI, &myLoadedImage);

然后将其添加到实际运行加载的映像。

代码语言:javascript
复制
status = BootServicesTable->StartImage( myLoadedImage, (UINTN*)NULL, (CHAR16**)NULL);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31390855

复制
相关文章

相似问题

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