Simple File System
Overview
以下接口由 BootService 提供!!!
OpenProtocol
| typedef
EFI_STATUS
(EFIAPI *EFI_OPEN_PROTOCOL)(
IN EFI_HANDLE Handle,
IN EFI_GUID *Protocol,
OUT VOID **Interface, OPTIONAL
IN EFI_HANDLE AgentHandle,
IN EFI_HANDLE ControllerHandle,
IN UINT32 Attributes
);
|
| #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001 // 类似HandleProtocol()
#define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002 // 从句柄上获取
#define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004 // 测试是否存在
#define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
#define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020 // 获取Protocol独占权
|
LocateHandle
| typedef
EFI_STATUS
(EFIAPI *EFI_LOCATE_HANDLE)(
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID *Protocol, OPTIONAL
IN VOID *SearchKey, OPTIONAL
IN OUT UINTN *BufferSize,
OUT EFI_HANDLE *Buffer
);
|
| typedef enum {
/// 所有 Handle
AllHandles,
///
/// Retrieve the next handle fron a RegisterProtocolNotify() event.
///
ByRegisterNotify,
/// 找出所有 Protocol (GUID)对应的Handle,忽略 SearchKey
ByProtocol
} EFI_LOCATE_SEARCH_TYPE;
|
在操作成功后,Buffer 中Handle的个数为BufferSize / sizeof(EFI_HANDLE).
请在Protocol打开后完成FreePool操作!!!
LocateHandleBuffer
它与LocateHandle的最大区别在于,LocateHandle需要一个预先准备好的Buffer,而它会自己创建.
| typedef
EFI_STATUS
(EFIAPI *EFI_LOCATE_HANDLE_BUFFER)(
IN EFI_LOCATE_SEARCH_TYPE SearchType,
IN EFI_GUID *Protocol, OPTIONAL
IN VOID *SearchKey, OPTIONAL
IN OUT UINTN *NoHandles,
OUT EFI_HANDLE **Buffer
);
|
GUID 的定义
一般在头文件中写的清清楚楚,但是是宏的形式,并未有实际定义全局变量.我们可以采取以下解决方案:
- 不使用全局变量,自己定义
| EFI_GUID EfiSimpleFileSystemProtocolGuid = (EFI_GUID)EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID;
|
- 使用全局变量,在inf文件中声明,在编译生成AutoGen.c时定义
| [Protocols]
gEfiSimpleFileSystemProtocolGuid
|
参考
src/boot/SigmaBootPkg/File.c