Python 从其他应用程序加载efi应用程序时,在UEFI中的loadimage()之后使用-1开始计时年龄()失败
我正在尝试使用loadimage和startimage协议从另一个efi应用程序加载efi应用程序。但是loadimage获得成功,startimage失败,返回值为-1/0xFFFFFF。如果有人提出一些想法,说明失败的原因,这将非常有帮助。如果代码中有错误,请改正Python 从其他应用程序加载efi应用程序时,在UEFI中的loadimage()之后使用-1开始计时年龄()失败,python,uefi,loadimage,Python,Uefi,Loadimage,我正在尝试使用loadimage和startimage协议从另一个efi应用程序加载efi应用程序。但是loadimage获得成功,startimage失败,返回值为-1/0xFFFFFF。如果有人提出一些想法,说明失败的原因,这将非常有帮助。如果代码中有错误,请改正 EFI_STATUS LoadPythonBinary() { EFI_STATUS Status; UINTN NumberOfFSHandles; EFI_HANDLE *FSHandles;
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;
}
EFI_状态加载pythonbinary()
{
EFI_状态;
UINTN个FSHandles;
EFI_句柄*FSHandles;
EFI\u GUID SimpleFileSystemGuid=EFI\u SIMPLE\u文件\u系统\u协议\u GUID;
UINTN指数=0;
EFI_BLOCK_IO*BlkIo;
EFI\u SIMPLE\u FILE\u SYSTEM\u PROTOCOL*FileSysProtocol=NULL;
EFI_设备_路径_协议*文件路径;
EFI_HANDLE ImageHandle2=NULL;
//EFI_设备_路径_协议*设备路径;
//电喷手柄装置手柄;
EFI_句柄控制器=空;
EFI_加载的_IMAGE_协议*ImageInfo;
EFI_GUID EFI设备路径协议GUID=EFI_设备路径协议GUID;
EFI_GUID EfiBlockIoProtocolGuid=EFI_块IO_协议\u GUID;
const CHAR16*FileName=L“Python.efi”;
EFI\U GUID EFI\U加载的图像协议=EFI\U加载的图像协议\U GUID;
//EFI_加载的_图像_协议*加载图像;
字符温度[最大路径];
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(按协议,&SimpleFileSystemGuid,NULL,&NumberOfFSHandles,&FSHandles);
如果(!EFI_错误(状态))
{
对于(索引=0;索引HandleProtocol(FSHandles[Index],&SimpleFileSystemGuid,&BlkIo);
如果(!EFI_错误(状态))
{
FilePath=FileDevicePath(FSHandles[Index],FileName);
Status=gBS->LoadImage(TRUE、gImageHandle、FilePath、NULL、0和ImageHandle2);
printf(“加载图像状态=%x”,状态);
如果(!EFI_错误(状态))
{
printf(“图像加载成功\n”);
状态=gBS->HandleProtocol(ImageHandle2和EFILoadeImageProtocol,(VOID**)和ImageInfo);
如果(!EFI_错误(状态))
{
如果(ImageInfo->ImageCodeType==EfiLoaderCode)
{
gBS->FreePool(文件路径);
}
printf(“选项:%s\n”,临时);
printf(“加载图像->图像大小=%x”,图像信息->图像大小);
ImageInfo->LoadOptions=CmdLineParams;
ImageInfo->loadoptionsize=(UINT32)(wcslen(CmdLineParams));
ImageInfo->DeviceHandle=gImageHandle;
}
}
printf(“即将启动图像\n”);
Status=gBS->StartImage(ImageHandle2,NULL,NULL);
printf(“开始日期状态=%x”,状态);
如果(!EFI_错误(状态))
{
printf(“StartImage成功”\n);
打破
}
}
}
}
返回状态;
}
-1不是有效的EFI\U状态,如果您在64位系统上,EFI\U状态为64位。此外,如果使用Print(),则%r将打印出EFI_状态的字符串
从EFI服务返回的EFI_状态值在中定义
EFI_INVALID_参数-ImageHandle是无效的图像句柄,或者图像已使用StartImage初始化
EFI_安全性_冲突-当前平台策略指定不应启动映像
从图像中退出代码-从图像中退出代码
那么您加载的代码是否返回了错误?可能的问题:您的目标映像(Python.efi)可能不是有效的UEFI应用程序,无法通过efi\u BOOT\u SERVICES.StartImage()接口加载。有关更多信息,请参阅UEFI引导服务可加载的UEFI映像的有效类型,请查看中的会话7.4
解决方案:确保在目标应用程序.inf文件中,模块类型字段配置有UEFI_应用程序,其.c文件具有UEFI应用程序的入口点签名,类似于:
EFI_STATUS
EFIAPI
MyEntryPointName (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
...
}
可以在中查阅功能代码示例。此应用程序加载并启动名为的目标应用程序
HelloImageEntryPoint.efi成功。这感觉更像是一个评论,而不是对手边问题的回答。更新了答案,指出有效的efi_状态如何帮助调试问题。