From 1d61b2fb6a3fe2eba73280150806d02dada0b26a Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Sat, 30 Dec 2023 13:36:17 +0100 Subject: [PATCH] Store module dependencies in a linked list --- sdk/xtdk/bltypes.h | 9 ++++++++- xtldr2/modules/dummy/dummy.c | 2 +- xtldr2/modules/dummy2/dummy2.c | 5 +---- xtldr2/xtldr.c | 27 ++++++++++++++++++++------- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index f253b4c..ce550d8 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -172,13 +172,20 @@ typedef struct _XTBL_LOADER_PROTOCOL } Util; } XTBL_LOADER_PROTOCOL, *PXTBL_LOADER_PROTOCOL; +/* XTLDR Module dependencies data */ +typedef struct _XTBL_MODULE_DEPS +{ + LIST_ENTRY Flink; + PWCHAR ModuleName; +} XTBL_MODULE_DEPS, *PXTBL_MODULE_DEPS; + /* XTLDR Module information data */ typedef struct _XTBL_MODULE_INFO { LIST_ENTRY Flink; PWCHAR ModuleName; PWCHAR ModuleDescription; - WCHAR Dependencies[1024]; + LIST_ENTRY Dependencies; } XTBL_MODULE_INFO, *PXTBL_MODULE_INFO; /* XTLDR Status data */ diff --git a/xtldr2/modules/dummy/dummy.c b/xtldr2/modules/dummy/dummy.c index 881a8d2..cc24ebb 100644 --- a/xtldr2/modules/dummy/dummy.c +++ b/xtldr2/modules/dummy/dummy.c @@ -31,5 +31,5 @@ EFI_STATUS XtLdrModuleMain(IN EFI_HANDLE ImageHandle, IN PEFI_SYSTEM_TABLE SystemTable) { - return STATUS_EFI_SUCCESS; + return STATUS_EFI_SUCCESS; } diff --git a/xtldr2/modules/dummy2/dummy2.c b/xtldr2/modules/dummy2/dummy2.c index f9a184a..4681052 100644 --- a/xtldr2/modules/dummy2/dummy2.c +++ b/xtldr2/modules/dummy2/dummy2.c @@ -8,9 +8,6 @@ #include -#define XTBL_MODDEP SEGMENT(".moddeps") CONST WCHAR XtBlpDeps[][8] - -//XTBL_MODDEP = {L""}; /** * This routine is the entry point of the XT EFI boot loader module. @@ -30,5 +27,5 @@ EFI_STATUS XtLdrModuleMain(IN EFI_HANDLE ImageHandle, IN PEFI_SYSTEM_TABLE SystemTable) { - return STATUS_EFI_SUCCESS; + return STATUS_EFI_SUCCESS; } diff --git a/xtldr2/xtldr.c b/xtldr2/xtldr.c index f971152..6a71a5b 100644 --- a/xtldr2/xtldr.c +++ b/xtldr2/xtldr.c @@ -213,9 +213,10 @@ BlLoadModule(IN PWCHAR ModuleName) PPECOFF_IMAGE_SECTION_HEADER SectionHeader; PPECOFF_IMAGE_DOS_HEADER DosHeader; PPECOFF_IMAGE_PE_HEADER PeHeader; + PXTBL_MODULE_DEPS ModuleDependencies; PXTBL_MODULE_INFO ModuleInfo; PLIST_ENTRY ModuleListEntry; - WCHAR ModuleFileName[1024]; + WCHAR ModuleFileName[12]; USHORT SectionIndex; SIZE_T ModuleSize; EFI_STATUS Status; @@ -285,8 +286,9 @@ BlLoadModule(IN PWCHAR ModuleName) return Status; } - /* Zero module information block */ + /* Zero module information block and initialize dependencies list */ RtlZeroMemory(ModuleInfo, sizeof(XTBL_MODULE_INFO)); + RtlInitializeListHead(&ModuleInfo->Dependencies); /* Setup PE/COFF EFI image headers */ DosHeader = (PPECOFF_IMAGE_DOS_HEADER)ModuleData; @@ -317,9 +319,14 @@ BlLoadModule(IN PWCHAR ModuleName) return STATUS_EFI_UNSUPPORTED; } - /* Add dependency module name to the list */ - RtlConcatenateWideString(ModuleInfo->Dependencies, DepsData, RtlWideStringLength(DepsData, 0)); - RtlConcatenateWideString(ModuleInfo->Dependencies, L" ", 1); + /* Allocate memory for module dependency */ + Status = BlMemoryAllocatePool(sizeof(XTBL_MODULE_DEPS), (PVOID*)&ModuleDependencies); + if(Status == STATUS_EFI_SUCCESS) + { + /* Memory allocated successfully, store module's dependency */ + ModuleDependencies->ModuleName = DepsData; + RtlInsertTailList(&ModuleInfo->Dependencies, &ModuleDependencies->Flink); + } /* Get next dependency module name */ DepsData += 8; @@ -521,9 +528,15 @@ BlStartXtLoader(IN EFI_HANDLE ImageHandle, BlConsolePrint(L" (%S)", ModuleInfo->ModuleDescription); } - if(ModuleInfo->Dependencies[0] != 0) + PLIST_ENTRY DepsListEntry; + PXTBL_MODULE_DEPS DepsInfo; + BlConsolePrint(L"\n - Uses: "); + DepsListEntry = ModuleInfo->Dependencies.Flink; + while(DepsListEntry != &ModuleInfo->Dependencies) { - BlConsolePrint(L"\n - Uses: %S", ModuleInfo->Dependencies); + DepsInfo = CONTAIN_RECORD(DepsListEntry, XTBL_MODULE_DEPS, Flink); + BlConsolePrint(L"%S ", DepsInfo->ModuleName); + DepsListEntry = DepsListEntry->Flink; } /* Move to the module */