Author: ion
Date: Mon Sep  7 23:48:21 2015
New Revision: 69104

URL: http://svn.reactos.org/svn/reactos?rev=69104&view=rev
Log:
[BOOTMGFW]
- And again with the fucking non-recursion.

Modified:
    trunk/reactos/boot/environ/app/bootmgr/bootmgr.c
    trunk/reactos/boot/environ/app/bootmgr/efiemu.c
    trunk/reactos/boot/environ/include/bl.h

Modified: trunk/reactos/boot/environ/app/bootmgr/bootmgr.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/app/bootmgr/bootmgr.c?rev=69104&r1=69103&r2=69104&view=diff
==============================================================================
--- trunk/reactos/boot/environ/app/bootmgr/bootmgr.c    [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/app/bootmgr/bootmgr.c    [iso-8859-1] Mon Sep  7 
23:48:21 2015
@@ -12,10 +12,109 @@
 
 /* DATA VARIABLES ************************************************************/
 
+#include <initguid.h>
+DEFINE_GUID(GUID_WINDOWS_BOOTMGR,
+            0x9DEA862C,
+            0x5CDD,
+            0x4E70,
+            0xAC, 0xC1, 0xF3, 0x2B, 0x34, 0x4D, 0x47, 0x95);
+
 ULONGLONG ApplicationStartTime;
 ULONGLONG PostTime;
+GUID BmApplicationIdentifier;
 
 /* FUNCTIONS *****************************************************************/
+
+PGUID
+BlGetApplicationIdentifier (
+    VOID
+    )
+{
+    return NULL;
+}
+
+PWCHAR BootDirectory;
+
+NTSTATUS
+BmFwInitializeBootDirectoryPath()
+{
+#if 0
+    PWCHAR FinalPath;
+    NTSTATUS Status;
+    PWCHAR BcdDirectory;
+    UNICODE_STRING BcdPath;
+    ULONG FinalSize, FileHandle, DeviceHandle;
+
+    BcdPath.MaximumLength = 0;
+    BcdPath.Buffer = NULL;
+
+    FinalPath = NULL;
+
+    FileHandle = -1;
+    DeviceHandle = -1;
+
+    Status = BlpDeviceOpen(BlpBootDevice, 1u, 0, &DeviceHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        goto Quickie;
+    }
+
+    Status = BmpFwGetApplicationDirectoryPath(&BcdPath);
+    BcdDirectory = BcdPath.Buffer;
+    if (!NT_SUCCESS(Status))
+    {
+        goto Quickie;
+    }
+
+    FinalSize = BcdPath.MaximumLength + sizeof(L"\\BCD") - 
sizeof(UNICODE_NULL);
+    if (FinalSize < BcdPath.MaximumLength)
+    {
+        goto Quickie;
+    }
+
+    FinalPath = BlMmAllocateHeap(FinalSize);
+    if (!FinalPath)
+    {
+        goto Quickie;
+    }
+
+    RtlZeroMemory(FinalPath, FinalSize);
+    RtlCopyMemory(FinalPath, BcdDirectory, BcdPath.MaximumLength);
+    wcsncat(FinalPath, L"\\BCD", FinalSize / sizeof(WCHAR));
+
+    EfiPrintf(L"Opening: %s\r\n", FinalPath);
+    Status = BlFileOpen(DeviceHandle, FinalPath, 1u, &FileHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        BootDirectory = BcdDirectory;
+        goto Quickie;
+    }
+
+    BootDirectory = L"\\EFI\\Microsoft\\Boot";
+
+Quickie:
+    if (BcdDirectory)
+    {
+        Status = BlMmFreeHeap(BcdDirectory);
+    }
+    if (FinalPath)
+    {
+        Status = BlMmFreeHeap(FinalPath);
+    }
+    if (FileHandle != -1)
+    {
+        Status = BlFileClose(FileHandle);
+    }
+    if (DeviceHandle != -1)
+    {
+        Status = BlDeviceClose(DeviceHandle);
+    }
+    return Status;
+#else
+    return STATUS_NOT_IMPLEMENTED;
+#endif
+}
+
 
 /*++
  * @name BmMain
@@ -37,8 +136,15 @@
 {
     NTSTATUS Status;
     BL_LIBRARY_PARAMETERS LibraryParameters;
-
-    EarlyPrint(L"ReactOS UEFI Boot Manager Initializing...\n");
+    PBL_RETURN_ARGUMENTS ReturnArguments;
+    BOOLEAN RebootOnError;
+    PGUID AppIdentifier;
+//    HANDLE BcdHandle;
+
+    EfiPrintf(L"ReactOS UEFI Boot Manager Initializing...\n");
+
+    /* Reading the BCD can change this later on */
+    RebootOnError = FALSE;
 
     /* Save the start/end-of-POST time */
     ApplicationStartTime = __rdtsc();
@@ -53,9 +159,59 @@
 
     /* Initialize the boot library */
     Status = BlInitializeLibrary(BootParameters, &LibraryParameters);
-
-    EarlyPrint(L"ReactOS UEFI Boot Manager Exiting: %lx\n", Status);
-    EfiStall(3000000);
+    if (!NT_SUCCESS(Status))
+    {
+        /* Check for failure due to invalid application entry */
+        if (Status != STATUS_INVALID_PARAMETER_9)
+        {
+            /* Specifically print out what happened */
+            EfiPrintf(L"BlInitializeLibrary failed 0x%x\r\n", Status);
+        }
+
+        /* Go to exit path */
+        goto Quickie;
+    }
+
+    /* Get the application identifier */
+    AppIdentifier = BlGetApplicationIdentifier();
+    if (!AppIdentifier)
+    {
+        /* None was given, so set our default one */
+        AppIdentifier = (PGUID)&GUID_WINDOWS_BOOTMGR;
+    }
+    
+    /* Save our identifier */
+    BmApplicationIdentifier = *AppIdentifier;
+
+    /* Initialize the file system to open a handle to our root boot directory 
*/
+    BmFwInitializeBootDirectoryPath();
+
+    //Status = BmOpenDataStore(&BcdHandle);
+
+    EfiPrintf(L"We are A-OK!\n");
+    EfiStall(10000000);
+
+Quickie:
+    /* Check if we should reboot */
+    if ((RebootOnError) ||
+        (BlpApplicationEntry.Flags & BL_APPLICATION_ENTRY_REBOOT_ON_ERROR))
+    {
+        /* Reboot the box */
+        BlFwReboot();
+        Status = STATUS_SUCCESS;
+    }
+    else
+    {
+        /* Return back to the caller with the error argument encoded */
+        ReturnArguments = (PVOID)((ULONG_PTR)BootParameters + 
BootParameters->ReturnArgumentsOffset);
+        ReturnArguments->Version = BL_RETURN_ARGUMENTS_VERSION;
+        ReturnArguments->Status = Status;
+
+        /* Tear down the boot library*/
+        BlDestroyLibrary();
+    }
+
+    /* Return back status */
     return Status;
 }
 

