我正在尝试在 UEFI 中区分各种 SATA 磁盘。我尝试使用 DevicePath 来实现此目的。我使用协议 gEfiDevicePathProtocolGuid 来检索 DevicePath,然后通过 ConvertDevicePathToText 函数将其转换为文本。 问题是命名不一致。有时 DevicePath 的 SATA 部分有 3 个字段,有时只有 2 个。
BlockIO 句柄的设备路径如下所示:
PciRoot(0x0)/Pci(0x1F,0x2)/而Sata(0x1,0x0)/高清...
SimpleFileSystem 句柄的 DevicePath 看起来像这样:
PciRoot(0x0)/Pci(0x1F,0x2)/UEFI规范说数字0xFFFF是PMPN(端口倍增器),默认值为0xFFFF,如果没有端口倍增器,则可选。 有没有办法可靠地获取具有相同格式的 DevicePath(PMPN 字段是否始终存在或始终被忽略)?我尝试通过比较 DevicePath 的 Sata 部分来区分物理磁盘,但由于这种不一致,我无法这样做。Sata(0x1,0xFFFF,0x0)/高清...
ConvertDevicePathToText 生成不同的输出。 看起来来自内置协议的转换器创建了无效路径(缺少 0xffff 字段),而来自 EDK2 库的转换器是有效的。
CHAR16 *InvalidDevicePath = 0;
CHAR16 *ValidDevicePath = 0;
Status = gBS->LocateProtocol( &gEfiDevicePathToTextProtocolGuid, NULL, (VOID**)&Device2TextProtocol );
if (EFI_ERROR(Status)) {
return -1;
}
InvalidDevicePath = Device2TextProtocol->ConvertDevicePathToText(DiskDevicePath, FALSE, FALSE); // Sata(0x1,0x0)
ValidDevicePath = ConvertDevicePathToText(DiskDevicePath, FALSE, FALSE); // Sata(0x1,0xFFFF,0x0)