You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:46:14