如何在UEFI_APPLICATION中使用Universal目录下的PartitionDxe驱动
调用PartitionDxe功能的配置与实现步骤
一、INF/DSC文件修改
1. INF文件配置
- 在你的UEFI应用INF文件的
[Packages]段中添加PartitionDxe所属的包依赖:[Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec - 在
[LibraryClasses]段中确保包含必要的库,用于调用UEFI Boot Services:[LibraryClasses] UefiBootServicesTableLib UefiApplicationEntryPoint
2. DSC文件配置
- 在
[Packages]段确认包含MdeModulePkg(PartitionDxe的所在包):[Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec # 其他你的应用依赖的包 - 在
[Components]段添加PartitionDxe和你的应用,确保两者都被编译链接:[Components] MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf YourAppPkg/Path/To/YourApp.inf
二、代码中调用PartitionDxe功能
由于PartitionDxe未公开相关GUID和Protocol定义,需要从其源码中提取关键信息:
1. 定义Protocol的GUID与结构体
直接从PartitionDxe的源码(如PartitionDxe.c)中找到它注册的Protocol GUID和对应的接口结构体,复制到你的应用代码中:
// 从PartitionDxe源码提取的自定义Protocol GUID #define EFI_PARTITION_CUSTOM_PROTOCOL_GUID \ { 0xXXXXXXX, 0xXXXX, 0xXXXX, { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX } } EFI_GUID gEfiPartitionCustomProtocolGuid = EFI_PARTITION_CUSTOM_PROTOCOL_GUID; // 对应Protocol的函数接口结构体,与PartitionDxe中定义一致 typedef struct { EFI_STATUS (*PartitionFunction1)(IN VOID *Context, IN UINTN Param1); EFI_STATUS (*PartitionFunction2)(IN VOID *Context, IN UINT8 *Buffer, IN UINTN BufferSize); // 其他PartitionDxe提供的函数指针 } EFI_PARTITION_CUSTOM_PROTOCOL;
2. 定位并调用Protocol
根据PartitionDxe注册Protocol的方式,选择对应的定位方法:
情况1:全局注册的Protocol
使用LocateProtocol直接查找:
EFI_STATUS Status; EFI_PARTITION_CUSTOM_PROTOCOL *PartitionProtocol; Status = gBS->LocateProtocol( &gEfiPartitionCustomProtocolGuid, NULL, (VOID **)&PartitionProtocol ); if (EFI_ERROR(Status)) { return Status; // 处理Protocol未找到的错误 } // 调用目标功能 Status = PartitionProtocol->PartitionFunction1(SomeContext, SomeParam);
情况2:绑定到磁盘Handle的Protocol
先枚举磁盘Handle,再逐个查找Protocol:
EFI_HANDLE *HandleBuffer; UINTN HandleCount; EFI_PARTITION_CUSTOM_PROTOCOL *PartitionProtocol; EFI_STATUS Status; // 枚举所有支持磁盘IO的Handle Status = gBS->LocateHandleBuffer( ByProtocol, &gEfiDiskIoProtocolGuid, NULL, &HandleCount, &HandleBuffer ); if (EFI_ERROR(Status)) { return Status; } // 遍历Handle查找目标Protocol for (UINTN i = 0; i < HandleCount; i++) { Status = gBS->HandleProtocol( HandleBuffer[i], &gEfiPartitionCustomProtocolGuid, (VOID **)&PartitionProtocol ); if (!EFI_ERROR(Status)) { // 调用功能 PartitionProtocol->PartitionFunction2(SomeContext, Buffer, BufferSize); break; } } // 释放内存 gBS->FreePool(HandleBuffer);
三、注意事项
- 确保PartitionDxe已被加载初始化:如果系统中未自动加载,可在代码中调用
ConnectController加载对应的磁盘控制器驱动,间接触发PartitionDxe的加载。 - 源码提取信息要准确:GUID和结构体定义必须与PartitionDxe中的完全一致,否则会出现调用崩溃或功能异常。
内容的提问来源于stack exchange,提问作者roat
相关产品推荐
相关产品推荐

