Detect hardware before ntoskrnl.exe will be loaded.
[reactos.git] / freeldr / freeldr / reactos / reactos.c
index baf4942..498a79e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  FreeLoader
  *
- *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *  Copyright (C) 1998-2003  Brian Palmer  <brianp@sginet.com>
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  */
 
 #include <freeldr.h>
-#include <asmcode.h>
+#include <debug.h>
+#include <arch.h>
 #include <reactos.h>
 #include <rtl.h>
+#include <disk.h>
 #include <fs.h>
 #include <ui.h>
 #include <multiboot.h>
 #include <mm.h>
-#include <parseini.h>
+#include <inifile.h>
 
 #include "registry.h"
-#include "hwdetect.h"
 
 
 #define NDEBUG
 
+#define IsRecognizedPartition(P)  \
+    ((P) == PARTITION_FAT_12       || \
+     (P) == PARTITION_FAT_16       || \
+     (P) == PARTITION_HUGE         || \
+     (P) == PARTITION_IFS          || \
+     (P) == PARTITION_FAT32        || \
+     (P) == PARTITION_FAT32_XINT13 || \
+     (P) == PARTITION_XINT13)
 
 static BOOL
 LoadKernel(PCHAR szFileName, int nPos)
@@ -48,32 +57,95 @@ LoadKernel(PCHAR szFileName, int nPos)
   else
     szShortName = szShortName + 1;
 
-  FilePointer = OpenFile(szFileName);
+  FilePointer = FsOpenFile(szFileName);
   if (FilePointer == NULL)
     {
       strcpy(szBuffer, szShortName);
       strcat(szBuffer, " not found.");
-      MessageBox(szBuffer);
+      UiMessageBox(szBuffer);
       return(FALSE);
     }
 
   /*
    * Update the status bar with the current file
    */
-  strcpy(szBuffer, " Reading ");
+  strcpy(szBuffer, "Reading ");
   strcat(szBuffer, szShortName);
-  DrawStatusText(szBuffer);
+  UiDrawStatusText(szBuffer);
 
   /*
    * Load the kernel
    */
   MultiBootLoadKernel(FilePointer);
 
-  DrawProgressBar(nPos);
+  UiDrawProgressBarCenter(nPos, 100, "Loading ReactOS...");
 
   return(TRUE);
 }
 
+static BOOL
+LoadSymbolFile(PCHAR szSystemRoot,
+  PCHAR ModuleName,
+  int nPos)
+{
+  CHAR SymbolFileName[1024];
+  PFILE FilePointer;
+  U32 Length;
+  PCHAR Start;
+  PCHAR Ext;
+  char value[256];
+  char *p;
+
+  /* Get the path to the symbol store */
+  strcpy(SymbolFileName, szSystemRoot);
+  strcat(SymbolFileName, "symbols\\");
+
+  /* Get the symbol filename from the module name */
+  Start = strrchr(ModuleName, '\\');
+  if (Start == NULL)
+    Start = ModuleName;
+  else
+    Start++;
+
+  Ext = strrchr(ModuleName, '.');
+  if (Ext != NULL)
+    Length = Ext - Start;
+  else
+    Length = strlen(Start);
+
+  strncat(SymbolFileName, Start, Length);
+  strcat(SymbolFileName, ".sym");
+
+  FilePointer = FsOpenFile((PCHAR)&SymbolFileName[0]);
+  if (FilePointer == NULL)
+    {
+      DbgPrint((DPRINT_REACTOS, "Symbol file %s not loaded.\n", SymbolFileName));
+      /* This is not critical */
+      return FALSE;
+    }
+
+  DbgPrint((DPRINT_REACTOS, "Symbol file %s is loaded.\n", SymbolFileName));
+
+  /*
+   * Update the status bar with the current file
+   */
+  strcpy(value, "Reading ");
+  p = strrchr(SymbolFileName, '\\');
+  if (p == NULL)
+    strcat(value, SymbolFileName);
+  else
+    strcat(value, p + 1);
+  UiDrawStatusText(value);
+
+  /*
+   * Load the symbol file
+   */
+  MultiBootLoadModule(FilePointer, SymbolFileName, NULL);
+
+  UiDrawProgressBarCenter(nPos, 100, "Loading ReactOS...");
+
+  return (TRUE);
+}
 
 static BOOL
 LoadDriver(PCHAR szFileName, int nPos)
