Ошибка startimage() с -1 после loadimage() в UEFI при загрузке приложения efi из другого приложения
Я пытаюсь загрузить приложение efi из другого приложения efi, используя протоколы loadimage и startimage. но 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;
}
2 ответа
Возможная проблема: Возможно, ваше целевое изображение (Python.efi) не является допустимым приложением UEFI и не может быть загружено интерфейсом EFI_BOOT_SERVICES.StartImage(). Для получения дополнительной информации обратитесь к действительным типам образов UEFI, загружаемых службой загрузки UEFI, проверьте сеанс 7.4 в UEFI Spec 2.7.
Решение. Убедитесь, что в INF-файле целевого приложения поле MODULE_TYPE сконфигурировано с UEFI_APPLICATION, а его.c-файл имеет сигнатуру точки входа для приложения UEFI, аналогично:
EFI_STATUS
EFIAPI
MyEntryPointName (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
...
}
Пример функционального кода можно найти в LoadImageApp. Это приложение успешно загружает и запускает целевое приложение с именем HelloImageEntryPoint.efi.
-1 не является действительным EFI_STATUS, если вы работаете в 64-битной системе EFI_STATUS является 64-битной. Также, если вы используете Print(),%r выведет строку для EFI_STATUS.
Значения EFI_STATUS, возвращаемые службами EFI, определены в спецификации EFI: EFI_INVALID_PARAMETER - ImageHandle либо недопустимый дескриптор изображения, либо изображение уже инициализировано с помощью StartImage
EFI_SECURITY_VIOLATION - текущая политика платформы указывает, что изображение не должно запускаться.
Код выхода из изображения - код выхода из изображения.
Так что код, который вы загрузили, вернул вам ошибку?