“因为硬盘是一种块设备,所以每个硬盘设备(硬盘设备包括分区设备)控制器都安装有一个 BlockIo 实例,一个 BlockIo2实例。BlockIo 提供了访问设备的阻塞函数,BlockIo2提供了访问设备的异步函数”【参考1】
这里提供一个枚举BlockIo,然后显示每一个 Media 属性的例子:
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <Protocol/BlockIo.h>
extern EFI_BOOT_SERVICES *gBS;
extern EFI_SYSTEM_TABLE *gST;
extern EFI_RUNTIME_SERVICES *gRT;
int
EFIAPI
main (
IN int Argc,
IN CHAR16 **Argv
)
{
EFI_STATUS Status;
UINTN HandleCount,HandleIndex;
EFI_HANDLE *BlockControllerHandles = NULL;
EFI_BLOCK_IO_PROTOCOL *BlockIo;
//找到全部有 BlockIo Protocol 的Device
Status = gBS->LocateHandleBuffer(
ByProtocol,
&gEfiBlockIoProtocolGuid,
NULL,
&HandleCount,
&BlockControllerHandles);
if (!EFI_ERROR(Status)) {
//逐个打开
for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
/*打开EFI_BLOCK_IO_PROTOCOL */
Status = gBS->HandleProtocol(
BlockControllerHandles[HandleIndex],
&gEfiBlockIoProtocolGuid,
(VOID**)&BlockIo);
//显示信息
Print(L"-->[Device]<--:%d\n",HandleIndex);
Print(L"MediaId :%0x\n",BlockIo->Media->MediaId);
Print(L"RemovableMedia:%0x\n",BlockIo->Media->RemovableMedia);
Print(L"MediaPresent :%0x\n",BlockIo->Media->MediaPresent);
Print(L"ReadOnly :%0x\n",BlockIo->Media->ReadOnly);
Print(L"WriteCaching :%0x\n",BlockIo->Media->WriteCaching);
Print(L"BlockSize :%0x\n",BlockIo->Media->BlockSize);
Print(L"IoAlign :%0x\n",BlockIo->Media->IoAlign);
Print(L"LastBlock :%0x\n",BlockIo->Media->LastBlock);
Print(L"LogicalPartition :%0x\n",BlockIo->Media->LogicalPartition);
Print(L"LowestAlignedLba :%0x\n",BlockIo->Media->LowestAlignedLba);
Print(L"LogicalBlocksPerPhysicalBlock : %0x\n",
BlockIo->Media->LogicalBlocksPerPhysicalBlock);
Print(L"OptimalTransferLengthGranularity: %0x\n",
BlockIo->Media->OptimalTransferLengthGranularity);
} //for (HandleIndex = 0;
gBS->FreePool(BlockControllerHandles);
}
return EFI_SUCCESS;
}
在 Nt32 虚拟机中运行的结果
完整的代码和程序下载:
参考
1. UEFI 原理与编程 P139