@@ -82,37 +154,38 @@ LoadDriver(PCHAR szFileName, int nPos)
   char value[256];
   char *p;
 
-  FilePointer = OpenFile(szFileName);
+  FilePointer = FsOpenFile(szFileName);
   if (FilePointer == NULL)
     {
       strcpy(value, szFileName);
       strcat(value, " not found.");
-      MessageBox(value);
+      UiMessageBox(value);
       return(FALSE);
     }
 
   /*
    * Update the status bar with the current file
    */
-  strcpy(value, " Reading ");
+  strcpy(value, "Reading ");
   p = strrchr(szFileName, '\\');
   if (p == NULL)
     strcat(value, szFileName);
   else
     strcat(value, p + 1);
-  DrawStatusText(value);
+  UiDrawStatusText(value);
 
   /*
    * Load the driver
    */
   MultiBootLoadModule(FilePointer, szFileName, NULL);
 
-  DrawProgressBar(nPos);
+  UiDrawProgressBarCenter(nPos, 100, "Loading ReactOS...");
 
   return(TRUE);
 }
 
 
+#if 0
 static BOOL
 LoadNlsFile(PCHAR szFileName, PCHAR szModuleName)
 {
@@ -120,25 +193,25 @@ LoadNlsFile(PCHAR szFileName, PCHAR szModuleName)
   char value[256];
   char *p;
 
-  FilePointer = OpenFile(szFileName);
+  FilePointer = FsOpenFile(szFileName);
   if (FilePointer == NULL)
     {
       strcpy(value, szFileName);
       strcat(value, " not found.");
-      MessageBox(value);
+      UiMessageBox(value);
       return(FALSE);
     }
 
   /*
    * Update the status bar with the current file
    */
-  strcpy(value, " Reading ");
+  strcpy(value, "Reading ");
   p = strrchr(szFileName, '\\');
   if (p == NULL)
     strcat(value, szFileName);
   else
     strcat(value, p + 1);
-  DrawStatusText(value);
+  UiDrawStatusText(value);
 
   /*
    * Load the driver
@@ -147,27 +220,25 @@ LoadNlsFile(PCHAR szFileName, PCHAR szModuleName)
 
   return(TRUE);
 }
+#endif
 
 
 static VOID
 LoadBootDrivers(PCHAR szSystemRoot, int nPos)
 {
-  LONG rc = 0;
+  S32 rc = 0;
   HKEY hGroupKey, hServiceKey, hDriverKey;
-  char ValueBuffer[256];
+  char ValueBuffer[512];
   char ServiceName[256];
-  ULONG BufferSize;
-  ULONG Index;
-  char *s, *p;
-  char GroupName[256];
-  ULONG len;
-  BOOL done;
-
-  ULONG ValueSize;
-  ULONG ValueType;
-  ULONG StartValue;
+  U32 BufferSize;
+  U32 Index;
+  char *GroupName;
+
+  U32 ValueSize;
+  U32 ValueType;
+  U32 StartValue;
   UCHAR DriverGroup[256];
-  ULONG DriverGroupSize;
+  U32 DriverGroupSize;
 
   UCHAR ImagePath[256];
 
@@ -175,73 +246,60 @@ LoadBootDrivers(PCHAR szSystemRoot, int nPos)
   rc = RegOpenKey(NULL,
                  "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\ServiceGroupOrder",
                  &hGroupKey);
-//  printf("RegOpenKey(): rc %d\n", (int)rc);
   if (rc != ERROR_SUCCESS)
-    return;
+    {
+      DbgPrint((DPRINT_REACTOS, "Failed to open the 'ServiceGroupOrder key (rc %d)\n", (int)rc));
+      return;
+    }
 
   /* enumerate drivers */
   rc = RegOpenKey(NULL,
                  "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services",
                  &hServiceKey);
-//  printf("RegOpenKey(): rc %d\n", (int)rc);
   if (rc != ERROR_SUCCESS)
-    return;
-
-//  printf("hKey: %x\n", (int)hKey);
+    {
+      DbgPrint((DPRINT_REACTOS, "Failed to open the 'Services' key (rc %d)\n", (int)rc));
+      return;
+    }
 
-  BufferSize = 256;
+  BufferSize = sizeof(ValueBuffer);
   rc = RegQueryValue(hGroupKey, "List", NULL, (PUCHAR)ValueBuffer, &BufferSize);
-//  printf("RegQueryValue(): rc %d\n", (int)rc);
+  DbgPrint((DPRINT_REACTOS, "RegQueryValue(): rc %d\n", (int)rc));
   if (rc != ERROR_SUCCESS)
     return;
 
+  DbgPrint((DPRINT_REACTOS, "BufferSize: %d \n", (int)BufferSize));
 
-//  printf("BufferSize: %d \n", (int)BufferSize);
-
-//  printf("ValueBuffer: '%s' \n", ValueBuffer);
+  DbgPrint((DPRINT_REACTOS, "ValueBuffer: '%s' \n", ValueBuffer));
 
-  done = FALSE;
-  s = ValueBuffer;
-  do
+  GroupName = ValueBuffer;
+  while (*GroupName)
     {
-      p = strchr(s, ';');
-      if (p != NULL)
-       {
-         len = p - s;
-         memcpy(GroupName, s, len);
-         GroupName[len] = 0;
-         s = p + 1;
-       }
-      else
-       {
-         strcpy(GroupName, s);
-         done = TRUE;
-       }
-//      printf("Driver group: '%s'\n", GroupName);
+      DbgPrint((DPRINT_REACTOS, "Driver group: '%s'\n", GroupName));
 
       /* enumerate all drivers */
       Index = 0;
       while (TRUE)
        {
-         ValueSize = 256;
+         ValueSize = sizeof(ValueBuffer);
          rc = RegEnumKey(hServiceKey, Index, ServiceName, &ValueSize);
-//       printf("RegEnumKey(): rc %d\n", (int)rc);
+         DbgPrint((DPRINT_REACTOS, "RegEnumKey(): rc %d\n", (int)rc));
          if (rc == ERROR_NO_MORE_ITEMS)
            break;
          if (rc != ERROR_SUCCESS)
            return;
-//       printf("Service %d: '%s'\n", (int)Index, ServiceName);
+         DbgPrint((DPRINT_REACTOS, "Service %d: '%s'\n", (int)Index, ServiceName));
 
          /* open driver Key */
          rc = RegOpenKey(hServiceKey, ServiceName, &hDriverKey);
 
-         ValueSize = sizeof(ULONG);
+         ValueSize = sizeof(U32);
          rc = RegQueryValue(hDriverKey, "Start", &ValueType, (PUCHAR)&StartValue, &ValueSize);
-//       printf("  Start: %x  \n", (int)StartValue);
+         DbgPrint((DPRINT_REACTOS, "  Start: %x  \n", (int)StartValue));
 
          DriverGroupSize = 256;
          rc = RegQueryValue(hDriverKey, "Group", NULL, (PUCHAR)DriverGroup, &DriverGroupSize);
-//       printf("  Group: %s  \n", DriverGroup);
+         DbgPrint((DPRINT_REACTOS, "  Group: '%s'  \n", DriverGroup));
 
          if ((StartValue == 0) && (stricmp(DriverGroup, GroupName) == 0))
            {
@@ -253,7 +311,7 @@ LoadBootDrivers(PCHAR szSystemRoot, int nPos)
                                 &ValueSize);
              if (rc != ERROR_SUCCESS)
                {
-//               printf("  ImagePath: not found\n");
+                 DbgPrint((DPRINT_REACTOS, "  ImagePath: not found\n"));
                  strcpy(ImagePath, szSystemRoot);
                  strcat(ImagePath, "system32\\drivers\\");
                  strcat(ImagePath, ServiceName);
@@ -261,31 +319,38 @@ LoadBootDrivers(PCHAR szSystemRoot, int nPos)
                }
              else
                {
-//               printf("  ImagePath: '%s'\n", ImagePath);
+                 DbgPrint((DPRINT_REACTOS, "  ImagePath: '%s'\n", ImagePath));
                }
-//           printf("  Loading driver: '%s'\n", ImagePath);
+             DbgPrint((DPRINT_REACTOS, "  Loading driver: '%s'\n", ImagePath));
 
              if (nPos < 100)
                nPos += 5;
 
              LoadDriver(ImagePath, nPos);
+        LoadSymbolFile(szSystemRoot, ImagePath, nPos);
+           }
+         else
+           {
+             DbgPrint((DPRINT_REACTOS, "  Skipping driver '%s' with Start %d and Group '%s' (Current group '%s')\n",
+                 ImagePath, StartValue, DriverGroup, GroupName));
            }
          Index++;
        }
+
+      GroupName = GroupName + strlen(GroupName) + 1;
     }
