Implement and use BlGetEfiPath() routine to get valid EFI path
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 28s
Builds / ExectOS (i686) (push) Successful in 27s

This commit is contained in:
Rafal Kupiec 2024-01-23 20:56:58 +01:00
parent 9f739df595
commit 269858f5a1
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
4 changed files with 65 additions and 0 deletions

View File

@ -105,6 +105,7 @@ typedef struct _XTBL_BOOT_PARAMETERS
{ {
PEFI_DEVICE_PATH_PROTOCOL DevicePath; PEFI_DEVICE_PATH_PROTOCOL DevicePath;
PWCHAR ArcName; PWCHAR ArcName;
PWCHAR EfiPath;
PWCHAR SystemPath; PWCHAR SystemPath;
PWCHAR SystemType; PWCHAR SystemType;
PWCHAR KernelFile; PWCHAR KernelFile;

View File

@ -130,6 +130,11 @@ XTCDECL
PWCHAR PWCHAR
BlGetConfigValue(IN CONST PWCHAR ConfigName); BlGetConfigValue(IN CONST PWCHAR ConfigName);
XTCDECL
EFI_STATUS
BlGetEfiPath(IN PWCHAR SystemPath,
OUT PWCHAR *EfiPath);
XTCDECL XTCDECL
EFI_STATUS EFI_STATUS
BlGetMemoryMap(OUT PEFI_MEMORY_MAP MemoryMap); BlGetMemoryMap(OUT PEFI_MEMORY_MAP MemoryMap);

View File

@ -276,6 +276,56 @@ BlFindVolumeDevicePath(IN PEFI_DEVICE_PATH_PROTOCOL FsHandle,
return STATUS_EFI_SUCCESS; return STATUS_EFI_SUCCESS;
} }
/**
* Creates a copy of the system path with EFI standard directory separators.
*
* @param SystemPath
* Supplies a pointer to the system path.
*
* @param EfiPath
* Supplies a pointer to the memory area, where EFI path will be stored.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTCDECL
EFI_STATUS
BlGetEfiPath(IN PWCHAR SystemPath,
OUT PWCHAR *EfiPath)
{
SIZE_T Index, PathLength;
EFI_STATUS Status;
/* Get system path length */
PathLength = RtlWideStringLength(SystemPath, 0);
/* Allocate memory for storing EFI path */
Status = BlAllocateMemoryPool(sizeof(WCHAR) * (PathLength + 1), (PVOID *)EfiPath);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to allocate memory, print error message and return status code */
BlDebugPrint(L"ERROR: Memory allocation failure (Status Code: 0x%lx)\n", Status);
return STATUS_EFI_OUT_OF_RESOURCES;
}
/* Make a copy of SystemPath string */
RtlCopyMemory(*EfiPath, SystemPath, sizeof(WCHAR) * (PathLength + 1));
/* Replace directory separator if needed to comply with EFI standard */
for(Index = 0; Index < PathLength; Index++)
{
if((*EfiPath)[Index] == L'/')
{
/* Replace '/' with '\' */
(*EfiPath)[Index] = L'\\';
}
}
/* Return success */
return STATUS_EFI_SUCCESS;
}
/** /**
* Finds a volume device path based on the specified ARC name or UUID. * Finds a volume device path based on the specified ARC name or UUID.
* *

View File

@ -227,6 +227,15 @@ BlInvokeBootProtocol(IN PLIST_ENTRY OptionsList)
BlDebugPrint(L"ERROR: Failed to find volume device path (Status Code: 0x%lx)\n", Status); BlDebugPrint(L"ERROR: Failed to find volume device path (Status Code: 0x%lx)\n", Status);
return Status; return Status;
} }
/* Get EFI compatible system path */
Status = BlGetEfiPath(BootParameters.SystemPath, &BootParameters.EfiPath);
if(Status != STATUS_EFI_SUCCESS)
{
/* Failed to get EFI path */
BlDebugPrint(L"ERROR: Failed to get EFI path (Status Code: 0x%lx)\n", Status);
return Status;
}
} }
else if(RtlCompareWideStringInsensitive(Option->Name, L"KERNELFILE", 0) == 0) else if(RtlCompareWideStringInsensitive(Option->Name, L"KERNELFILE", 0) == 0)
{ {