2013年6月12日 星期三

UEFI LocateProtocol、HandleProtocol 與OpenProtocol 說明

熟悉uefi的人一定不陌生LocateProtocol、HandleProtocol 與OpenProtocol ,但真的要清楚分別每個用法還真的不難,以下將介紹三中不同的用法
LocateProtocol (
  IN EFI_GUID *Protocol,
 IN VOID *Registration OPTIONAL,
 OUT VOID **Interface
 );
當確定只有一個Handle會擁有特定的Protocol時可以簡單用LocateProtocol, 指定的GUID去Get Interface取出第一個Protocol。
HandleProtocol (
 IN EFI_HANDLE Handle,
 IN EFI_GUID *Protocol,
 OUT VOID **Interface
 );
取出Handle中指定的Protocol,以GUID為識別。
OpenProtocol (
 IN EFI_HANDLE Handle,
 IN EFI_GUID *Protocol,
 OUT VOID **Interface OPTIONAL,
 IN EFI_HANDLE AgentHandle,
 IN EFI_HANDLE ControllerHandle,
 IN UINT32 Attributes
 );
類似HandleProtocol(),但提供了更安全的做法,綁訂指定的Handle,避免使用中的Protocol被Uninstall。
此為最後一個參數的定義:
#define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001
#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
依需要使用,有些定義可不用CloseProtocol()。
CloseProtocol (
 IN EFI_HANDLE Handle,
 IN EFI_GUID *Protocol,
 IN EFI_HANDLE AgentHandle,
 IN EFI_HANDLE ControllerHandle
 );



沒有留言:

張貼留言