gpt4 book ai didi

python - 从其他应用程序加载 efi 应用程序时,在 UEFI 中的 loadimage() 之后 startimage() 失败并显示 -1

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:47 25 4
gpt4 key购买 nike

我正在尝试使用 loadimage 和 startimage 协议(protocol)从另一个 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.efi) 可能不是有效的 UEFI 应用程序,无法通过 EFI_BOOT_SERVICES.StartImage() 加载 界面。有关更多信息,请参阅 UEFI 启动服务可加载的 UEFI 镜像的有效类型,请查看 UEFI Spec 2.7 中的 session 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 成功。

关于python - 从其他应用程序加载 efi 应用程序时,在 UEFI 中的 loadimage() 之后 startimage() 失败并显示 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38783286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com