“因为硬盘是一种块设备,所以每个硬盘设备(硬盘设备包括分区设备)控制器都安装有一个 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