Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # EFI_TCP4_SERVICE_BINDING_PROTOCOLとEFI_TCP4_PROTOCOLに関するメモ
- ## 結論
- EFI_TCP4_PROTOCOLはEFI_TCP4_SERVICE_BINDING_PROTOCOLのCreateChildで作ったEFI_HANDLEから呼び出す。
- ## メモ
- Env: gnu-efi-3.0.6
- EFI_TCP4_PROTOCOLのGUIDからLocateHandleBufferでハンドラを探し、そのハンドラからプロトコルを呼び出して使うという方法でEFI_TCP4_PROTOCOLの関数(GetModeDataなど)を使うと、EFI_NOT_STARTED(19)が帰ってくる。
- EFI_TCP4_SERVICE_BINDING_PROTOCOLはLocateHandleBufferで呼び出す。
- コード例は以下。
- ```c
- EFI_STATUS
- find_tcp4_service_binding_handlers (
- EFI_HANDLE **handlers,
- UINTN *nohandlers
- )
- {
- EFI_STATUS efi_status;
- // load handler
- EFI_GUID tcp4_service_binding_protocol_guid = EFI_TCP4_SERVICE_BINDING_PROTOCOL;
- efi_status = uefi_call_wrapper(
- BS->LocateHandleBuffer,
- 5,
- ByProtocol,
- &tcp4_service_binding_protocol_guid,
- NULL, /* SearchKey is ignored */
- (UINTN *)nohandlers,
- (EFI_HANDLE **)handlers
- );
- return efi_status;
- }
- ```
- EFI_TCP4_SERVICE_BINDING_PROTOCOLのハンドラを取得したら、プロトコルを取得する。
- プロトコルの型はEFI_SERVICE_BINDING、定義は `inc/efiprot.h ` にある。
- ```c
- EFI_STATUS
- load_tcp4_service_binding_protocol(
- EFI_SERVICE_BINDING **protocol,
- EFI_HANDLE *handlers,
- UINTN port
- )
- {
- EFI_STATUS efi_status;
- EFI_GUID tcp4_service_binding_protocol_guid = EFI_TCP4_SERVICE_BINDING_PROTOCOL;
- efi_status = uefi_call_wrapper(
- BS->HandleProtocol,
- 3,
- handlers[port],
- &tcp4_service_binding_protocol_guid,
- (VOID **)protocol
- );
- return efi_status;
- }
- ```
- CreateChild関数の定義も `inc/efiprot.h ` にある。EFI_TCP4_PROTOCOLのハンドラを作るコード例は以下。
- ```c
- EFI_SERVICE_BINDING *tcp4_service_binding_protocol;
- /* tcp4_service_binding_protocolを取得 */
- EFI_HANDLE tcp4_handlers;
- efi_status = uefi_call_wrapper(
- tcp4_service_binding_protocol->CreateChild,
- 2,
- tcp4_service_binding_protocol,
- &tcp4_handlers
- );
- ```
- 以上。
Add Comment
Please, Sign In to add comment