Get rid of \EFI\HackBGRT\ in config.txt

This commit is contained in:
Lauri Kenttä
2023-12-04 15:01:17 +02:00
parent 4096002eb2
commit 294da9c069
6 changed files with 42 additions and 34 deletions

View File

@@ -70,14 +70,12 @@ The configuration options are described in `config.txt`, which the installer cop
## Images ## 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. 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 ## 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. 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.

View File

@@ -16,16 +16,14 @@ boot=MS
# - "keep" to keep the firmware logo. Also keeps coordinates by default. # - "keep" to keep the firmware logo. Also keeps coordinates by default.
# - "remove" to remove the BGRT. Makes x and y meaningless. # - "remove" to remove the BGRT. Makes x and y meaningless.
# - "black" to use only a black image. Makes x and y meaningless. # - "black" to use only a black image. Makes x and y meaningless.
# - "path=..." to read a BMP file. # - "path=file.bmp" to read an image file.
# * NOTE: For path=\EFI\HackBGRT\*, the installer will copy and convert the file if necessary. # * NOTE: The installer can copy and convert BMP, PNG, JPEG, GIF.
# * 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!
# Examples: # Examples:
# - image=remove # - image=remove
# - image=black # - image=black
# - image= x=0 y=-200 path=\EFI\HackBGRT\topimage.bmp # - image= x=0 y=-200 path=topimage.bmp
# - image= n=1 o=90 path=\EFI\HackBGRT\sideways.bmp # - image= n=1 o=90 path=sideways.bmp
# - image= n=50 y=999999 o=keep path=\EFI\HackBGRT\probable.bmp # - image= n=50 y=999999 o=keep path=probable.bmp
# The above examples together would produce # The above examples together would produce
# - 1/54 chance for the default OS logo # - 1/54 chance for the default OS logo
# - 1/54 chance for black screen # - 1/54 chance for black screen
@@ -33,7 +31,7 @@ boot=MS
# - 1/54 chance for splash.bmp, centered, orientation set to 90 degrees # - 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 # - 50/54 chance for probable.bmp, at the bottom edge, explicitly default orientation
# Default: just one image. # 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. # Preferred resolution. Use 0x0 for maximum and -1x-1 for original.
resolution=0x0 resolution=0x0

View File