Modified: trunk/reactos/boot/environ/app/bootmgr/efiemu.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/app/bootmgr/efiemu.c?rev=69104&r1=69103&r2=69104&view=diff
==============================================================================
--- trunk/reactos/boot/environ/app/bootmgr/efiemu.c     [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/app/bootmgr/efiemu.c     [iso-8859-1] Mon Sep  7 
23:48:21 2015
@@ -665,7 +665,6 @@
     RemainingSize = MaximumLength;
     if (RemainingSize < sizeof(BL_APPLICATION_ENTRY))
     {
-        EarlyPrint(L"Remaining size too small!\n");
         Status = STATUS_INVALID_PARAMETER;
         goto Quickie;
     }
@@ -709,7 +708,6 @@
     if (!NT_SUCCESS(Status))
     {
         /* We failed, so mark the option as such and return an empty one */
-        EarlyPrint(L"Failed to convert device path: %lx\n", Status);
         Entry->BcdData.Empty = TRUE;
         TotalOptionSize = sizeof(BL_BCD_OPTION);
         goto Quickie;
@@ -731,7 +729,6 @@
     {
         /* lol */
         Status = STATUS_NOT_IMPLEMENTED;
-        EarlyPrint(L"UDP Boot not supported!\n");
     }
     else
     {
@@ -745,7 +742,6 @@
     /* Bail out on failure */
     if (!NT_SUCCESS(Status))
     {
-        EarlyPrint(L"Failed to convert file path: %lx\n", Status);
         goto Quickie;
     }
 
@@ -784,7 +780,6 @@
                                                   RemainingSize);
             if (!NT_SUCCESS(Status))
             {
-                EarlyPrint(L"Failed to convert OS device path: %lx\n", Status);
                 goto Quickie;
             }
 
@@ -811,7 +806,6 @@
                                                 RemainingSize);
             if (!NT_SUCCESS(Status))
             {
-                EarlyPrint(L"Failed to convert OS file path: %lx\n", Status);
                 goto Quickie;
             }
 
@@ -898,7 +892,6 @@
                                           (VOID**)&LoadedImage);
     if (Status != EFI_SUCCESS)
     {
-        EarlyPrint(L"Loaded image failed: %lx\n", Status);
         return NULL;
     }
 
