From f49966b462040d5542d549fd5b6d381963295172 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Fri, 5 Jan 2024 23:28:12 +0100 Subject: [PATCH] Allow to read XTLDR data from alternative arch-specific directory; this allows to prepare combined 32 & 64 bit disk --- sdk/xtdk/bltypes.h | 13 +++++++++++++ xtldr/config.c | 7 +++++++ xtldr/protocol.c | 11 +++++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index be432d2..97a9e97 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -14,6 +14,19 @@ #include +/* Architecture specific definitions */ +#if defined(__i386__) || defined(__i686__) + #define XTBL_ARCH_LOADER_DIRECTORY_PATH L"\\EFI\\BOOT\\XTLDR32\\" + #define XTBL_ARCH_MODULES_DIRECTORY_PATH L"\\EFI\\BOOT\\XTLDR32\\MODULES\\" + #define XTBL_ARCH_THEMES_DIRECTORY_PATH L"\\EFI\\BOOT\\XTLDR32\\THEMES\\" +#elif defined(__amd64__) || defined(__x86_64__) + #define XTBL_ARCH_LOADER_DIRECTORY_PATH L"\\EFI\\BOOT\\XTLDR64\\" + #define XTBL_ARCH_MODULES_DIRECTORY_PATH L"\\EFI\\BOOT\\XTLDR64\\MODULES\\" + #define XTBL_ARCH_THEMES_DIRECTORY_PATH L"\\EFI\\BOOT\\XTLDR64\\THEMES\\" +#else + #error Unknown architecture +#endif + /* XTLDR directories */ #define XTBL_LOADER_DIRECTORY_PATH L"\\EFI\\BOOT\\XTLDR\\" #define XTBL_MODULES_DIRECTORY_PATH L"\\EFI\\BOOT\\XTLDR\\MODULES\\" diff --git a/xtldr/config.c b/xtldr/config.c index e629e0e..b946700 100644 --- a/xtldr/config.c +++ b/xtldr/config.c @@ -123,6 +123,13 @@ BlpLoadConfiguration() /* Read data from configuration file */ Status = BlpReadConfigFile(XTBL_LOADER_DIRECTORY_PATH, L"XTLDR.INI", &ConfigData); if(Status != STATUS_EFI_SUCCESS) + { + /* Failed to read config file, try with architecture specific directory */ + Status = BlpReadConfigFile(XTBL_ARCH_LOADER_DIRECTORY_PATH, L"XTLDR.INI", &ConfigData); + } + + /* Check if configuration was read successfully */ + if(Status != STATUS_EFI_SUCCESS) { /* Failed to load configuration */ BlDebugPrint(L"Failed to load configuration file (FS0:/EFI/BOOT/XTLDR.INI)\n"); diff --git a/xtldr/protocol.c b/xtldr/protocol.c index 477aa20..dbb2b36 100644 --- a/xtldr/protocol.c +++ b/xtldr/protocol.c @@ -133,11 +133,18 @@ BlLoadModule(IN PWCHAR ModuleName) return Status; } - /* Open XTLDR modules directory and close the FS immediately */ + /* Open XTLDR modules common directory */ Status = FsHandle->Open(FsHandle, &DirHandle, XTBL_MODULES_DIRECTORY_PATH, EFI_FILE_MODE_READ, 0); + if(Status != STATUS_EFI_SUCCESS) + { + /* Modules directory not found, attempt to open XTLDR architecture specific modules directory */ + Status = FsHandle->Open(FsHandle, &DirHandle, XTBL_ARCH_MODULES_DIRECTORY_PATH, EFI_FILE_MODE_READ, 0); + } + + /* Close FS handle */ FsHandle->Close(FsHandle); - /* Check if directory opened successfully */ + /* Check if modules directory opened successfully */ if(Status != STATUS_EFI_SUCCESS) { /* Failed to open directory */