如何在我的 uefi 引导加载程序中使用 block i/o 协议

how to use block i/o protocol in my uefi bootloader

我正在阅读 FreeBSD uefi 引导程序。但是关于Block I/O Protocol.I quote source code.

有一部分我无法理解
status = systab->BootServices->LocateHandle(ByProtocol,
    &BlockIoProtocolGUID, NULL, &nparts, handles);
nparts /= sizeof(handles[0]);

for (i = 0; i < nparts; i++) {
    status = systab->BootServices->HandleProtocol(handles[i],
        &DevicePathGUID, (void **)&devpath); 
    if (EFI_ERROR(status))
        continue;

    while (!IsDevicePathEnd(NextDevicePathNode(devpath)))
        devpath = NextDevicePathNode(devpath);

    status = systab->BootServices->HandleProtocol(handles[i],
        &BlockIoProtocolGUID, (void **)&blkio); 
    if (EFI_ERROR(status))
        continue;

    if (!blkio->Media->LogicalPartition)
        continue;

    if (domount(devpath, blkio, 1) >= 0)
        break;
}

为什么如下代码在搜索设备路径结束?

  while (!IsDevicePathEnd(NextDevicePathNode(devpath)))
        devpath = NextDevicePathNode(devpath);

看起来代码想要查看设备路径的最后一个节点,因此它跳过所有节点,直到到达结束节点之前的节点。

只想对 haggai_e 所说的内容进行补充。 DP(设备路径)是一个简单的链表,其中每个节点代表对 UEFI 环境中物理或逻辑设备的某种描述。您可能知道 UEFI 中的每个设备都是一个句柄。因此,遍历 DP 并获取特定节点的句柄可为您提供 DP 描述的特定设备的句柄。