@@ -352,10 +352,16 @@ public class Setup {
var lines = File.ReadAllLines("config.txt"); var lines = File.ReadAllLines("config.txt");
Log($"config.txt:\n{String.Join("\n", lines)}"); Log($"config.txt:\n{String.Join("\n", lines)}");
foreach (var line in lines.Where(s => s.StartsWith("image="))) { foreach (var line in lines.Where(s => s.StartsWith("image="))) {
var delim = "path=\\EFI\\HackBGRT\\"; var delim = "path=";
var i = line.IndexOf(delim); var i = line.IndexOf(delim);
if (i > 0) { 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"; var loaderDest = "loader.efi";

View File

@@ -1,10 +1,10 @@
#include "config.h" #include "config.h"
#include "util.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; void* data = 0;
UINTN data_bytes = 0; UINTN data_bytes = 0;
data = LoadFileWithPadding(root_dir, path, &data_bytes, 4); data = LoadFileWithPadding(base_dir, path, &data_bytes, 4);
if (!data) { if (!data) {
Log(1, L"Failed to load configuration (%s)!\n", path); Log(1, L"Failed to load configuration (%s)!\n", path);
return FALSE; return FALSE;
@@ -61,7 +61,7 @@ BOOLEAN ReadConfigFile(struct HackBGRT_config* config, EFI_FILE_HANDLE root_dir,
str[j] = 0; str[j] = 0;
++j; ++j;
} }
ReadConfigLine(config, root_dir, &str[i]); ReadConfigLine(config, base_dir, &str[i]);
i = j; i = j;
} }
// NOTICE: string is not freed, because paths are not copied. // 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); line = TrimLeft(line);
if (line[0] == L'#' || line[0] == 0) { if (line[0] == L'#' || line[0] == 0) {
return; return;
@@ -152,7 +152,7 @@ void ReadConfigLine(struct HackBGRT_config* config, EFI_FILE_HANDLE root_dir, co
return; return;
} }
if (StrnCmp(line, L"config=", 7) == 0) { if (StrnCmp(line, L"config=", 7) == 0) {
ReadConfigFile(config, root_dir, line + 7); ReadConfigFile(config, base_dir, line + 7);
return; return;
} }
if (StrnCmp(line, L"resolution=", 11) == 0) { if (StrnCmp(line, L"resolution=", 11) == 0) {

View File

@@ -39,17 +39,17 @@ struct HackBGRT_config {
* Read a configuration parameter. (May recursively read config files.) * Read a configuration parameter. (May recursively read config files.)
* *
* @param config The configuration to modify. * @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. * @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.) * Read a configuration file. (May recursively read more files.)
* *
* @param config The configuration to modify. * @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. * @param path The path to the file.
* @return FALSE, if the file couldn't be read, TRUE otherwise. * @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);

View File

@@ -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. * Load a bitmap or generate a black one.
* *
* @param root_dir The root directory for loading a BMP. * @param base_dir The directory for loading a BMP.
* @param path The BMP path within the root directory; NULL for a black BMP. * @param path The BMP path within the directory; NULL for a black BMP.
* @return The loaded BMP, or 0 if not available. * @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) { if (!path) {
return MakeBMP(1, 1, 0, 0, 0); // empty path = black image return MakeBMP(1, 1, 0, 0, 0); // empty path = black image
} }
Log(config.debug, L"Loading %s.\n", path); Log(config.debug, L"Loading %s.\n", path);
UINTN size = 0; UINTN size = 0;
BMP* bmp = LoadFile(root_dir, path, &size); BMP* bmp = LoadFile(base_dir, path, &size);
if (bmp) { if (bmp) {
if (size >= bmp->file_size if (size >= bmp->file_size
&& CompareMem(bmp, "BM", 2) == 0 && CompareMem(bmp, "BM", 2) == 0
@@ -299,9 +299,9 @@ static void CropBMP(BMP* bmp, int w, int h) {
/** /**
* The main logic for BGRT modification. * 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. // REMOVE: simply delete all BGRT entries.
if (config.action == HackBGRT_REMOVE) { if (config.action == HackBGRT_REMOVE) {
HandleAcpiTables(config.action, 0); HandleAcpiTables(config.action, 0);
@@ -352,7 +352,7 @@ void HackBgrt(EFI_FILE_HANDLE root_dir) {
// Get the image (either old or new). // Get the image (either old or new).
BMP* new_bmp = old_bmp; BMP* new_bmp = old_bmp;
if (config.action == HackBGRT_REPLACE) { 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. // 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; 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; 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) { 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"; const CHAR16* config_path = L"config.txt";
if (!ReadConfigFile(&config, root_dir, config_path)) { if (!ReadConfigFile(&config, base_dir, config_path)) {
Log(1, L"No config, no command line!\n", config_path); Log(1, L"No config, no command line!\n", config_path);
goto fail; 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; CHAR16 **argv = shell_param_proto->Argv;
int argc = shell_param_proto->Argc; int argc = shell_param_proto->Argc;
for (int i = 1; i < argc; ++i) { 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); SetResolution(config.resolution_x, config.resolution_y);
HackBgrt(root_dir); HackBgrt(base_dir);
EFI_HANDLE next_image_handle = 0; EFI_HANDLE next_image_handle = 0;
static CHAR16 backup_boot_path[] = L"\\EFI\\HackBGRT\\bootmgfw-original.efi"; static CHAR16 backup_boot_path[] = L"\\EFI\\HackBGRT\\bootmgfw-original.efi";