mirror of
https://github.com/Metabolix/HackBGRT.git
synced 2025-12-06 17:15:42 -08:00
Try to load config.txt from the current dir
To allow multiple configurations for HackBGRT, or to allow a custom installation path, try to load config.txt from the same directory as the executable.
This commit is contained in:
@@ -71,6 +71,8 @@ If you need it for other systems as well:
|
|||||||
|
|
||||||
To install purely on Linux, you can install with `setup.exe dry-run` and then manually copy files from `dry-run/EFI` to your `[EFI System Partition]/EFI`. For further instructions, consult the documentation of your own Linux system.
|
To install purely on Linux, you can install with `setup.exe dry-run` and then manually copy files from `dry-run/EFI` to your `[EFI System Partition]/EFI`. For further instructions, consult the documentation of your own Linux system.
|
||||||
|
|
||||||
|
HackBGRT tries to read its configuration from the same directory where it's installed, so you can even make (manually) multiple installations in different directories.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
The configuration options are described in `config.txt`, which the installer copies into `[EFI System Partition]\EFI\HackBGRT\config.txt`.
|
The configuration options are described in `config.txt`, which the installer copies into `[EFI System Partition]\EFI\HackBGRT\config.txt`.
|
||||||
|
|||||||
27
src/efi.c
27
src/efi.c
@@ -64,6 +64,33 @@ EFI_DEVICE_PATH *FileDevicePath(IN EFI_HANDLE Device OPTIONAL, IN CHAR16 *FileNa
|
|||||||
return new_path;
|
return new_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CHAR16 *DevicePathToStr(EFI_DEVICE_PATH *DevPath) {
|
||||||
|
UINTN path_length = 0;
|
||||||
|
for (EFI_DEVICE_PATH *p0 = DevPath;; p0 = NextDevicePathNode(p0)) {
|
||||||
|
if (DevicePathType(p0) != MEDIA_DEVICE_PATH || DevicePathSubType(p0) != MEDIA_FILEPATH_DP) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
path_length += DevicePathNodeLength(p0) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
CHAR16* str;
|
||||||
|
UINTN size_str = (path_length + 1) * sizeof(*str);
|
||||||
|
|
||||||
|
if (!path_length || EFI_ERROR(BS->AllocatePool(EfiBootServicesData, size_str, (void**)&str))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINTN pos = 0;
|
||||||
|
for (EFI_DEVICE_PATH *p0 = DevPath; pos < path_length; p0 = NextDevicePathNode(p0)) {
|
||||||
|
FILEPATH_DEVICE_PATH *f = (FILEPATH_DEVICE_PATH *) p0;
|
||||||
|
BS->CopyMem(str + pos, f->PathName, StrLen(f->PathName) * sizeof(*str));
|
||||||
|
pos += DevicePathNodeLength(p0) + 1;
|
||||||
|
str[pos - 1] = L'\\';
|
||||||
|
}
|
||||||
|
str[pos - 1] = 0;
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
INTN CompareMem(IN CONST VOID *Dest, IN CONST VOID *Src, IN UINTN len) {
|
INTN CompareMem(IN CONST VOID *Dest, IN CONST VOID *Src, IN UINTN len) {
|
||||||
CONST UINT8 *d = Dest, *s = Src;
|
CONST UINT8 *d = Dest, *s = Src;
|
||||||
for (UINTN i = 0; i < len; ++i) {
|
for (UINTN i = 0; i < len; ++i) {
|
||||||
|
|||||||
31
src/main.c
31
src/main.c
@@ -439,16 +439,39 @@ EFI_STATUS EFIAPI efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *ST_) {
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_FILE_HANDLE base_dir;
|
CHAR16* default_dir_path = L"\\EFI\\HackBGRT";
|
||||||
if (EFI_ERROR(root_dir->Open(root_dir, &base_dir, L"\\EFI\\HackBGRT", EFI_FILE_MODE_READ, 0))) {
|
Log(config.debug, L"Default directory: %s\n", default_dir_path);
|
||||||
Log(config.debug, L"Failed to HackBGRT directory.\n");
|
EFI_FILE_HANDLE default_dir;
|
||||||
base_dir = root_dir;
|
if (EFI_ERROR(root_dir->Open(root_dir, &default_dir, default_dir_path, EFI_FILE_MODE_READ, 0))) {
|
||||||
|
Log(config.debug, L"Failed to open HackBGRT default directory.\n");
|
||||||
|
default_dir = root_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CHAR16* working_dir_path = DevicePathToStr(image->FilePath);
|
||||||
|
for (int i = StrLen(working_dir_path), skipped_last_component = 0; i--;) {
|
||||||
|
if (working_dir_path[i] == L'/' || working_dir_path[i] == L'\\') {
|
||||||
|
working_dir_path[i] = skipped_last_component++ ? L'\\' : L'\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Log(config.debug, L"Working directory: %s\n", working_dir_path);
|
||||||
|
EFI_FILE_HANDLE working_dir;
|
||||||
|
if (EFI_ERROR(root_dir->Open(root_dir, &working_dir, working_dir_path, EFI_FILE_MODE_READ, 0))) {
|
||||||
|
Log(config.debug, L"Failed to open HackBGRT working directory.\n");
|
||||||
|
working_dir = default_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_FILE_HANDLE base_dir = working_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"config.txt";
|
const CHAR16* config_path = L"config.txt";
|
||||||
|
retry_read_config:
|
||||||
if (!ReadConfigFile(&config, base_dir, config_path)) {
|
if (!ReadConfigFile(&config, base_dir, config_path)) {
|
||||||
|
if (base_dir != default_dir && StrCmp(default_dir_path, working_dir_path) != 0) {
|
||||||
|
base_dir = default_dir;
|
||||||
|
Log(config.debug, L"Trying the default directory.\n");
|
||||||
|
goto retry_read_config;
|
||||||
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user