@@ -912,7 +905,6 @@
                                           (VOID**)&DevicePath);
     if (Status != EFI_SUCCESS)
     {
-        EarlyPrint(L"Device Path failed: %lx\n", Status);
         return NULL;
     }
 
@@ -1020,10 +1012,6 @@
 {
     NTSTATUS Status;
     PBOOT_APPLICATION_PARAMETER_BLOCK BootParameters;
-    extern EFI_SYSTEM_TABLE *g_SystemTable;
-
-    /* Temporary debugging string */
-    g_SystemTable = SystemTable;
 
     /* Convert EFI parameters to Windows Boot Application parameters */
     BootParameters = EfiInitCreateInputParametersEx(ImageHandle, SystemTable);
@@ -1035,7 +1023,6 @@
     else
     {
         /* Conversion failed, bail out */
-        EarlyPrint(L"EFI Input Conversion failed\n");
         Status = STATUS_INVALID_PARAMETER;
     }
 

Modified: trunk/reactos/boot/environ/include/bl.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/include/bl.h?rev=69104&r1=69103&r2=69104&view=diff
==============================================================================
--- trunk/reactos/boot/environ/include/bl.h     [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/include/bl.h     [iso-8859-1] Mon Sep  7 
23:48:21 2015
@@ -29,9 +29,6 @@
 #include <GraphicsOutput.h>
 #include <UgaDraw.h>
 
-VOID
-EarlyPrint(_In_ PWCHAR Format, ...);
-
 /* DEFINES *******************************************************************/
 
 #define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI          0x01
@@ -50,6 +47,7 @@
 #define BL_FIRMWARE_DESCRIPTOR_VERSION                  2
 
 #define BL_APPLICATION_ENTRY_FLAG_NO_GUID               0x01
+#define BL_APPLICATION_ENTRY_REBOOT_ON_ERROR            0x20
 
 #define BL_CONTEXT_PAGING_ON                            1
 #define BL_CONTEXT_INTERRUPTS_ON                        2
@@ -407,7 +405,8 @@
 typedef struct _BL_RETURN_ARGUMENTS
 {
     ULONG Version;
-    ULONG ReturnArgumentData[6];
+    NTSTATUS Status;
+    ULONG ReturnArgumentData[5];
 } BL_RETURN_ARGUMENTS, *PBL_RETURN_ARGUMENTS;
 
 typedef struct _BL_MEMORY_DESCRIPTOR
@@ -784,7 +783,18 @@
     _In_ ULONG Flags
     );
 
+VOID
+BlDestroyLibrary (
+    VOID
+    );
+
 /* FIRMWARE ROUTINES *********************************************************/
+
+VOID
+EfiPrintf (
+    _In_ PWCHAR Format,
+    ...
+    );
 
 NTSTATUS
 EfiAllocatePages (
@@ -878,6 +888,11 @@
     _Out_ UINTN *FrameBufferSize
     );
 
+VOID
+EfiResetSystem (
+    _In_ EFI_RESET_TYPE ResetType
+    );
+
 /* PLATFORM TIMER ROUTINES ***************************************************/
 
 NTSTATUS
@@ -899,6 +914,11 @@
 
 NTSTATUS
 BlUtlInitialize (
+    VOID
+    );
+
+VOID
+BlFwReboot (
     VOID
     );
 


Reply via email to