如何通过UEFI Application 调用特定Protocol实现复杂功能?

摘要:如何在 UEFI 应用程序中调用 Protocol 前面我们介绍过 Protocol 的本质是一个包含一系列函数指针的 C 语言结构体。例如: typedef struct { EFI_TEXT_RESET Reset; EFI_TEXT_
如何在 UEFI 应用程序中调用 Protocol 前面我们介绍过 Protocol 的本质是一个包含一系列函数指针的 C 语言结构体。例如: typedef struct { EFI_TEXT_RESET Reset; EFI_TEXT_OUTPUT_STRING OutputString; EFI_TEXT_TEST_STRING TestString; EFI_TEXT_QUERY_MODE QueryMode; // ... 更多函数指针 EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode; // 这是一个数据指针,指向协议的状态信息 } EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL; 本文旨在说明 Protocol 中定义的函数在 UEFI 应用程序中该如何调用。 示例程序 我们以图形输出协议 GOP 为例,编写代码演示应用程序如何查找指定协议。 我们知道,Handle 表示某个对象的实例,Protocol 通常挂在对应的 Handle 上,表示这个 Handle 所具备的功能。比如硬盘这个 Handle,就需要有块读写的功能,对应 Block IO Protocol。 本示例代码的逻辑是,首先根据协议的 ProtocolGuid 查找支持这个协议的 Handle,注意可能有多个 Handle 支持这个协议。拿到句柄之后,需要获取具体的协议接口随后调用函数。 我们介绍本文会用到的 Boot Service 中的两个关键函数: LocateHandleBuffer/LocateHandle 这两个函数都用于在 UEFI 系统中查找句柄,区别在于内存管理方式。
阅读全文