9. ProtocolsPerHandle API를 통한 ImageHandle 프로토콜 가져오기
API를 통해서 간편하게 ImageHandle 프로토콜 가져오기
이전 장에서 설명한 이미지 핸들에 대한 프로토콜을 찾는 방식은 단순히 구조를 이해하기 위해서다. 동일한 결과를 UEFI API를 사용하면 더욱 간편하게 가져올 수 있다.
ProtocolsPerHandle -
EFI_BOOT_SERVICES.ProtocolsPerHandle()
Summary:
Retrieves the list of protocol interface GUIDs that are installed on a handle in a buffer allocated from pool.
Prototype:
typedef
EFI_STATUS
(EFIAPI *EFI_PROTOCOLS_PER_HANDLE) (
IN EFI_HANDLE Handle,
OUT EFI_GUID ***ProtocolBuffer,
OUT UINTN *ProtocolBufferCount
);
Parameters:
Handle The handle from which to retrieve the list of protocol interface GUIDs.
ProtocolBuffer A pointer to the list of protocol interface GUID pointers that are installed on Handle. This buffer is allocated with a call to the Boot Service EFI_BOOT_SERVICES.AllocatePool(). It is the caller's responsibility to call the Boot Service EFI_BOOT_SERVICES.FreePool() when the caller no longer requires the contents of ProtocolBuffer.
ProtocolBufferCountA pointer to the number of GUID pointers present in ProtocolBuffer.
Description:
The ProtocolsPerHandle() function retrieves the list of protocol interface GUIDs that are installed on Handle. The list is returned in ProtocolBuffer, and the number of GUID pointers in ProtocolBuffer is returned in ProtocolBufferCount.
If Handle is NULL or Handle is NULL, then EFI_INVALID_PARAMETER is returned.
If ProtocolBuffer is NULL, then EFI_INVALID_PAREMETER is returned.
If ProtocolBufferCount is NULL, then EFI_INVALID_PARAMETER is returned.
If there are not enough resources available to allocate ProtocolBuffer, then EFI_OUT_OF_RESOURCES is
returned.
Status Codes Returned:
EFI_SUCCESS The list of protocol interface GUIDs installed on Handle was returned in
ProtocolBuffer. The number of protocol interface GUIDs was
returned in ProtocolBufferCount.
EFI_INVALID_PARAMETER Handle is NULL.
EFI_INVALID_PARAMETER ProtocolBuffer is NULL.
EFI_INVALID_PARAMETER ProtocolBufferCount is NULL.
EFI_OUT_OF_RESOURCES There is not enough pool memory to store the results.해당 설명을 읽어보면 버퍼의 할당을 AllocatePool()을 통해서 자동적으로 해주며 해당 버퍼에 대한 해제는 FreePool()을 통해서 사용자가 직접 해야한다고 나와있다.
API의 사용법에 대해서 숙지하고 있으니 ImageHandle 어플리케이션 아랫 부분에 추가를 시켜보겠다.
이외에도 FreePool 함수 사용을 위해서 헤더 파일을 추가 해야한다.
일부 사람들은 해당 코드를 보고 gBs->FreePool을 사용하지 않고 FreePool을 사용한 것을 궁금해 할 수도 있다.
이는 아래의 파일에 정의가 되어서 문제가 생기지 않는 것이다.
(https://github.com/tianocore/edk2/blob/master/MdePkg/Library/UefiMemoryAllocationLib/MemoryAllocationLib.c)
추가로 FreePool에는 다른 라이브러리들의 구현이 필요하기 때문에 .dsc 파일의 [LibraryClasses] 부분에 추가가 필요하다.
빌드 후 QEMU상에서 파일을 실행시키면 아래와 같은 화면을 볼 수 있으며 이는 이전에 핸들/프로토콜 데이터베이스를 통해서 구한 GUID 값과 동일한 것을 알 수 있다.
Last updated