diff --git a/README.md b/README.md index a32f21c..552775f 100644 --- a/README.md +++ b/README.md @@ -70,14 +70,12 @@ The configuration options are described in `config.txt`, which the installer cop ## Images -The image path can be changed in the configuration file. The default path is `[EFI System Partition]\EFI\HackBGRT\splash.bmp`. +If you only need one image, just edit `splash.bmp` to your needs. -The installer copies and converts files whose `path` starts with `\EFI\HackBGRT\`. For example, to use a file named `my.jpg`, copy it in the installer folder (same folder as `setup.exe`) and set the image path in `config.txt` to `path=\EFI\HackBGFT\my.jpg`. +Advanced users may edit the `config.txt` to define multiple images, in which case one is picked at random. The installer copies and converts the images. For example, to use a file named `my.jpg`, copy it in the installer folder (same folder as `setup.exe`) and set the image path in `config.txt` to `path=my.jpg` before running the installer. If you copy an image file to ESP manually, note that the image must be a 24-bit BMP file with a 54-byte header. That's a TrueColor BMP3 in Imagemagick, or 24-bit BMP/DIB in Microsoft Paint. -Advanced users may edit the `config.txt` to define multiple images, in which case one is picked at random. - ## Recovery If something breaks and you can't boot to Windows, you need to use the Windows installation disk (or recovery disk) to fix boot issues. diff --git a/config.txt b/config.txt index 494a937..2e1a2b8 100644 --- a/config.txt +++ b/config.txt @@ -16,16 +16,14 @@ boot=MS # - "keep" to keep the firmware logo. Also keeps coordinates by default. # - "remove" to remove the BGRT. Makes x and y meaningless. # - "black" to use only a black image. Makes x and y meaningless. -# - "path=..." to read a BMP file. -# * NOTE: For path=\EFI\HackBGRT\*, the installer will copy and convert the file if necessary. -# * NOTE: For other paths, make sure that the file is a 24-bit BMP file with a 54-byte header. -# * NOTE: The file must be on the EFI System Partition. Do not add a drive letter! +# - "path=file.bmp" to read an image file. +# * NOTE: The installer can copy and convert BMP, PNG, JPEG, GIF. # Examples: # - image=remove # - image=black -# - image= x=0 y=-200 path=\EFI\HackBGRT\topimage.bmp -# - image= n=1 o=90 path=\EFI\HackBGRT\sideways.bmp -# - image= n=50 y=999999 o=keep path=\EFI\HackBGRT\probable.bmp +# - image= x=0 y=-200 path=topimage.bmp +# - image= n=1 o=90 path=sideways.bmp +# - image= n=50 y=999999 o=keep path=probable.bmp # The above examples together would produce # - 1/54 chance for the default OS logo # - 1/54 chance for black screen @@ -33,7 +31,7 @@ boot=MS # - 1/54 chance for splash.bmp, centered, orientation set to 90 degrees # - 50/54 chance for probable.bmp, at the bottom edge, explicitly default orientation # Default: just one image. -image= y=-200 path=\EFI\HackBGRT\splash.bmp +image= y=-200 path=splash.bmp # Preferred resolution. Use 0x0 for maximum and -1x-1 for original. resolution=0x0 diff --git a/src/Setup.cs b/src/Setup.cs index 51c39c0..557eba7 100644 --- a/src/Setup.cs +++ b/src/Setup.cs @@ -352,10 +352,16 @@ public class Setup { var lines = File.ReadAllLines("config.txt"); Log($"config.txt:\n{String.Join("\n", lines)}"); foreach (var line in lines.Where(s => s.StartsWith("image="))) { - var delim = "path=\\EFI\\HackBGRT\\"; + var delim = "path="; var i = line.IndexOf(delim); if (i > 0) { - InstallImageFile(line.Substring(i + delim.Length)); + var dir = "\\EFI\\HackBGRT\\"; + if (line.Substring(i + delim.Length).StartsWith(dir)) { + InstallImageFile(line.Substring(i + delim.Length + dir.Length)); + } + if (!line.Substring(i + delim.Length).StartsWith("\\")) { + InstallImageFile(line.Substring(i + delim.Length)); + } } } var loaderDest = "loader.efi"; diff --git a/src/config.c b/src/config.c index bd69bf3..1bd6084 100644 --- a/src/config.c +++ b/src/config.c @@ -1,10 +1,10 @@ #include "config.h" #include "util.h" -BOOLEAN ReadConfigFile(struct HackBGRT_config* config, EFI_FILE_HANDLE root_dir, const CHAR16* path) { +BOOLEAN ReadConfigFile(struct HackBGRT_config* config, EFI_FILE_HANDLE base_dir, const CHAR16* path) { void* data = 0; UINTN data_bytes = 0; - data = LoadFileWithPadding(root_dir, path, &data_bytes, 4); + data = LoadFileWithPadding(base_dir, path, &data_bytes, 4); if (!data) { Log(1, L"Failed to load configuration (%s)!\n", path); return FALSE; @@ -61,7 +61,7 @@ BOOLEAN ReadConfigFile(struct HackBGRT_config* config, EFI_FILE_HANDLE root_dir, str[j] = 0; ++j; } - ReadConfigLine(config, root_dir, &str[i]); + ReadConfigLine(config, base_dir, &str[i]); i = j; } // NOTICE: string is not freed, because paths are not copied. @@ -129,7 +129,7 @@ static void ReadConfigResolution(struct HackBGRT_config* config, const CHAR16* l } } -void ReadConfigLine(struct HackBGRT_config* config, EFI_FILE_HANDLE root_dir, const CHAR16* line) { +void ReadConfigLine(struct HackBGRT_config* config, EFI_FILE_HANDLE base_dir, const CHAR16* line) { line = TrimLeft(line); if (line[0] == L'#' || line[0] == 0) { return; @@ -152,7 +152,7 @@ void ReadConfigLine(struct HackBGRT_config* config, EFI_FILE_HANDLE root_dir, co return; } if (StrnCmp(line, L"config=", 7) == 0) { - ReadConfigFile(config, root_dir, line + 7); + ReadConfigFile(config, base_dir, line + 7); return; } if (StrnCmp(line, L"resolution=", 11) == 0) { diff --git a/src/config.h b/src/config.h index ed7bc72..90b4705 100644 --- a/src/config.h +++ b/src/config.h @@ -39,17 +39,17 @@ struct HackBGRT_config { * Read a configuration parameter. (May recursively read config files.) * * @param config The configuration to modify. - * @param root_dir The root directory, in case the parameter contains an include. + * @param base_dir The base directory, in case the parameter contains an include. * @param line The configuration line to parse. */ -extern void ReadConfigLine(struct HackBGRT_config* config, EFI_FILE_HANDLE root_dir, const CHAR16* line); +extern void ReadConfigLine(struct HackBGRT_config* config, EFI_FILE_HANDLE base_dir, const CHAR16* line); /** * Read a configuration file. (May recursively read more files.) * * @param config The configuration to modify. - * @param root_dir The root directory. + * @param base_dir The base directory. * @param path The path to the file. * @return FALSE, if the file couldn't be read, TRUE otherwise. */ -extern BOOLEAN ReadConfigFile(struct HackBGRT_config* config, EFI_FILE_HANDLE root_dir, const CHAR16* path); +extern BOOLEAN ReadConfigFile(struct HackBGRT_config* config, EFI_FILE_HANDLE base_dir, const CHAR16* path); diff --git a/src/main.c b/src/main.c index fd04d68..23cf21a 100644 --- a/src/main.c +++ b/src/main.c @@ -239,17 +239,17 @@ static BMP* MakeBMP(int w, int h, UINT8 r, UINT8 g, UINT8 b) { /** * Load a bitmap or generate a black one. * - * @param root_dir The root directory for loading a BMP. - * @param path The BMP path within the root directory; NULL for a black BMP. + * @param base_dir The directory for loading a BMP. + * @param path The BMP path within the directory; NULL for a black BMP. * @return The loaded BMP, or 0 if not available. */ -static BMP* LoadBMP(EFI_FILE_HANDLE root_dir, const CHAR16* path) { +static BMP* LoadBMP(EFI_FILE_HANDLE base_dir, const CHAR16* path) { if (!path) { return MakeBMP(1, 1, 0, 0, 0); // empty path = black image } Log(config.debug, L"Loading %s.\n", path); UINTN size = 0; - BMP* bmp = LoadFile(root_dir, path, &size); + BMP* bmp = LoadFile(base_dir, path, &size); if (bmp) { if (size >= bmp->file_size && CompareMem(bmp, "BM", 2) == 0 @@ -299,9 +299,9 @@ static void CropBMP(BMP* bmp, int w, int h) { /** * The main logic for BGRT modification. * - * @param root_dir The root directory for loading a BMP. + * @param base_dir The directory for loading a BMP. */ -void HackBgrt(EFI_FILE_HANDLE root_dir) { +void HackBgrt(EFI_FILE_HANDLE base_dir) { // REMOVE: simply delete all BGRT entries. if (config.action == HackBGRT_REMOVE) { HandleAcpiTables(config.action, 0); @@ -352,7 +352,7 @@ void HackBgrt(EFI_FILE_HANDLE root_dir) { // Get the image (either old or new). BMP* new_bmp = old_bmp; if (config.action == HackBGRT_REPLACE) { - new_bmp = LoadBMP(root_dir, config.image_path); + new_bmp = LoadBMP(base_dir, config.image_path); } // No image = no need for BGRT. @@ -435,10 +435,16 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *ST_) { goto fail; } + EFI_FILE_HANDLE base_dir; + if (EFI_ERROR(root_dir->Open(root_dir, &base_dir, L"\\EFI\\HackBGRT", EFI_FILE_MODE_READ, 0))) { + Log(config.debug, L"Failed to HackBGRT directory.\n"); + base_dir = root_dir; + } + EFI_SHELL_PARAMETERS_PROTOCOL *shell_param_proto = NULL; if (EFI_ERROR(BS->OpenProtocol(image_handle, TmpGuidPtr((EFI_GUID) EFI_SHELL_PARAMETERS_PROTOCOL_GUID), (void**) &shell_param_proto, 0, 0, EFI_OPEN_PROTOCOL_GET_PROTOCOL)) || shell_param_proto->Argc <= 1) { - const CHAR16* config_path = L"\\EFI\\HackBGRT\\config.txt"; - if (!ReadConfigFile(&config, root_dir, config_path)) { + const CHAR16* config_path = L"config.txt"; + if (!ReadConfigFile(&config, base_dir, config_path)) { Log(1, L"No config, no command line!\n", config_path); goto fail; } @@ -446,7 +452,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *ST_) { CHAR16 **argv = shell_param_proto->Argv; int argc = shell_param_proto->Argc; for (int i = 1; i < argc; ++i) { - ReadConfigLine(&config, root_dir, argv[i]); + ReadConfigLine(&config, base_dir, argv[i]); } } @@ -455,7 +461,7 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *ST_) { } SetResolution(config.resolution_x, config.resolution_y); - HackBgrt(root_dir); + HackBgrt(base_dir); EFI_HANDLE next_image_handle = 0; static CHAR16 backup_boot_path[] = L"\\EFI\\HackBGRT\\bootmgfw-original.efi";