#include "bootmgr.h"
+/* DATA VARIABLES ************************************************************/
+
+ULONGLONG ApplicationStartTime;
+ULONGLONG PostTime;
+
/* FUNCTIONS *****************************************************************/
/*++
NTSTATUS Status;
BL_LIBRARY_PARAMETERS LibraryParameters;
+ EarlyPrint(L"ReactOS UEFI Boot Manager Initializing...\n");
+
+ /* Save the start/end-of-POST time */
+ ApplicationStartTime = __rdtsc();
+ PostTime = ApplicationStartTime;
+
+ /* Setup the boot library parameters for this application */
+ BlSetupDefaultParameters(&LibraryParameters);
+ LibraryParameters.TranslationType = BlNone;
+ LibraryParameters.LibraryFlags = 0x400 | 0x8;
+ LibraryParameters.MinimumAllocationCount = 16;
+ LibraryParameters.MinimumHeapSize = 512 * 1024;
+
+ /* Initialize the boot library */
Status = BlInitializeLibrary(BootParameters, &LibraryParameters);
+ EarlyPrint(L"ReactOS UEFI Boot Manager Exiting: %lx\n", Status);
return Status;
}
/* Get the length of the file path string, avoiding overflow */
StringLength = DevicePathNodeLength(FilePath) -
FIELD_OFFSET(FILEPATH_DEVICE_PATH, PathName);
- if (StringLength < FIELD_OFFSET(FILEPATH_DEVICE_PATH, PathName))
+ if (StringLength < (ULONG)FIELD_OFFSET(FILEPATH_DEVICE_PATH, PathName))
{
Status = STATUS_INTEGER_OVERFLOW;
goto Quickie;
if (PathString == StringEntry->String)
{
/* Then this option is empty */
- Option->Failed = TRUE;
+ Option->Empty = TRUE;
}
/* Set the final size of the option */
RemainingSize = MaximumLength;
if (RemainingSize < sizeof(BL_APPLICATION_ENTRY))
{
+ EarlyPrint(L"Remaining size too small!\n");
Status = STATUS_INVALID_PARAMETER;
goto Quickie;
}
if (!NT_SUCCESS(Status))
{
/* We failed, so mark the option as such and return an empty one */
- Entry->BcdData.Failed = TRUE;
+ EarlyPrint(L"Failed to convert device path: %lx\n", Status);
+ Entry->BcdData.Empty = TRUE;
TotalOptionSize = sizeof(BL_BCD_OPTION);
goto Quickie;
}
{
/* lol */
Status = STATUS_NOT_IMPLEMENTED;
+ EarlyPrint(L"UDP Boot not supported!\n");
}
else
{
/* Bail out on failure */
if (!NT_SUCCESS(Status))
{
+ EarlyPrint(L"Failed to convert file path: %lx\n", Status);
goto Quickie;
}
RemainingSize);
if (!NT_SUCCESS(Status))
{
+ EarlyPrint(L"Failed to convert OS device path: %lx\n", Status);
goto Quickie;
}
RemainingSize);
if (!NT_SUCCESS(Status))
{
+ EarlyPrint(L"Failed to convert OS file path: %lx\n", Status);
goto Quickie;
}
(VOID**)&LoadedImage);
if (Status != EFI_SUCCESS)
{
- SystemTable->ConOut->OutputString(SystemTable->ConsoleOutHandle,
- L"Loaded image failed\n");
+ EarlyPrint(L"Loaded image failed: %lx\n", Status);
return NULL;
}
EfiInitScratch.ImageSize = (ULONG)LoadedImage->ImageSize;
/* Now grab our device path protocol, so we can convert the path later on */
- Status = BootServices->HandleProtocol(ImageHandle,
+ Status = BootServices->HandleProtocol(LoadedImage->DeviceHandle,
&EfiDevicePathProtocol,
(VOID**)&DevicePath);
if (Status != EFI_SUCCESS)
{
- SystemTable->ConOut->OutputString(SystemTable->ConsoleOutHandle,
- L"Device path failed\n");
+ EarlyPrint(L"Device Path failed: %lx\n", Status);
return NULL;
}
*
*--*/
EFI_STATUS
+EFIAPI
EfiEntry (
_In_ EFI_HANDLE ImageHandle,
_In_ EFI_SYSTEM_TABLE *SystemTable
{
NTSTATUS Status;
PBOOT_APPLICATION_PARAMETER_BLOCK BootParameters;
+ extern EFI_SYSTEM_TABLE *g_SystemTable;
/* Temporary debugging string */
- SystemTable->ConOut->OutputString(SystemTable->ConsoleOutHandle, L"Hello from EFI\n");
+ g_SystemTable = SystemTable;
/* Convert EFI parameters to Windows Boot Application parameters */
BootParameters = EfiInitCreateInputParametersEx(ImageHandle, SystemTable);
if (BootParameters != NULL)
{
/* Conversion was good -- call the Boot Manager Entrypoint */
- SystemTable->ConOut->OutputString(SystemTable->ConsoleOutHandle, L"EFI input OK!\n");
Status = BmMain(BootParameters);
}
else
{
/* Conversion failed, bail out */
- SystemTable->ConOut->OutputString(SystemTable->ConsoleOutHandle, L"EFI input failed\n");
+ EarlyPrint(L"EFI Input Conversion failed\n");
Status = STATUS_INVALID_PARAMETER;
}
#include <DevicePath.h>
#include <LoadedImage.h>
+VOID
+EarlyPrint(_In_ PWCHAR Format, ...);
+
/* DEFINES *******************************************************************/
#define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI 0x01
ULONG HeapAllocationAttributes;
PWCHAR ApplicationBaseDirectory;
ULONG DescriptorCount;
+ PWCHAR FontBaseDirectory;
} BL_LIBRARY_PARAMETERS, *PBL_LIBRARY_PARAMETERS;
/* This should eventually go into a more public header */
ULONG DataSize;
ULONG ListOffset;
ULONG NextEntryOffset;
- ULONG Failed;
+ ULONG Empty;
} BL_BCD_OPTION, *PBL_BCD_OPTION;
typedef struct _BL_APPLICATION_ENTRY
ULONG ContextFlags;
} BL_ARCH_CONTEXT, *PBL_ARCH_CONTEXT;
+/* INLINE ROUTINES ***********************************************************/
+
+FORCEINLINE
+VOID
+BlSetupDefaultParameters (
+ _Out_ PBL_LIBRARY_PARAMETERS LibraryParameters
+ )
+{
+ BL_LIBRARY_PARAMETERS DefaultParameters =
+ {
+ 0x20,
+ BlVirtual,
+ 1024,
+ 2 * 1024 * 1024,
+ 0,
+ NULL,
+ 0,
+ NULL
+ };
+
+ /* Copy the defaults */
+ RtlCopyMemory(LibraryParameters, &DefaultParameters, sizeof(*LibraryParameters));
+}
+
/* INITIALIZATION ROUTINES ***************************************************/
NTSTATUS
/* FUNCTIONS *****************************************************************/
+/* HACKKKYYY */
+EFI_SYSTEM_TABLE* g_SystemTable;
+
+VOID
+EarlyPrint(_In_ PWCHAR Format, ...)
+{
+ WCHAR buffer[1024];
+ va_list args;
+
+ va_start(args, Format);
+
+ vswprintf(buffer, Format, args);
+
+ g_SystemTable->ConOut->OutputString(g_SystemTable->ConOut, L"\r");
+ g_SystemTable->ConOut->OutputString(g_SystemTable->ConOut, buffer);
+
+ g_SystemTable->BootServices->Stall(1000000);
+
+ va_end(args);
+}
+/* END HACKKKYYY */
+
/*++
* @name InitializeLibrary
*
(BootAppParameters->Signature[1] != BOOT_APPLICATION_SIGNATURE_2) ||
(BootAppParameters->Size < sizeof(*BootAppParameters)))
{
- return STATUS_INVALID_PARAMETER;
+ Status = STATUS_INVALID_PARAMETER;
+ goto Quickie;
}
/* Get sub-structures */
if (strncmp(AppEntry->Signature, BL_APP_ENTRY_SIGNATURE, 7))
{
Status = STATUS_INVALID_PARAMETER_9;
+ goto Quickie;
}
/* Read parameters */
goto Quickie;
}
+ EarlyPrint(L"TODO!\n");
Status = STATUS_NOT_IMPLEMENTED;
Quickie:
+ EarlyPrint(L"Exiting init: %lx\n", Status);
return Status;
}