Compare commits

...

3 Commits

Author SHA1 Message Date
7125a17aca [BOOT:LIB] Refactor bootlib.c
InitializeLibary() now saves parameters data in
BlpApplicationParameters, BlpApplicationEntry, and BlpBootDevice.
Moved BlGetBootOptionSize() and BlGetBootOptionListSize() to bootopt.c
2024-08-25 10:55:20 -04:00
de9501aee9 [BOOT:LIB] Do some renaming
BOOT_APPLICATION_ENTRY_OPTION -> BOOT_APPLICATION_OPTION
BOOT_APPLICATION_ENTRY -> BOOT_INPUT_APPLICATION_ENTRY
2024-08-25 10:49:44 -04:00
e61d0f5155 [BOOT:BOOTMGR] Begin work on BCD support
Added stub for BmOpenDataStore()
2024-08-25 10:43:48 -04:00
7 changed files with 217 additions and 114 deletions

View File

@ -0,0 +1,56 @@
/*++
Copyright (c) 2024, Quinn Stephens.
Provided under the BSD 3-Clause license.
Module Name:
bcd.c
Abstract:
BCD (Boot Configuration Data, aka Boot Data Store) routines.
--*/
#include "bootlib.h"
NTSTATUS
BmOpenDataStore (
IN OUT PHANDLE DataStore
)
/*++
Routine Description:
Opens the boot configuration data store.
Arguments:
DataStore - pointer to memory to put the data store handle in.
Return Value:
STATUS_SUCCESS if successful,
Other NTSTATUS value on failure.
--*/
{
*DataStore = INVALID_HANDLE_VALUE;
/*
NTSTATUS Status;
PBOOT_DEVICE Device;
PWSTR FilePath;
BOOLEAN FilePathSet;
Device = NULL;
FilePath = NULL;
FilePathSet = FALSE;
return BmGetDataStorePath(&Device, &FilePath, &FilePathSet);
*/
return STATUS_SUCCESS;
}

View File

@ -41,6 +41,7 @@ Return Value:
{ {
NTSTATUS Status; NTSTATUS Status;
BOOT_LIBRARY_PARAMETERS LibraryParameters; BOOT_LIBRARY_PARAMETERS LibraryParameters;
HANDLE DataStore;
LibraryParameters.Flags = 0; LibraryParameters.Flags = 0;
@ -53,6 +54,11 @@ Return Value:
goto Exit; goto Exit;
} }
//
// Open the boot data store.
//
(VOID)BmOpenDataStore(&DataStore);
Exit: Exit:
BlDestroyLibrary(); BlDestroyLibrary();
return Status; return Status;

View File

