[BOOT:LIB] More work on efiinit.c
EfiInitpCreateApplicationEntry() is almost complete.
This commit is contained in:
parent
0743fa0106
commit
8f56881d02
@ -235,7 +235,8 @@ typedef struct {
|
||||
} BOOT_DEVICE, *PBOOT_DEVICE;
|
||||
|
||||
typedef enum {
|
||||
BCDE_DATA_TYPE_APPLICATION_DEVICE = 0x11000001
|
||||
BCDE_DATA_TYPE_APPLICATION_DEVICE = 0x11000001,
|
||||
BCDE_DATA_TYPE_APPLICATION_PATH = 0x22000002
|
||||
} BCDE_DATA_TYPE;
|
||||
|
||||
typedef struct {
|
||||
|
@ -16,6 +16,7 @@ Abstract:
|
||||
#include <ntrtl.h>
|
||||
#include <string.h>
|
||||
#include <wchar.h>
|
||||
#include "bootlib.h"
|
||||
#include "bootmgr.h"
|
||||
#include "efi.h"
|
||||
|
||||
@ -254,6 +255,46 @@ Return Value:
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
EfiInitpConvertEfiFilePath (
|
||||
IN EFI_DEVICE_PATH *EfiFilePath,
|
||||
IN BCDE_DATA_TYPE OptionType,
|
||||
IN OUT PBOOT_APPLICATION_ENTRY_OPTION Option,
|
||||
IN ULONG BufferSize
|
||||
)
|
||||
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Converts an EFI file path into BCD format.
|
||||
|
||||
Arguments:
|
||||
|
||||
EfiFilePath - The EFI file path to be converted.
|
||||
|
||||
OptionType - The data type to be assigned to option.
|
||||
|
||||
Option - Pointer to the destination option structure.
|
||||
|
||||
BufferSize - The amount of available space in the buffer.
|
||||
|
||||
Return Value:
|
||||
|
||||
STATUS_SUCCESS if successful.
|
||||
other NTSTATUS value if failure occurs.
|
||||
|
||||
--*/
|
||||
|
||||
{
|
||||
(VOID)EfiFilePath;
|
||||
(VOID)OptionType;
|
||||
(VOID)Option;
|
||||
(VOID)BufferSize;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
EfiInitpCreateApplicationEntry (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable,
|
||||
@ -304,11 +345,11 @@ Return Value:
|
||||
|
||||
{
|
||||
NTSTATUS Status;
|
||||
ULONG BufferRemaining;
|
||||
ULONG BufferRemaining, OptionsSize, Size;
|
||||
PWCHAR BcdOptionString;
|
||||
BOOLEAN BcdIdentifierSet;
|
||||
UNICODE_STRING UnicodeString;
|
||||
PBOOT_APPLICATION_ENTRY_OPTION Option;
|
||||
PBOOT_APPLICATION_ENTRY_OPTION Option, PrevOption;
|
||||
PBCDE_DEVICE BootDeviceElement;
|
||||
|
||||
(VOID)SystemTable;
|
||||
@ -318,6 +359,7 @@ Return Value:
|
||||
|
||||
*BufferUsed = 0;
|
||||
*BootDevice = NULL;
|
||||
OptionsSize = 0;
|
||||
BcdIdentifierSet = FALSE;
|
||||
|
||||
//
|
||||
@ -328,6 +370,13 @@ Return Value:
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Set up application entry structure.
|
||||
//
|
||||
RtlZeroMemory(Entry, sizeof(BOOT_APPLICATION_ENTRY));
|
||||
Entry->Signature = BOOT_APPLICATION_ENTRY_SIGNATURE;
|
||||
BufferRemaining -= FIELD_OFFSET(BOOT_APPLICATION_ENTRY, Options);
|
||||
|
||||
//
|
||||
// Terminate load options string.
|
||||
//
|
||||
@ -336,13 +385,6 @@ Return Value:
|
||||
LoadOptions[LoadOptionsSize - 1] = L'\0';
|
||||
}
|
||||
|
||||
//
|
||||
// Set up application entry structure.
|
||||
//
|
||||
RtlZeroMemory(Entry, sizeof(BOOT_APPLICATION_ENTRY));
|
||||
Entry->Signature = BOOT_APPLICATION_ENTRY_SIGNATURE;
|
||||
*BufferUsed = sizeof(BOOT_APPLICATION_ENTRY);
|
||||
|
||||
//
|
||||
// Parse BCD GUID if present.
|
||||
//
|
||||
@ -361,20 +403,44 @@ Return Value:
|
||||
// Convert the EFI device path into a boot device option.
|
||||
//
|
||||
Option = &Entry->Options;
|
||||
BufferRemaining -= FIELD_OFFSET(BOOT_APPLICATION_ENTRY, Options);
|
||||
Status = EfiInitpConvertEfiDevicePath(EfiDevicePath, BCDE_DATA_TYPE_APPLICATION_DEVICE, Option, BufferRemaining);
|
||||
if (!NT_SUCCESS(Status)) {
|
||||
Option->IsInvalid = TRUE;
|
||||
*BufferUsed = sizeof(BOOT_APPLICATION_ENTRY_OPTION);
|
||||
return;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
BootDeviceElement = (PBCDE_DEVICE)((PUCHAR)Option + Option->DataOffset);
|
||||
*BootDevice = &BootDeviceElement->Device;
|
||||
Size = BlGetBootOptionSize(Option);
|
||||
OptionsSize += Size;
|
||||
BufferRemaining -= Size;
|
||||
|
||||
//
|
||||
// TODO: This routine is not fully implemented.
|
||||
// Convert the EFI file path into a boot file path option.
|
||||
// TODO: UDP/PXE boot is not supported.
|
||||
//
|
||||
PrevOption = Option;
|
||||
Option = (PBOOT_APPLICATION_ENTRY_OPTION)((PUCHAR)&Entry->Options + OptionsSize);
|
||||
Status = EfiInitpConvertEfiFilePath(EfiFilePath, BCDE_DATA_TYPE_APPLICATION_PATH, Option, BufferRemaining);
|
||||
if (!NT_SUCCESS(Status)) {
|
||||
goto exit;
|
||||
}
|
||||
PrevOption->NextOptionOffset = (PUCHAR)Option - (PUCHAR)&Entry->Options;
|
||||
Size = BlGetBootOptionSize(Option);
|
||||
OptionsSize += Size;
|
||||
BufferRemaining -= Size;
|
||||
|
||||
//
|
||||
// TODO: This section is incomplete.
|
||||
//
|
||||
PrevOption = Option;
|
||||
Option = (PBOOT_APPLICATION_ENTRY_OPTION)((PUCHAR)&Entry->Options + OptionsSize);
|
||||
// Status = Unknown(LoadOptions, &Entry->Options, RemainingSize, &OptionsSize, &PrevOption, &Size);
|
||||
if (!NT_SUCCESS(Status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
exit:
|
||||
*BufferUsed = BufferSize - BufferRemaining;
|
||||
}
|
||||
|
||||
PBOOT_INPUT_PARAMETERS
|
||||
|
Loading…
x
Reference in New Issue
Block a user