Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从其他应用程序加载efi应用程序时,在UEFI中的loadimage()之后使用-1开始计时年龄()失败_Python_Uefi_Loadimage - Fatal编程技术网

Python 从其他应用程序加载efi应用程序时,在UEFI中的loadimage()之后使用-1开始计时年龄()失败

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;

我正在尝试使用loadimage和startimage协议从另一个efi应用程序加载efi应用程序。但是loadimage获得成功,startimage失败,返回值为-1/0xFFFFFF。如果有人提出一些想法,说明失败的原因,这将非常有帮助。如果代码中有错误,请改正

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_状态如何帮助调试问题。