#defineEFI_HANDLE_SIGNATURESIGNATURE_32('h','n','d','l')////// IHANDLE - contains a list of protocol handles///typedefstruct { UINTN Signature; /// All handles list of IHANDLE LIST_ENTRY AllHandles; /// List of PROTOCOL_INTERFACE's for this handle LIST_ENTRY Protocols; UINTN LocateRequest; /// The Handle Database Key value when this handle was last created or modified UINT64 Key;} IHANDLE;
이 핸들에는 연결된 프로토콜 목록이 존재한다.
(프로토콜은 인터페이스와 같이 기능및 데이터 필드의 집합이다.)
핸들에 연결된 프로토콜 목록을 추적하기 위해서 해당 아래의 필드가 사용된다.
/// List of PROTOCOL_INTERFACE's for this handleLIST_ENTRY Protocols;
이는 위에서 언급한 것과 같이 다음 구조를 가리키는 이중연결리스트(double-linked list)이다.
#definePROTOCOL_INTERFACE_SIGNATURESIGNATURE_32('p','i','f','c')////// PROTOCOL_INTERFACE - each protocol installed on a handle is tracked/// with a protocol interface structure///typedefstruct { UINTN Signature; /// Link on IHANDLE.Protocols LIST_ENTRY Link; /// Back pointer IHANDLE *Handle; /// Link on PROTOCOL_ENTRY.Protocols LIST_ENTRY ByProtocol; /// The protocol ID PROTOCOL_ENTRY *Protocol; /// The interface value VOID *Interface; /// OPEN_PROTOCOL_DATA list LIST_ENTRY OpenList; UINTN OpenListCount;} PROTOCOL_INTERFACE;
PROTOCOL_INTERFACE는 핸들의 이중연결리스트(double-linked list)되어 있다. 그리고 다음 구조인PROTOCOL_ENTRY를 가리키고 있다.
#definePROTOCOL_ENTRY_SIGNATURESIGNATURE_32('p','r','t','e')////// PROTOCOL_ENTRY - each different protocol has 1 entry in the protocol/// database. Each handler that supports this protocol is listed, along/// with a list of registered notifies.///typedefstruct { UINTN Signature; /// Link Entry inserted to mProtocolDatabase LIST_ENTRY AllEntries; /// ID of the protocol EFI_GUID ProtocolID; /// All protocol interfaces LIST_ENTRY Protocols; /// Registerd notification handlers LIST_ENTRY Notify;} PROTOCOL_ENTRY;
PROTOCOL_INTERFACE 구조는 별도의 프로토콜 데이터베이스에 존재하는 실제 PROTOCOL_ENTRY 구조를 가리키는 프록시일 뿐입니다.
위에서 시사한 점들은 아래의 그림으로 통해서 한눈에 볼 수 있다.
모든 핸들은 각 IHANDLE 구조의 AllHandles 필드의 도움으로 인하여 상호 연결된다.
모든 프로토콜은 PROTOCOL_ENTRY 구조의 AllEntries 필드의 도움으로 상호 연결된다.
각 Handle에는 Link 필드의 녹색 선을 통해 내부적으로 서로 연결된 모든 PROTOCOL_INTERFACES의 이중 연결구조로 되어있다.
각 프로토콜 항목은 사용되는 모든곳(PROTOCOL_INTERFACES)을 효과적으로 알고 있다.
#include<Library/UefiBootServicesTableLib.h>#include<Library/UefiLib.h>typedefstruct { UINTN Signature; /// All handles list of IHANDLE LIST_ENTRY AllHandles; /// List of PROTOCOL_INTERFACE's for this handle LIST_ENTRY Protocols; UINTN LocateRequest; /// The Handle Database Key value when this handle was last created or modified UINT64 Key;} IHANDLE;EFI_STATUSEFIAPIUefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ){ IHANDLE* MyHandle = ImageHandle;Print(L"Signature: %c%c%c%c\n", (MyHandle->Signature >>0) &0xff, (MyHandle->Signature >>8) &0xff, (MyHandle->Signature >>16) &0xff, (MyHandle->Signature >>24) &0xff);return EFI_SUCCESS;}