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で呼び出す。 コード例は以下。
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
にある。
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のハンドラを作るコード例は以下。
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
);
以上。