- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 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/
我用的是 gnu-efi。 我不明白如何简单地读取文件。 我了解使用 BlockIOProtocol。 您能用一个简单的例子告诉我们吗? 最佳答案 我手头没有简单的例子,抱歉。但通常你会这样进行 在
目前,我在传统 (MBR) 模式下有以下引导链: GRUB2 -> Linux -> kexec to Grub4Dos -> Windows. 我想弄清楚这是否也可以在 UEFI 模式下实现,即从
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
问题#1:你好,所以我搞砸了我的 Windows(同时删除了 ubuntu 的双启动)并且它无法启动,所以我不得不使用闪存驱动器安装,在安装过程中我删除了 EFI 分区并且可用空间仍然存在在那里,但
EFI是一个小型化的Windows系统,今天教大家efi bios u盘启动设置方法,有些朋友想要为efi bios设置u盘启动但却不知道该怎么操作,相信大家看了下面这篇文章就会有一定的了解,希望对
安装Ubuntu18过程中,从u盘启动ubuntu安装,出现mmx64.efi not found问题 如下图: 制作好ubuntu启动盘之后在EFI/BOOT下会看到两个文
怎么解决 boot/efi 没有分配空间的问题呢。某些机器上,特别是有双硬盘的电脑,在装 Linux 双系统时,经常会提示 boot/efi 没有分配空间。有时候,明明已经分配了,还会提示没有分配,
规范的哪一部分详细说明了如何获取命令行参数? 最佳答案 你需要小心这个。 您可能知道,有一个 UEFI LoadedImage 协议(protocol) - 该协议(protocol)返回一个名为 E
我正在研究这个项目,以便在操作系统通过 EFI 应用程序启动后立即将文件写入本地文件系统。我需要知道这是否可能。如果是的话,请指导我一点。 谢谢 最佳答案 好的,我会好好提醒你... 首先,您枚举系统
我有在操作系统旁边运行一个小服务的想法,但我不确定这是否可能。我试图通过阅读一些文档来弄清楚,但没有走远,所以我的问题来了。 我阅读了有关 UEFI 运行时服务的信息。 是否有可能在固件中有一个小模块
我需要创建一个驱动程序,其行为类似于软件 RAID。例如。驱动程序将需要与多个物理磁盘(甚至可能是网络资源)进行通信,并且对于操作系统来说应该看起来像一个磁盘。 所以两个主要问题是: 1) EFI 驱
我是创建 efi 应用程序的 super 新手。我的目标是在 efi 中创建一个小应用程序,在背景上显示一些文本。但是我坚持尝试在显示器上显示文本(最好是有一个自定义字体,但在这个阶段没有必要)。我希
我有一台带有 GPT 驱动器的 Windows 机器。 我有一个 EFI 系统分区的 DOS 设备名称作为 bcdedit 的输出。 我想打开这个分区的句柄并通过 QueryDosDevice() 获
我想尝试为 EFI 编程,所以我使用 virtualbox 创建了一个 VM,选中“启用 efi”选项并将 CD 留空。 efi shell 应该如何引导,但我只看到 BLK0、BLK1 等,而不是
安装Ubuntu后,EFI系统分区的/efi/UBUNTU/里面有几个*.efi文件: GRUBX64.EFI MOKMANAG.EFI SHIMX64.EFI mmx64.efi fwupx64.e
是否可以在 BDS 阶段之前自动加载和执行 EFI 应用程序,就在加载所有 DXE 驱动程序之后? 如果我在 DXE 驱动程序之后将应用程序包含在 .fdf 文件中,它会自动加载和执行吗? 最佳答案
通过关注此 tutorial ,我能够创建一个简单的 efi 应用程序,当 时打印 hello world |从 uefi shell 执行 .但是,我想知道如何创建可启动的 EFI 镜像。我尝试在
我正在使用 FindFirstVolume/FindNextVolume 获取机器上所有卷的列表。这很好用,但奇怪的是 EFI 系统分区由于某种原因被跳过了。另一方面,Diskpart 返回 EFI
我想使用 Print 函数调用将一些文本打印到屏幕上。有没有什么方法(或任何其他函数)来设置文本的颜色? 最佳答案 这将设置您的打印颜色: uefi_call_wrapper(SystemTable-
目前我正在使用 efi API 进行编程。 如何在 efi 编程中使用?我想知道如何在efi中编写argv和argc。 到目前为止编写的c代码: #include int main(int argc
我是一名优秀的程序员,十分优秀!