From f4871801a7ec8155684188be22847b5f31e77ca8 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Mon, 1 Jan 2024 14:18:50 +0100 Subject: [PATCH] Implement BlGetXtLdrProtocol() --- sdk/xtdk/blfuncs.h | 23 +++++++++++++++ sdk/xtdk/xtblapi.h | 1 + xtldr2/protocol.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 sdk/xtdk/blfuncs.h diff --git a/sdk/xtdk/blfuncs.h b/sdk/xtdk/blfuncs.h new file mode 100644 index 0000000..77e0bf1 --- /dev/null +++ b/sdk/xtdk/blfuncs.h @@ -0,0 +1,23 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: sdk/xtdk/blfuncs.h + * DESCRIPTION: XT Boot Manager routines + * DEVELOPERS: Rafal Kupiec + */ + +#ifndef __XTDK_BLFUNCS_H +#define __XTDK_BLFUNCS_H + +#include +#include + + +/* XT BootLoader routines forward references */ +XTCDECL +EFI_STATUS +BlGetXtLdrProtocol(IN PEFI_SYSTEM_TABLE SystemTable, + IN EFI_HANDLE ImageHandle, + OUT PXTBL_LOADER_PROTOCOL *ProtocolHandler); + +#endif /* __XTDK_BLFUNCS_H */ diff --git a/sdk/xtdk/xtblapi.h b/sdk/xtdk/xtblapi.h index f58c149..5da87e8 100644 --- a/sdk/xtdk/xtblapi.h +++ b/sdk/xtdk/xtblapi.h @@ -45,3 +45,4 @@ /* Boot Manager specific structures */ #include +#include diff --git a/xtldr2/protocol.c b/xtldr2/protocol.c index 503eaa7..13afe52 100644 --- a/xtldr2/protocol.c +++ b/xtldr2/protocol.c @@ -52,6 +52,76 @@ BlFindBootProtocol(IN PWCHAR SystemType, return STATUS_EFI_NOT_FOUND; } +/** + * Finds and opens the XT Boot Loader protocol. This routine should be called by module to access XTLDR protocol. + * + * @param SystemTable + * Provides the EFI system table. + * + * @param ImageHandle + * Firmware-allocated handle that identifies the image. + * + * @param ProtocolHandler + * Receives the pointer to the XT Boot Loader protocol. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTCDECL +EFI_STATUS +BlGetXtLdrProtocol(IN PEFI_SYSTEM_TABLE SystemTable, + IN EFI_HANDLE ImageHandle, + OUT PXTBL_LOADER_PROTOCOL *ProtocolHandler) +{ + EFI_GUID ProtocolGuid = XT_BOOT_LOADER_PROTOCOL_GUID; + PEFI_HANDLE Handles = NULL; + EFI_STATUS Status; + UINT_PTR Count; + UINT Index; + + /* Try to locate the handles */ + Status = SystemTable->BootServices->LocateHandleBuffer(ByProtocol, &ProtocolGuid, NULL, &Count, &Handles); + if(Status != STATUS_EFI_SUCCESS) + { + /* Unable to get handles */ + return Status; + } + + /* Check if any handles returned */ + if(Count > 0) + { + /* Iterate through all given handles */ + for(Index = 0; Index < Count; Index++) + { + /* Try to open protocol */ + Status = SystemTable->BootServices->OpenProtocol(Handles[Index], &ProtocolGuid, + (PVOID*)ProtocolHandler, ImageHandle, NULL, + EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL); + + /* Check if successfully opened the loader protocol */ + if(Status == STATUS_EFI_SUCCESS) + { + /* Protocol found and successfully opened */ + break; + } + } + } + + /* Free handles */ + SystemTable->BootServices->FreePool(Handles); + + /* Make sure the loaded protocol has been found */ + if(*ProtocolHandler == NULL) + { + /* Protocol not found */ + return STATUS_EFI_NOT_FOUND; + } + + /* Return success */ + return STATUS_EFI_SUCCESS; +} + /** * Loads a specified XTLDR module from disk. *