【问题标题】:startimage() failing with -1 after loadimage() in UEFI while loading efi application from other application从其他应用程序加载 efi 应用程序时,在 UEFI 中 loadimage() 后 startimage() 失败并显示 -1
【发布时间】:2017-11-01 00:03:54
【问题描述】:

我正在尝试使用 loadimage 和 startimage 协议从另一个 efi 应用程序加载一个 efi 应用程序。但是 loadimage 正在成功,startimage 失败,返回值 -1/0xffffffff。如果有人提出一些想法,为什么它会失败,那将是非常有帮助的。代码如有错误请指正。

EFI_STATUS LoadPythonBinary()
{
    EFI_STATUS Status;
    UINTN NumberOfFSHandles;
    EFI_HANDLE *FSHandles;
    EFI_GUID SimpleFileSystemGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
    UINTN  Index = 0;
    EFI_BLOCK_IO  *BlkIo;
    EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSysProtocol =  NULL;
    EFI_DEVICE_PATH_PROTOCOL        *FilePath;
    EFI_HANDLE                      ImageHandle2 = NULL;
//    EFI_DEVICE_PATH_PROTOCOL        *DevicePath;
//    EFI_HANDLE                      DeviceHandle;
    EFI_HANDLE          Controller=NULL;
    EFI_LOADED_IMAGE_PROTOCOL  *ImageInfo;
    EFI_GUID EfiDevicePathProtocolGuid = EFI_DEVICE_PATH_PROTOCOL_GUID;
    EFI_GUID EfiBlockIoProtocolGuid = EFI_BLOCK_IO_PROTOCOL_GUID;
    const CHAR16   *FileName = L"Python.efi";
    EFI_GUID EfiLoadedImageProtocol = EFI_LOADED_IMAGE_PROTOCOL_GUID;
//    EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
    char temp[MAX_PATH];
    CHAR16 CmdLineParams[MAX_PATH] = L"fs0:\\GK\\Temp\\UnzipBuildTools.py fs0:\\GK\\Temp\\EFI.zip fs0:\\Test";
    strcpy(temp,(const char *)StrDup16to8(CmdLineParams));

    Status = gBS->LocateHandleBuffer(ByProtocol, &SimpleFileSystemGuid,NULL, &NumberOfFSHandles, &FSHandles);
    if(!EFI_ERROR(Status))
    {
        for(Index = 0; Index < NumberOfFSHandles; Index++)
        {
            Status = gBS->HandleProtocol(FSHandles[Index], &SimpleFileSystemGuid, &BlkIo);
            if(!EFI_ERROR(Status))
            {
                    FilePath = FileDevicePath(FSHandles[Index],FileName);
                    Status = gBS->LoadImage(TRUE, gImageHandle, FilePath, NULL, 0, &ImageHandle2);
                    printf("Load Image Status = %x", Status);
                    if(!EFI_ERROR(Status))
                    {
                        printf("Image Loaded Successfully\n");
                        Status = gBS->HandleProtocol(ImageHandle2, &EfiLoadedImageProtocol,(VOID**)&ImageInfo);
                        if(!EFI_ERROR(Status))
                        {
                            if(ImageInfo->ImageCodeType == EfiLoaderCode) 
                            {
                                 gBS->FreePool(FilePath);
                            }
                            printf("Options :%s\n",temp);
                            printf("LoadedImage->ImageSize = %x", ImageInfo->ImageSize);
                            ImageInfo->LoadOptions = CmdLineParams;
                            ImageInfo->LoadOptionsSize = (UINT32)(wcslen(CmdLineParams));
                            ImageInfo->DeviceHandle = gImageHandle;
                        }
                    }

                    printf("About to start image\n");
                    Status = gBS->StartImage(ImageHandle2, NULL, NULL);
                    printf("StartImage Status = %x", Status);
                    if(!EFI_ERROR(Status))
                    {
                        printf("StartImage success\n");
                        break;
                    }
            }
        }
    }

return Status;
}

【问题讨论】:

    标签: python uefi loadimage


    【解决方案1】:

    可能的问题:可能您的目标图像 (Python.efi) 不是有效的 UEFI 应用程序,并且无法通过 EFI_BOOT_SERVICES.StartImage() 加载 界面。更多信息请参考 UEFI 引导服务可加载的有效 UEFI 镜像类型,查看UEFI Spec 2.7 中的会话 7.4。

    解决方案:确保在目标应用程序 .inf 文件中,MODULE_TYPE 字段配置了 UEFI_APPLICATION 其 .c 文件具有 UEFI 应用程序的入口点签名,类似于:

    EFI_STATUS
    EFIAPI
    MyEntryPointName (
        IN EFI_HANDLE        ImageHandle,
        IN EFI_SYSTEM_TABLE  *SystemTable
        )
    {
     ...
    }
    

    可以在LoadImageApp 中查阅功能代码示例。此应用程序加载并启动一个名为 HelloImageEntryPoint.efi 成功。

    【讨论】:

      【解决方案2】:

      -1 不是有效的 EFI_STATUS 如果您在 64 位系统上 EFI_STATUS 是 64 位。此外,如果您使用 Print() %r 将打印出 EFI_STATUS 的字符串。

      从 EFI 服务返回的 EFI_STATUS 值在 EFI Spec: 中定义 EFI_INVALID_PARAMETER - ImageHandle 是无效的图像句柄或图像已使用 StartImage 初始化

      EFI_SECURITY_VIOLATION - 当前平台策略指定不应启动映像。

      图像中的退出代码 - 图像中的退出代码。

      那么您加载的代码是否向您返回了错误?

      【讨论】:

      • 这感觉更像是评论而不是手头问题的答案。
      • 更新了答案,指出有效的 EFI_STATUS 将如何帮助调试问题。
      猜你喜欢
      • 2015-10-09
      • 2011-10-17
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2021-07-14
      • 1970-01-01
      相关资源
      最近更新 更多