-  while(done == FALSE);
 }
 
-
+#if 0
 static BOOL
 LoadNlsFiles(PCHAR szSystemRoot)
 {
-  LONG rc = ERROR_SUCCESS;
+  S32 rc = ERROR_SUCCESS;
   HKEY hKey;
   char szIdBuffer[80];
   char szNameBuffer[80];
   char szFileName[256];
-  ULONG BufferSize;
+  U32 BufferSize;
 
   /* open the codepage key */
   rc = RegOpenKey(NULL,
@@ -362,32 +427,40 @@ LoadNlsFiles(PCHAR szSystemRoot)
 
   return(TRUE);
 }
+#endif
 
 
-void LoadAndBootReactOS(PUCHAR OperatingSystemName)
+void
+LoadAndBootReactOS(PUCHAR OperatingSystemName)
 {
-       PFILE           FilePointer;
-       char            name[1024];
-       char            value[1024];
-       char            szFileName[1024];
-       char            szBootPath[256];
-//     int             i;
+       PFILE FilePointer;
+       char  name[1024];
+       char  value[1024];
+       char  szKernelName[1024];
+       char  szHalName[1024];
+       char  szFileName[1024];
+       char  szBootPath[256];
+       int             i;
 //     int             nNumDriverFiles=0;
 //     int             nNumFilesLoaded=0;
-       char            MsgBuffer[256];
-       ULONG           SectionId;
+       char  MsgBuffer[256];
+       U32 SectionId;
 
        char* Base;
-       ULONG Size;
+       U32 Size;
+
+        PARTITION_TABLE_ENTRY PartitionTableEntry;
+        U32 rosPartition;
+       BOOL TextHive = FALSE;
 
        //
        // Open the operating system section
        // specified in the .ini file
        //
-       if (!OpenSection(OperatingSystemName, &SectionId))
+       if (!IniOpenSection(OperatingSystemName, &SectionId))
        {
                sprintf(MsgBuffer,"Operating System section '%s' not found in freeldr.ini", OperatingSystemName);
-               MessageBox(MsgBuffer);
+               UiMessageBox(MsgBuffer);
                return;
        }
 
@@ -401,29 +474,36 @@ void LoadAndBootReactOS(PUCHAR OperatingSystemName)
        mb_info.cmdline = (unsigned long)multiboot_kernel_cmdline;
        mb_info.mods_count = 0;
        mb_info.mods_addr = (unsigned long)multiboot_modules;
-       mb_info.mmap_length = GetBiosMemoryMap(&multiboot_memory_map);
+       mb_info.mmap_length = (unsigned long)GetBiosMemoryMap((PBIOS_MEMORY_MAP)&multiboot_memory_map, 32) * sizeof(memory_map_t);
        if (mb_info.mmap_length)
        {
                mb_info.mmap_addr = (unsigned long)&multiboot_memory_map;
                mb_info.flags |= MB_INFO_FLAG_MEMORY_MAP;
-               //printf("memory map length: %d\n", mb_info.mmap_length);
-               //printf("dumping memory map:\n");
-               //for (i=0; i<(mb_info.mmap_length / 4); i++)
-               //{
-               //      printf("0x%x\n", ((unsigned long *)&multiboot_memory_map)[i]);
-               //}
-               //getch();
+               multiboot_memory_map_descriptor_size = sizeof(memory_map_t); // GetBiosMemoryMap uses a fixed value of 24
+               DbgPrint((DPRINT_REACTOS, "memory map length: %d\n", mb_info.mmap_length));
+               DbgPrint((DPRINT_REACTOS, "dumping memory map:\n"));
+               for (i=0; i<(mb_info.mmap_length/sizeof(memory_map_t)); i++)
+               {
+                       DbgPrint((DPRINT_REACTOS, "start: %x\t size: %x\t type %d\n", 
+                                 multiboot_memory_map[i].base_addr_low, 
+                                 multiboot_memory_map[i].length_low,
+                                 multiboot_memory_map[i].type));
+               }
        }
-       //printf("low_mem = %d\n", mb_info.mem_lower);
-       //printf("high_mem = %d\n", mb_info.mem_upper);
-       //getch();
+       DbgPrint((DPRINT_REACTOS, "low_mem = %d\n", mb_info.mem_lower));
+       DbgPrint((DPRINT_REACTOS, "high_mem = %d\n", mb_info.mem_upper));
+
+       /*
+        * Initialize the registry
+        */
+       RegInitializeRegistry();
 
        /*
         * Make sure the system path is set in the .ini file
         */
-       if (!ReadSectionSettingByName(SectionId, "SystemPath", value, 1024))
+       if (!IniReadSettingByName(SectionId, "SystemPath", value, 1024))
        {
-               MessageBox("System path not specified for selected operating system.");
+               UiMessageBox("System path not specified for selected operating system.");
                return;
        }
 
@@ -433,7 +513,7 @@ void LoadAndBootReactOS(PUCHAR OperatingSystemName)
        if (!DissectArcPath(value, szBootPath, &BootDrive, &BootPartition))
        {
                sprintf(MsgBuffer,"Invalid system path: '%s'", value);
-               MessageBox(MsgBuffer);
+               UiMessageBox(MsgBuffer);
                return;
        }
 
@@ -441,13 +521,39 @@ void LoadAndBootReactOS(PUCHAR OperatingSystemName)
        ((char *)(&mb_info.boot_device))[0] = (char)BootDrive;
        ((char *)(&mb_info.boot_device))[1] = (char)BootPartition;
 
+       /* recalculate the boot partition for freeldr */
+       i = 0;
+       rosPartition = 0;
+       while (1)
+       {
+          if (!DiskGetPartitionEntry(BootDrive, ++i, &PartitionTableEntry))
+          {
+             BootPartition = 0;
+             break;
+          }
+          if (IsRecognizedPartition(PartitionTableEntry.SystemIndicator))
+          {
+             if (++rosPartition == BootPartition)
+             {
+                BootPartition = i;
+                break;
+             }
+          }
+       }
+       if (BootPartition == 0)
+       {
+               sprintf(MsgBuffer,"Invalid system path: '%s'", value);
+               UiMessageBox(MsgBuffer);
+               return;
+       }
+
        /* copy ARC path into kernel command line */
        strcpy(multiboot_kernel_cmdline, value);
 
        /*
         * Read the optional kernel parameters (if any)
         */
-       if (ReadSectionSettingByName(SectionId, "Options", value, 1024))
+       if (IniReadSettingByName(SectionId, "Options", value, 1024))
        {
                strcat(multiboot_kernel_cmdline, " ");
                strcat(multiboot_kernel_cmdline, value);
@@ -458,22 +564,27 @@ void LoadAndBootReactOS(PUCHAR OperatingSystemName)
            szBootPath[strlen(szBootPath)] != '\\')
                strcat(szBootPath, "\\");
 
-#ifndef NDEBUG
-       sprintf(MsgBuffer,"SystemRoot: '%s'", szBootPath);
-       MessageBox(MsgBuffer);
-#endif
+       DbgPrint((DPRINT_REACTOS,"SystemRoot: '%s'\n", szBootPath));
+
+
+       UiDrawBackdrop();
+       UiDrawStatusText("Detecting Hardware...");
+
+       /*
+        * Detect hardware
+        */
+       DetectHardware();
 
-       DrawBackdrop();
 
-       DrawStatusText(" Loading...");
-       DrawProgressBar(0);
+       UiDrawStatusText("Loading...");
+       UiDrawProgressBarCenter(0, 100, "Loading ReactOS...");
 
        /*
         * Try to open boot drive
         */
-       if (!OpenDiskDrive(BootDrive, BootPartition))
+       if (!FsOpenVolume(BootDrive, BootPartition))
        {
-               MessageBox("Failed to open boot drive.");
+               UiMessageBox("Failed to open boot drive.");
                return;
        }
 
@@ -481,137 +592,139 @@ void LoadAndBootReactOS(PUCHAR OperatingSystemName)
         * Find the kernel image name
         * and try to load the kernel off the disk
         */
-       if(ReadSectionSettingByName(SectionId, "Kernel", value, 1024))
+       if(IniReadSettingByName(SectionId, "Kernel", value, 1024))
        {
                /*
                 * Set the name and
                 */
                if (value[0] == '\\')
                {
-                       strcpy(szFileName, value);
+                       strcpy(szKernelName, value);
                }
                else
                {
-                       strcpy(szFileName, szBootPath);
-                       strcat(szFileName, "SYSTEM32\\");
-                       strcat(szFileName, value);
+                       strcpy(szKernelName, szBootPath);
+                       strcat(szKernelName, "SYSTEM32\\");
+                       strcat(szKernelName, value);
                }
        }
        else
        {
                strcpy(value, "NTOSKRNL.EXE");
-               strcpy(szFileName, szBootPath);
-               strcat(szFileName, "SYSTEM32\\");
-               strcat(szFileName, value);
+               strcpy(szKernelName, szBootPath);
+               strcat(szKernelName, "SYSTEM32\\");
+               strcat(szKernelName, value);
        }
 
-       if (!LoadKernel(szFileName, 5))
+       if (!LoadKernel(szKernelName, 5))
                return;
 
        /*
         * Find the HAL image name
         * and try to load the kernel off the disk
         */
-       if(ReadSectionSettingByName(SectionId, "Hal", value, 1024))
+       if(IniReadSettingByName(SectionId, "Hal", value, 1024))
        {
                /*
                 * Set the name and
                 */
                if (value[0] == '\\')
                {
-                       strcpy(szFileName, value);
+                       strcpy(szHalName, value);
                }
                else
                {
-                       strcpy(szFileName, szBootPath);
-                       strcat(szFileName, "SYSTEM32\\");
-                       strcat(szFileName, value);
+                       strcpy(szHalName, szBootPath);
+                       strcat(szHalName, "SYSTEM32\\");
+                       strcat(szHalName, value);
                }
        }
        else
        {
                strcpy(value, "HAL.DLL");
-               strcpy(szFileName, szBootPath);
-               strcat(szFileName, "SYSTEM32\\");
-               strcat(szFileName, value);
+               strcpy(szHalName, szBootPath);
+               strcat(szHalName, "SYSTEM32\\");
+               strcat(szHalName, value);
        }
 
-       if (!LoadDriver(szFileName, 10))
+       if (!LoadDriver(szHalName, 10))
                return;
 
        /*
-        * Find the System hive image name
-        * and try to load it off the disk
+        * Load the System hive from disk
         */
-       if(ReadSectionSettingByName(SectionId, "SystemHive", value, 1024))
+       strcpy(szFileName, szBootPath);
+       strcat(szFileName, "SYSTEM32\\CONFIG\\SYSTEM");
+
+       DbgPrint((DPRINT_REACTOS, "SystemHive: '%s'", szFileName));
+
+       FilePointer = FsOpenFile(szFileName);
+       if (FilePointer == NULL)
        {
-               /*
-                * Set the name and
-                */
-               if (value[0] == '\\')
+               strcpy(szFileName, szBootPath);
+               strcat(szFileName, "SYSTEM32\\CONFIG\\SYSTEM.HIV");
+
+               DbgPrint((DPRINT_REACTOS, "SystemHive: '%s'", szFileName));
+
+               FilePointer = FsOpenFile(szFileName);
+               if (FilePointer == NULL)
                {
-                       strcpy(szFileName, value);
+                       UiMessageBox("Could not find the System hive!");
+                       return;
                }
                else
                {
-                       strcpy(szFileName, szBootPath);
-                       strcat(szFileName, "SYSTEM32\\CONFIG\\");
-                       strcat(szFileName, value);
+                       TextHive = TRUE;
                }
        }
-       else
-       {
-               strcpy(value, "SYSTEM.HIV");
-               strcpy(szFileName, szBootPath);
-               strcat(szFileName, "SYSTEM32\\CONFIG\\");
-               strcat(szFileName, value);
-       }
-
-#ifndef NDEBUG
-       sprintf(MsgBuffer,"SystemHive: '%s'", szFileName);
-       MessageBox(MsgBuffer);
-#endif
-
-       FilePointer = OpenFile(szFileName);
-       if (FilePointer == NULL)
-       {
-               strcat(value, " not found.");
-               MessageBox(value);
-               return;
-       }
 
        /*
         * Update the status bar with the current file
         */
-       strcpy(name, " Reading ");
+       strcpy(name, "Reading ");
        strcat(name, value);
        while (strlen(name) < 80)
                strcat(name, " ");
-       DrawStatusText(name);
+       UiDrawStatusText(name);
 
        /*
-        * Load the system hive
+        * Load the System hive
         */
        Base = MultiBootLoadModule(FilePointer, szFileName, &Size);
-       RegInitializeRegistry();
-       RegImportHive(Base, Size);
+       if (Base == NULL || Size == 0)
+       {
+               UiMessageBox("Could not load the System hive!\n");
+               return;
+       }
+       DbgPrint((DPRINT_REACTOS, "SystemHive loaded at 0x%x size %u", (unsigned)Base, (unsigned)Size));
+
+       /*
+        * Import the loaded system hive
+        */
+       if (TextHive)
+       {
+               RegImportTextHive(Base, Size);
+       }
+       else
+       {
+               RegImportBinaryHive(Base, Size);
+       }
 
-       DrawProgressBar(15);
+       /*
+        * Initialize the 'CurrentControlSet' link
+        */
+       RegInitCurrentControlSet(FALSE);
 
-#ifndef NDEBUG
-       sprintf(MsgBuffer,"SystemHive loaded at 0x%x size %u", (unsigned)Base, (unsigned)Size);
-       MessageBox(MsgBuffer);
-#endif
+       UiDrawProgressBarCenter(15, 100, "Loading ReactOS...");
 
        /*
-        * Retrieve hardware information and create the hardware hive
+        * Export the hardware hive
         */
-       DetectHardware();
-//     Base = MultiBootCreateModule(HARDWARE.HIV);
-//     RegExportHive("\\Registry\\Machine\\HARDWARE", Base, &Size);
-//     MultiBootCloseModule(Base, Size);
+       Base = MultiBootCreateModule ("HARDWARE");
+       RegExportBinaryHive ("\\Registry\\Machine\\HARDWARE", Base, &Size);
+       MultiBootCloseModule (Base, Size);
 
-       DrawProgressBar(20);
+       UiDrawProgressBarCenter(20, 100, "Loading ReactOS...");
 
        /*
         * Load NLS files
@@ -619,12 +732,15 @@ void LoadAndBootReactOS(PUCHAR OperatingSystemName)
 #if 0
        if (!LoadNlsFiles(szBootPath))
        {
-               MessageBox("Failed to load NLS files\n");
+               UiMessageBox("Failed to load NLS files\n");
                return;
        }
 #endif
 
-       DrawProgressBar(25);
+       LoadSymbolFile(szBootPath, szKernelName, 25);
+       LoadSymbolFile(szBootPath, szHalName, 25);
+
+       UiDrawProgressBarCenter(25, 100, "Loading ReactOS...");
 
        /*
         * Load boot drivers
@@ -635,23 +751,26 @@ void LoadAndBootReactOS(PUCHAR OperatingSystemName)
        /*
         * Clear the screen and redraw the backdrop and status bar
         */
-       DrawBackdrop();
-       DrawStatusText(" Press any key to boot");
+       UiDrawBackdrop();
+       UiDrawStatusText("Press any key to boot");
 
+#if 0
        /*
         * Wait for user
         */
        strcpy(name, "Kernel and Drivers loaded.\nPress any key to boot ");
        strcat(name, OperatingSystemName);
        strcat(name, ".");
-       //MessageBox(name);
+       MessageBox(name);
+#endif
 
-       RestoreScreen(ScreenBuffer);
+       UiUnInitialize("Booting ReactOS...");
 
        /*
         * Now boot the kernel
         */
-       stop_floppy();
+       DiskStopFloppyMotor();
        boot_reactos();
 }
 
+/* EOF */