@ -36,12 +36,12 @@ ConsolePrintf (
ULONG ULONG
BlGetBootOptionSize ( BlGetBootOptionSize (
IN PBOOT_APPLICATION_ENTRY_OPTION Option IN PBOOT_APPLICATION_OPTION Option
); );
ULONG ULONG
BlGetBootOptionListSize ( BlGetBootOptionListSize (
IN PBOOT_APPLICATION_ENTRY_OPTION Options IN PBOOT_APPLICATION_OPTION Options
); );
NTSTATUS NTSTATUS

View File

@ -78,18 +78,24 @@ typedef struct {
ULONG NextOptionOffset; ULONG NextOptionOffset;
BOOLEAN IsInvalid; BOOLEAN IsInvalid;
UCHAR Unknown[3]; UCHAR Unknown[3];
} BOOT_APPLICATION_ENTRY_OPTION, *PBOOT_APPLICATION_ENTRY_OPTION; } BOOT_APPLICATION_OPTION, *PBOOT_APPLICATION_OPTION;
#define BOOT_APPLICATION_ENTRY_SIGNATURE 0x544e4550415442 /* "BTAPENT" */ #define BOOT_INPUT_APPLICATION_ENTRY_SIGNATURE 0x544e4550415442 /* "BTAPENT" */
#define BOOT_APPLICATION_ENTRY_NO_BCD_IDENTIFIER 0x01 #define BOOT_INPUT_APPLICATION_ENTRY_NO_BCD_IDENTIFIER 0x01
typedef struct { typedef struct {
ULONGLONG Signature; ULONGLONG Signature;
ULONG Attributes; ULONG Attributes;
GUID BcdIdentifier; GUID BcdIdentifier;
UCHAR Unknown[16]; UCHAR Unknown[16];
BOOT_APPLICATION_ENTRY_OPTION Options; BOOT_APPLICATION_OPTION Options;
} BOOT_INPUT_APPLICATION_ENTRY, *PBOOT_INPUT_APPLICATION_ENTRY;
typedef struct {
ULONG Attributes;
GUID BcdIdentifier;
PBOOT_APPLICATION_OPTION Options;
} BOOT_APPLICATION_ENTRY, *PBOOT_APPLICATION_ENTRY; } BOOT_APPLICATION_ENTRY, *PBOOT_APPLICATION_ENTRY;
#define BOOT_MEMORY_INFO_VERSION 1 #define BOOT_MEMORY_INFO_VERSION 1
@ -244,6 +250,11 @@ typedef struct {
BOOT_DEVICE Device; BOOT_DEVICE Device;
} BCDE_DEVICE, *PBCDE_DEVICE; } BCDE_DEVICE, *PBCDE_DEVICE;
NTSTATUS
BmOpenDataStore (
IN OUT PHANDLE DataStore
);
NTSTATUS NTSTATUS
BmMain ( BmMain (
IN PBOOT_INPUT_PARAMETERS InputParameters IN PBOOT_INPUT_PARAMETERS InputParameters

View File

@ -293,7 +293,7 @@ NTSTATUS
EfiInitpConvertEfiDevicePath ( EfiInitpConvertEfiDevicePath (
IN EFI_DEVICE_PATH *EfiDevicePath, IN EFI_DEVICE_PATH *EfiDevicePath,
IN BCDE_DATA_TYPE OptionType, IN BCDE_DATA_TYPE OptionType,
IN OUT PBOOT_APPLICATION_ENTRY_OPTION Option, IN OUT PBOOT_APPLICATION_OPTION Option,
IN ULONG BufferSize IN ULONG BufferSize
) )
@ -327,19 +327,19 @@ Return Value:
// //
// Check for available buffer space. // Check for available buffer space.
// //
if (BufferSize < sizeof(BOOT_APPLICATION_ENTRY_OPTION) + FIELD_OFFSET(BCDE_DEVICE, Device)) { if (BufferSize < sizeof(BOOT_APPLICATION_OPTION) + FIELD_OFFSET(BCDE_DEVICE, Device)) {
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
// //
// Translate device path. // Translate device path.
// //
RtlZeroMemory(Option, sizeof(BOOT_APPLICATION_ENTRY_OPTION)); RtlZeroMemory(Option, sizeof(BOOT_APPLICATION_OPTION));
DeviceElement = (PBCDE_DEVICE)((PUCHAR)Option + sizeof(BOOT_APPLICATION_ENTRY_OPTION)); DeviceElement = (PBCDE_DEVICE)((PUCHAR)Option + sizeof(BOOT_APPLICATION_OPTION));
Status = EfiInitTranslateDevicePath( Status = EfiInitTranslateDevicePath(
EfiDevicePath, EfiDevicePath,
&DeviceElement->Device, &DeviceElement->Device,
BufferSize - (sizeof(BOOT_APPLICATION_ENTRY_OPTION) + FIELD_OFFSET(BCDE_DEVICE, Device)) BufferSize - (sizeof(BOOT_APPLICATION_OPTION) + FIELD_OFFSET(BCDE_DEVICE, Device))
); );
if (!NT_SUCCESS(Status)) { if (!NT_SUCCESS(Status)) {
return Status; return Status;
@ -349,7 +349,7 @@ Return Value:
// Set up option structure. // Set up option structure.
// //
Option->Type = OptionType; Option->Type = OptionType;
Option->DataOffset = sizeof(BOOT_APPLICATION_ENTRY_OPTION); Option->DataOffset = sizeof(BOOT_APPLICATION_OPTION);
Option->DataSize = FIELD_OFFSET(BCDE_DEVICE, Device) + DeviceElement->Device.Size; Option->DataSize = FIELD_OFFSET(BCDE_DEVICE, Device) + DeviceElement->Device.Size;
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -359,7 +359,7 @@ NTSTATUS
EfiInitpConvertEfiFilePath ( EfiInitpConvertEfiFilePath (
IN EFI_DEVICE_PATH *EfiFilePath, IN EFI_DEVICE_PATH *EfiFilePath,
IN BCDE_DATA_TYPE OptionType, IN BCDE_DATA_TYPE OptionType,
IN OUT PBOOT_APPLICATION_ENTRY_OPTION Option, IN OUT PBOOT_APPLICATION_OPTION Option,
IN ULONG BufferSize IN ULONG BufferSize
) )
@ -395,22 +395,22 @@ Return Value:
// //
// Check for available buffer space. // Check for available buffer space.
// //
if (BufferSize < sizeof(BOOT_APPLICATION_ENTRY_OPTION)) { if (BufferSize < sizeof(BOOT_APPLICATION_OPTION)) {
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
// //
// Set up option structure. // Set up option structure.
// //
RtlZeroMemory(Option, sizeof(BOOT_APPLICATION_ENTRY_OPTION)); RtlZeroMemory(Option, sizeof(BOOT_APPLICATION_OPTION));
Option->Type = OptionType; Option->Type = OptionType;
Option->DataOffset = sizeof(BOOT_APPLICATION_ENTRY_OPTION); Option->DataOffset = sizeof(BOOT_APPLICATION_OPTION);
// //
// Add to the path one file path node at a time. // Add to the path one file path node at a time.
// //
Option->DataSize = 0; Option->DataSize = 0;
BufferRemaining = BufferSize - sizeof(BOOT_APPLICATION_ENTRY_OPTION); BufferRemaining = BufferSize - sizeof(BOOT_APPLICATION_OPTION);
Node = EfiFilePath; Node = EfiFilePath;
PathStart = (PWCHAR)((PUCHAR)Option + Option->DataOffset); PathStart = (PWCHAR)((PUCHAR)Option + Option->DataOffset);
Position = PathStart; Position = PathStart;
@ -458,7 +458,7 @@ Return Value:
VOID VOID
EfiInitpCreateApplicationEntry ( EfiInitpCreateApplicationEntry (
IN EFI_SYSTEM_TABLE *SystemTable, IN EFI_SYSTEM_TABLE *SystemTable,
IN OUT PBOOT_APPLICATION_ENTRY Entry, IN OUT PBOOT_INPUT_APPLICATION_ENTRY Entry,
IN ULONG BufferSize, IN ULONG BufferSize,
IN EFI_DEVICE_PATH *EfiDevicePath, IN EFI_DEVICE_PATH *EfiDevicePath,
IN EFI_DEVICE_PATH *EfiFilePath, IN EFI_DEVICE_PATH *EfiFilePath,
@ -509,7 +509,7 @@ Return Value:
PWCHAR BcdOptionString; PWCHAR BcdOptionString;
BOOLEAN BcdIdentifierSet; BOOLEAN BcdIdentifierSet;
UNICODE_STRING UnicodeString; UNICODE_STRING UnicodeString;
PBOOT_APPLICATION_ENTRY_OPTION Option, PrevOption; PBOOT_APPLICATION_OPTION Option, PrevOption;
PBCDE_DEVICE BootDeviceElement; PBCDE_DEVICE BootDeviceElement;
(VOID)SystemTable; (VOID)SystemTable;
@ -526,16 +526,16 @@ Return Value:
// Require enough space for the application entry. // Require enough space for the application entry.
// //
BufferRemaining = BufferSize; BufferRemaining = BufferSize;
if (BufferRemaining < sizeof(BOOT_APPLICATION_ENTRY)) { if (BufferRemaining < sizeof(BOOT_INPUT_APPLICATION_ENTRY)) {
return; return;
} }
// //
// Set up application entry structure. // Set up application entry structure.
// //
RtlZeroMemory(Entry, sizeof(BOOT_APPLICATION_ENTRY)); RtlZeroMemory(Entry, sizeof(BOOT_INPUT_APPLICATION_ENTRY));
Entry->Signature = BOOT_APPLICATION_ENTRY_SIGNATURE; Entry->Signature = BOOT_INPUT_APPLICATION_ENTRY_SIGNATURE;
BufferRemaining -= FIELD_OFFSET(BOOT_APPLICATION_ENTRY, Options); BufferRemaining -= FIELD_OFFSET(BOOT_INPUT_APPLICATION_ENTRY, Options);
// //
// Terminate load options string. // Terminate load options string.
@ -556,7 +556,7 @@ Return Value:
} }
if (!BcdIdentifierSet) { if (!BcdIdentifierSet) {
Entry->Attributes |= BOOT_APPLICATION_ENTRY_NO_BCD_IDENTIFIER; Entry->Attributes |= BOOT_INPUT_APPLICATION_ENTRY_NO_BCD_IDENTIFIER;
} }
// //
@ -579,7 +579,7 @@ Return Value:
// TODO: UDP/PXE boot is not supported. // TODO: UDP/PXE boot is not supported.
// //
PrevOption = Option; PrevOption = Option;
Option = (PBOOT_APPLICATION_ENTRY_OPTION)((PUCHAR)&Entry->Options + OptionsSize); Option = (PBOOT_APPLICATION_OPTION)((PUCHAR)&Entry->Options + OptionsSize);
Status = EfiInitpConvertEfiFilePath(EfiFilePath, BCDE_DATA_TYPE_APPLICATION_PATH, Option, BufferRemaining); Status = EfiInitpConvertEfiFilePath(EfiFilePath, BCDE_DATA_TYPE_APPLICATION_PATH, Option, BufferRemaining);
if (!NT_SUCCESS(Status)) { if (!NT_SUCCESS(Status)) {
goto exit; goto exit;
@ -593,7 +593,7 @@ Return Value:
// TODO: This section is incomplete. // TODO: This section is incomplete.
// //
PrevOption = Option; PrevOption = Option;
Option = (PBOOT_APPLICATION_ENTRY_OPTION)((PUCHAR)&Entry->Options + OptionsSize); Option = (PBOOT_APPLICATION_OPTION)((PUCHAR)&Entry->Options + OptionsSize);
// Status = Unknown(LoadOptions, &Entry->Options, RemainingSize, &OptionsSize, &PrevOption, &Size); // Status = Unknown(LoadOptions, &Entry->Options, RemainingSize, &OptionsSize, &PrevOption, &Size);
if (!NT_SUCCESS(Status)) { if (!NT_SUCCESS(Status)) {
goto exit; goto exit;
@ -712,7 +712,7 @@ Return Value:
InputParameters->ApplicationEntryOffset = ScratchUsed; InputParameters->ApplicationEntryOffset = ScratchUsed;
EfiInitpCreateApplicationEntry( EfiInitpCreateApplicationEntry(
SystemTable, SystemTable,
(PBOOT_APPLICATION_ENTRY)(&EfiInitScratch[ScratchUsed]), (PBOOT_INPUT_APPLICATION_ENTRY)(&EfiInitScratch[ScratchUsed]),
sizeof(EfiInitScratch) - ScratchUsed, sizeof(EfiInitScratch) - ScratchUsed,
DevicePath, DevicePath,
LoadedImage->FilePath, LoadedImage->FilePath,

View File

@ -13,6 +13,7 @@ Abstract:
--*/ --*/
#include <ntrtl.h>
#include "bootlib.h" #include "bootlib.h"
// //
@ -25,83 +26,9 @@ Abstract:
sizeof(BOOT_RETURN_DATA) \ sizeof(BOOT_RETURN_DATA) \
) )
ULONG PBOOT_INPUT_PARAMETERS BlpApplicationParameters;
BlGetBootOptionListSize ( BOOT_APPLICATION_ENTRY BlpApplicationEntry;
IN PBOOT_APPLICATION_ENTRY_OPTION Options PBOOT_DEVICE BlpBootDevice;
);
ULONG
BlGetBootOptionSize (
IN PBOOT_APPLICATION_ENTRY_OPTION Option
)
/*++
Routine Description:
Gets the size of a boot option.
Arguments:
Option - the boot option to get the size of.
Return Value:
The size of the option.
--*/
{
ULONG TotalSize;
if (Option->DataOffset != 0) {
TotalSize = Option->DataOffset + Option->DataSize;
} else {
TotalSize = sizeof(BOOT_APPLICATION_ENTRY_OPTION);
}
if (Option->OtherOptionsOffset != 0) {
TotalSize += BlGetBootOptionListSize((PBOOT_APPLICATION_ENTRY_OPTION)((PUCHAR)Option + Option->OtherOptionsOffset));
}
return TotalSize;
}
ULONG
BlGetBootOptionListSize (
IN PBOOT_APPLICATION_ENTRY_OPTION Options
)
/*++
Routine Description:
Gets the total size of a list boot options.
Arguments:
Options - the boot option list to get the size of.
Return Value:
The size of the options.
--*/
{
ULONG TotalSize, NextOffset;
PBOOT_APPLICATION_ENTRY_OPTION Option;
TotalSize = 0;
NextOffset = 0;
do {
Option = (PBOOT_APPLICATION_ENTRY_OPTION)((PUCHAR)Options + NextOffset);
NextOffset = Option->NextOptionOffset;
TotalSize += BlGetBootOptionSize(Option);
} while (NextOffset != 0);
return TotalSize;
}
NTSTATUS NTSTATUS
InitializeLibrary ( InitializeLibrary (
@ -129,11 +56,10 @@ Return Value:
{ {
NTSTATUS Status; NTSTATUS Status;
PBOOT_APPLICATION_ENTRY ApplicationEntry; PBOOT_INPUT_APPLICATION_ENTRY ApplicationEntry;
PBOOT_DEVICE BootDevice;
PBOOT_FIRMWARE_DATA FirmwareData; PBOOT_FIRMWARE_DATA FirmwareData;
PBOOT_BLOCK_IDENTIFIER BlockDevice; PBOOT_BLOCK_IDENTIFIER BlockDevice;
PBOOT_APPLICATION_ENTRY_OPTION Option; PBOOT_APPLICATION_OPTION Option;
(VOID)LibraryParameters; (VOID)LibraryParameters;
@ -149,8 +75,8 @@ Return Value:
// //
// Calculate structure addresses from offsets. // Calculate structure addresses from offsets.
// //
ApplicationEntry = (PBOOT_APPLICATION_ENTRY)((PUCHAR)InputParameters + InputParameters->ApplicationEntryOffset); ApplicationEntry = (PBOOT_INPUT_APPLICATION_ENTRY)((PUCHAR)InputParameters + InputParameters->ApplicationEntryOffset);
BootDevice = (PBOOT_DEVICE)((PUCHAR)InputParameters + InputParameters->BootDeviceOffset); BlpBootDevice = (PBOOT_DEVICE)((PUCHAR)InputParameters + InputParameters->BootDeviceOffset);
FirmwareData = (PBOOT_FIRMWARE_DATA)((PUCHAR)InputParameters + InputParameters->FirmwareDataOffset); FirmwareData = (PBOOT_FIRMWARE_DATA)((PUCHAR)InputParameters + InputParameters->FirmwareDataOffset);
// //
@ -161,6 +87,21 @@ Return Value:
return Status; return Status;
} }
//
// Check application entry signature.
//
if (ApplicationEntry->Signature != BOOT_INPUT_APPLICATION_ENTRY_SIGNATURE) {
return STATUS_INVALID_PARAMETER_9;
}
//
// Save input parameters and application entry data.
//
BlpApplicationParameters = InputParameters;
BlpApplicationEntry.Attributes = ApplicationEntry->Attributes;
RtlCopyMemory(&BlpApplicationEntry.BcdIdentifier, &ApplicationEntry->BcdIdentifier, sizeof(GUID));
BlpApplicationEntry.Options = &ApplicationEntry->Options;
// //
// Print debug information. // Print debug information.
// //
@ -169,18 +110,18 @@ Return Value:
ConsolePrintf(L"Image size: %x\r\n", InputParameters->ImageSize); ConsolePrintf(L"Image size: %x\r\n", InputParameters->ImageSize);
ConsolePrint(L"Boot device type: "); ConsolePrint(L"Boot device type: ");
switch (BootDevice->Type) { switch (BlpBootDevice->Type) {
case BOOT_DEVICE_TYPE_PARTITION: case BOOT_DEVICE_TYPE_PARTITION:
ConsolePrint(L"partition\r\n"); ConsolePrint(L"partition\r\n");
BlockDevice = &BootDevice->Partition.Parent; BlockDevice = &BlpBootDevice->Partition.Parent;
break; break;
case BOOT_DEVICE_TYPE_PARTITION_EX: case BOOT_DEVICE_TYPE_PARTITION_EX:
ConsolePrint(L"partition\r\n"); ConsolePrint(L"partition\r\n");
BlockDevice = &BootDevice->PartitionEx.Parent; BlockDevice = &BlpBootDevice->PartitionEx.Parent;
break; break;
default: default:
ConsolePrint(L"generic block device\r\n"); ConsolePrint(L"generic block device\r\n");
BlockDevice = &BootDevice->Block; BlockDevice = &BlpBootDevice->Block;
break; break;
} }
@ -216,7 +157,7 @@ Return Value:
break; break;
} }
Option = (PBOOT_APPLICATION_ENTRY_OPTION)((PUCHAR)Option + Option->NextOptionOffset); Option = (PBOOT_APPLICATION_OPTION)((PUCHAR)Option + Option->NextOptionOffset);
} }
return STATUS_SUCCESS; return STATUS_SUCCESS;

View File

@ -0,0 +1,89 @@
/*++
Copyright (c) 2024, Quinn Stephens.
Provided under the BSD 3-Clause license.
Module Name:
bootopt.c
Abstract:
Provides boot option utilities.
--*/
#include "bootlib.h"
ULONG
BlGetBootOptionSize (
IN PBOOT_APPLICATION_OPTION Option
)
/*++
Routine Description:
Gets the size of a boot option.
Arguments:
Option - the boot option to get the size of.
Return Value:
The size of the option.
--*/
{
ULONG TotalSize;
if (Option->DataOffset != 0) {
TotalSize = Option->DataOffset + Option->DataSize;
} else {
TotalSize = sizeof(BOOT_APPLICATION_OPTION);
}
if (Option->OtherOptionsOffset != 0) {
TotalSize += BlGetBootOptionListSize((PBOOT_APPLICATION_OPTION)((PUCHAR)Option + Option->OtherOptionsOffset));
}
return TotalSize;
}
ULONG
BlGetBootOptionListSize (
IN PBOOT_APPLICATION_OPTION Options
)
/*++
Routine Description:
Gets the total size of a list boot options.
Arguments:
Options - the boot option list to get the size of.
Return Value:
The size of the options.
--*/
{
ULONG TotalSize, NextOffset;
PBOOT_APPLICATION_OPTION Option;
TotalSize = 0;
NextOffset = 0;
do {
Option = (PBOOT_APPLICATION_OPTION)((PUCHAR)Options + NextOffset);
NextOffset = Option->NextOptionOffset;
TotalSize += BlGetBootOptionSize(Option);
} while (NextOffset != 0);
return TotalSize;
}