don't typecast constant strings
[reactos.git] / reactos / boot / freeldr / freeldr / reactos / reactos.c
index 7bc16cd..158d721 100644 (file)
@@ -1,20 +1,39 @@
 /*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         Freeloader
- * FILE:            boot/freeldr/freeldr/reactos/rosboot.c
- * PURPOSE:         ReactOS Loader
- * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+ *  FreeLoader
+ *
+ *  Copyright (C) 1998-2003  Brian Palmer  <brianp@sginet.com>
+ *  Copyright (C) 2005       Alex Ionescu  <alex@relsoft.net>
+ *
+ *  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
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
 #include <freeldr.h>
-#include <reactos/rossym.h>
-
-#include "registry.h"
 
 #define NDEBUG
 #include <debug.h>
 
-BOOL
+LOADER_PARAMETER_BLOCK LoaderBlock;
+char                                   reactos_kernel_cmdline[255];    // Command line passed to kernel
+LOADER_MODULE                  reactos_modules[64];            // Array to hold boot module info loaded for the kernel
+char                                   reactos_module_strings[64][256];        // Array to hold module names
+unsigned long                  reactos_memory_map_descriptor_size;
+memory_map_t                   reactos_memory_map[32];         // Memory map
+
+static CHAR szLoadingMsg[] = "Loading ReactOS...";
+
+static BOOL
 STDCALL
 FrLdrLoadKernel(PCHAR szFileName,
                 INT nPos)
@@ -58,7 +77,7 @@ FrLdrLoadKernel(PCHAR szFileName,
     FrLdrMapKernel(FilePointer);
 
     /* Update Processbar and return success */
-    UiDrawProgressBarCenter(nPos, 100, "Loading ReactOS...");
+    UiDrawProgressBarCenter(nPos, 100, szLoadingMsg);
     return(TRUE);
 }
 
@@ -124,9 +143,9 @@ LoadKernelSymbols(PCHAR szKernelName, int nPos)
   return TRUE;
 }
 
-BOOL
-FrLdrLoadNlsFile(PCHAR szFileName,
-                 PCHAR szModuleName)
+static BOOL
+FrLdrLoadNlsFile(PCSTR szFileName,
+                 PCSTR szModuleName)
 {
     PFILE FilePointer;
     CHAR value[256];
@@ -163,20 +182,20 @@ FrLdrLoadNlsFile(PCHAR szFileName,
     return(TRUE);
 }
 
-BOOL
+static BOOL
 FrLdrLoadNlsFiles(PCHAR szSystemRoot,
                   PCHAR szErrorOut)
 {
     LONG rc = ERROR_SUCCESS;
     FRLDRHKEY hKey;
-    CHAR szIdBuffer[80];
-    CHAR szNameBuffer[80];
+    WCHAR szIdBuffer[80];
+    WCHAR szNameBuffer[80];
     CHAR szFileName[256];
     ULONG BufferSize;
 
     /* open the codepage key */
     rc = RegOpenKey(NULL,
-                    "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage",
+                    L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage",
                     &hKey);
     if (rc != ERROR_SUCCESS) {
 
@@ -185,15 +204,15 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
     }
 
     /* get ANSI codepage */
-    BufferSize = 80;
-    rc = RegQueryValue(hKey, "ACP", NULL, (PUCHAR)szIdBuffer, &BufferSize);
+    BufferSize = sizeof(szIdBuffer);
+    rc = RegQueryValue(hKey, L"ACP", NULL, (PUCHAR)szIdBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS) {
 
         strcpy(szErrorOut, "Couldn't get ACP NLS setting");
         return(FALSE);
     }
 
-    BufferSize = 80;
+    BufferSize = sizeof(szNameBuffer);
     rc = RegQueryValue(hKey, szIdBuffer, NULL, (PUCHAR)szNameBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS) {
 
@@ -202,9 +221,7 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
     }
 
     /* load ANSI codepage table */
-    strcpy(szFileName, szSystemRoot);
-    strcat(szFileName, "system32\\");
-    strcat(szFileName, szNameBuffer);
+    sprintf(szFileName,"%ssystem32\\%S", szSystemRoot, szNameBuffer);
     DbgPrint((DPRINT_REACTOS, "ANSI file: %s\n", szFileName));
     if (!FrLdrLoadNlsFile(szFileName, "ansi.nls")) {
 
@@ -213,15 +230,15 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
     }
 
     /* get OEM codepage */
-    BufferSize = 80;
-    rc = RegQueryValue(hKey, "OEMCP", NULL, (PUCHAR)szIdBuffer, &BufferSize);
+    BufferSize = sizeof(szIdBuffer);
+    rc = RegQueryValue(hKey, L"OEMCP", NULL, (PUCHAR)szIdBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS) {
 
         strcpy(szErrorOut, "Couldn't get OEMCP NLS setting");
         return(FALSE);
     }
 
-    BufferSize = 80;
+    BufferSize = sizeof(szNameBuffer);
     rc = RegQueryValue(hKey, szIdBuffer, NULL, (PUCHAR)szNameBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS) {
 
@@ -230,9 +247,7 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
     }
 
     /* load OEM codepage table */
-    strcpy(szFileName, szSystemRoot);
-    strcat(szFileName, "system32\\");
-    strcat(szFileName, szNameBuffer);
+    sprintf(szFileName, "%ssystem32\\%S", szSystemRoot, szNameBuffer);
     DbgPrint((DPRINT_REACTOS, "Oem file: %s\n", szFileName));
     if (!FrLdrLoadNlsFile(szFileName, "oem.nls")) {
 
@@ -242,7 +257,7 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
 
     /* open the language key */
     rc = RegOpenKey(NULL,
-                    "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\Language",
+                    L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\Language",
                     &hKey);
     if (rc != ERROR_SUCCESS) {
 
@@ -251,15 +266,15 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
     }
 
     /* get the Unicode case table */
-    BufferSize = 80;
-    rc = RegQueryValue(hKey, "Default", NULL, (PUCHAR)szIdBuffer, &BufferSize);
+    BufferSize = sizeof(szIdBuffer);
+    rc = RegQueryValue(hKey, L"Default", NULL, (PUCHAR)szIdBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS) {
 
         strcpy(szErrorOut, "Couldn't get Language Default setting");
         return(FALSE);
     }
 
-    BufferSize = 80;
+    BufferSize = sizeof(szNameBuffer);
     rc = RegQueryValue(hKey, szIdBuffer, NULL, (PUCHAR)szNameBuffer, &BufferSize);
     if (rc != ERROR_SUCCESS) {
 
@@ -268,9 +283,7 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
     }
 
     /* load Unicode case table */
-    strcpy(szFileName, szSystemRoot);
-    strcat(szFileName, "system32\\");
-    strcat(szFileName, szNameBuffer);
+    sprintf(szFileName, "%ssystem32\\%S", szSystemRoot, szNameBuffer);
     DbgPrint((DPRINT_REACTOS, "Casemap file: %s\n", szFileName));
     if (!FrLdrLoadNlsFile(szFileName, "casemap.nls")) {
 
@@ -281,7 +294,7 @@ FrLdrLoadNlsFiles(PCHAR szSystemRoot,
     return(TRUE);
 }
 
-BOOL
+static BOOL
 FrLdrLoadDriver(PCHAR szFileName,
                 INT nPos)
 {
@@ -320,37 +333,37 @@ FrLdrLoadDriver(PCHAR szFileName,
     FrLdrLoadModule(FilePointer, szFileName, NULL);
 
     /* Update status and return */
-    UiDrawProgressBarCenter(nPos, 100, "Loading ReactOS...");
+    UiDrawProgressBarCenter(nPos, 100, szLoadingMsg);
     return(TRUE);
 }
 
-VOID
+static VOID
 FrLdrLoadBootDrivers(PCHAR szSystemRoot,
                      INT nPos)
 {
     LONG rc = 0;
     FRLDRHKEY hGroupKey, hOrderKey, hServiceKey, hDriverKey;
-    CHAR GroupNameBuffer[512];
-    CHAR ServiceName[256];
+    WCHAR GroupNameBuffer[512];
+    WCHAR ServiceName[256];
     ULONG OrderList[128];
     ULONG BufferSize;
     ULONG Index;
     ULONG TagIndex;
-    LPSTR GroupName;
+    LPWSTR GroupName;
 
     ULONG ValueSize;
     ULONG ValueType;
     ULONG StartValue;
     ULONG TagValue;
-    CHAR DriverGroup[256];
+    WCHAR DriverGroup[256];
     ULONG DriverGroupSize;
 
     CHAR ImagePath[256];
-    CHAR TempImagePath[256];
+    WCHAR TempImagePath[256];
 
     /* get 'service group order' key */
     rc = RegOpenKey(NULL,
-                    "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\ServiceGroupOrder",
+                    L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\ServiceGroupOrder",
                     &hGroupKey);
     if (rc != ERROR_SUCCESS) {
 
@@ -360,7 +373,7 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
 
     /* get 'group order list' key */
     rc = RegOpenKey(NULL,
-                    "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\GroupOrderList",
+                    L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\GroupOrderList",
                     &hOrderKey);
     if (rc != ERROR_SUCCESS) {
 
@@ -370,7 +383,7 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
 
     /* enumerate drivers */
     rc = RegOpenKey(NULL,
-                    "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services",
+                    L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services",
                     &hServiceKey);
     if (rc != ERROR_SUCCESS)  {
 
@@ -380,16 +393,16 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
 
     /* Get the Name Group */
     BufferSize = sizeof(GroupNameBuffer);
-    rc = RegQueryValue(hGroupKey, "List", NULL, (PUCHAR)GroupNameBuffer, &BufferSize);
+    rc = RegQueryValue(hGroupKey, L"List", NULL, (PUCHAR)GroupNameBuffer, &BufferSize);
     DbgPrint((DPRINT_REACTOS, "RegQueryValue(): rc %d\n", (int)rc));
     if (rc != ERROR_SUCCESS) return;
     DbgPrint((DPRINT_REACTOS, "BufferSize: %d \n", (int)BufferSize));
-    DbgPrint((DPRINT_REACTOS, "GroupNameBuffer: '%s' \n", GroupNameBuffer));
+    DbgPrint((DPRINT_REACTOS, "GroupNameBuffer: '%S' \n", GroupNameBuffer));
 
     /* Loop through each group */
     GroupName = GroupNameBuffer;
     while (*GroupName) {
-        DbgPrint((DPRINT_REACTOS, "Driver group: '%s'\n", GroupName));
+        DbgPrint((DPRINT_REACTOS, "Driver group: '%S'\n", GroupName));
 
         /* Query the Order */
         BufferSize = sizeof(OrderList);
@@ -411,48 +424,45 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
                 /* Makre sure it's valid, and check if we're done */
                 if (rc == ERROR_NO_MORE_ITEMS) break;
                 if (rc != ERROR_SUCCESS) return;
-                DbgPrint((DPRINT_REACTOS, "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);
 
                 /* Read the Start Value */
                 ValueSize = sizeof(ULONG);
-                rc = RegQueryValue(hDriverKey, "Start", &ValueType, (PUCHAR)&StartValue, &ValueSize);
+                rc = RegQueryValue(hDriverKey, L"Start", &ValueType, (PUCHAR)&StartValue, &ValueSize);
+               if (rc != ERROR_SUCCESS) StartValue = (ULONG)-1;
                 DbgPrint((DPRINT_REACTOS, "  Start: %x  \n", (int)StartValue));
 
                 /* Read the Tag */
                 ValueSize = sizeof(ULONG);
-                rc = RegQueryValue(hDriverKey, "Tag", &ValueType, (PUCHAR)&TagValue, &ValueSize);
+                rc = RegQueryValue(hDriverKey, L"Tag", &ValueType, (PUCHAR)&TagValue, &ValueSize);
                 if (rc != ERROR_SUCCESS) TagValue = (ULONG)-1;
                 DbgPrint((DPRINT_REACTOS, "  Tag:   %x  \n", (int)TagValue));
 
                 /* Read the driver's group */
-                DriverGroupSize = 256;
-                rc = RegQueryValue(hDriverKey, "Group", NULL, (PUCHAR)DriverGroup, &DriverGroupSize);
-                DbgPrint((DPRINT_REACTOS, "  Group: '%s'  \n", DriverGroup));
+                DriverGroupSize = sizeof(DriverGroup);
+                rc = RegQueryValue(hDriverKey, L"Group", NULL, (PUCHAR)DriverGroup, &DriverGroupSize);
+                DbgPrint((DPRINT_REACTOS, "  Group: '%S'  \n", DriverGroup));
 
                 /* Make sure it should be started */
                 if ((StartValue == 0) &&
                     (TagValue == OrderList[TagIndex]) &&
-                    (stricmp(DriverGroup, GroupName) == 0)) {
+                    (_wcsicmp(DriverGroup, GroupName) == 0)) {
 
                     /* Get the Driver's Location */
-                    ValueSize = 256;
-                    rc = RegQueryValue(hDriverKey, "ImagePath", NULL, (PUCHAR)TempImagePath, &ValueSize);
+                    ValueSize = sizeof(TempImagePath);
+                    rc = RegQueryValue(hDriverKey, L"ImagePath", NULL, (PUCHAR)TempImagePath, &ValueSize);
 
                     /* Write the whole path if it suceeded, else prepare to fail */
                     if (rc != ERROR_SUCCESS) {
                         DbgPrint((DPRINT_REACTOS, "  ImagePath: not found\n"));
-                        strcpy(ImagePath, szSystemRoot);
-                        strcat(ImagePath, "system32\\drivers\\");
-                        strcat(ImagePath, ServiceName);
-                        strcat(ImagePath, ".sys");
-                    } else if (TempImagePath[0] != '\\') {
-                        strcpy(ImagePath, szSystemRoot);
-                        strcat(ImagePath, TempImagePath);
+                        sprintf(ImagePath, "%s\\system32\\drivers\\%S.sys", szSystemRoot, ServiceName);
+                    } else if (TempImagePath[0] != L'\\') {
+                        sprintf(ImagePath, "%s%S", szSystemRoot, TempImagePath);
                     } else {
-                        strcpy(ImagePath, TempImagePath);
+                        sprintf(ImagePath, "%S", TempImagePath);
                         DbgPrint((DPRINT_REACTOS, "  ImagePath: '%s'\n", ImagePath));
                     }
 
@@ -465,8 +475,8 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
 
                 } else {
 
-                    DbgPrint((DPRINT_REACTOS, "  Skipping driver '%s' with Start %d, Tag %d and Group '%s' (Current Tag %d, current group '%s')\n",
-                    ServiceName, StartValue, TagValue, DriverGroup, OrderList[TagIndex], GroupName));
+                    DbgPrint((DPRINT_REACTOS, "  Skipping driver '%S' with Start %d, Tag %d and Group '%S' (Current Tag %d, current group '%S')\n",
+                             ServiceName, StartValue, TagValue, DriverGroup, OrderList[TagIndex], GroupName));
                 }
 
                 Index++;
@@ -483,26 +493,27 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
             DbgPrint((DPRINT_REACTOS, "RegEnumKey(): rc %d\n", (int)rc));
             if (rc == ERROR_NO_MORE_ITEMS) break;
             if (rc != ERROR_SUCCESS) return;
-            DbgPrint((DPRINT_REACTOS, "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);
 
             /* Read the Start Value */
             ValueSize = sizeof(ULONG);
-            rc = RegQueryValue(hDriverKey, "Start", &ValueType, (PUCHAR)&StartValue, &ValueSize);
+            rc = RegQueryValue(hDriverKey, L"Start", &ValueType, (PUCHAR)&StartValue, &ValueSize);
+            if (rc != ERROR_SUCCESS) StartValue = (ULONG)-1;
             DbgPrint((DPRINT_REACTOS, "  Start: %x  \n", (int)StartValue));
 
             /* Read the Tag */
             ValueSize = sizeof(ULONG);
-            rc = RegQueryValue(hDriverKey, "Tag", &ValueType, (PUCHAR)&TagValue, &ValueSize);
+            rc = RegQueryValue(hDriverKey, L"Tag", &ValueType, (PUCHAR)&TagValue, &ValueSize);
             if (rc != ERROR_SUCCESS) TagValue = (ULONG)-1;
             DbgPrint((DPRINT_REACTOS, "  Tag:   %x  \n", (int)TagValue));
 
             /* Read the driver's group */
-            DriverGroupSize = 256;
-            rc = RegQueryValue(hDriverKey, "Group", NULL, (PUCHAR)DriverGroup, &DriverGroupSize);
-            DbgPrint((DPRINT_REACTOS, "  Group: '%s'  \n", DriverGroup));
+            DriverGroupSize = sizeof(DriverGroup);
+            rc = RegQueryValue(hDriverKey, L"Group", NULL, (PUCHAR)DriverGroup, &DriverGroupSize);
+            DbgPrint((DPRINT_REACTOS, "  Group: '%S'  \n", DriverGroup));
 
             for (TagIndex = 1; TagIndex <= OrderList[0]; TagIndex++) {
                 if (TagValue == OrderList[TagIndex]) break;
@@ -510,21 +521,17 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
 
             if ((StartValue == 0) &&
                 (TagIndex > OrderList[0]) &&
-                (stricmp(DriverGroup, GroupName) == 0)) {
+                (_wcsicmp(DriverGroup, GroupName) == 0)) {
 
-                    ValueSize = 256;
-                    rc = RegQueryValue(hDriverKey, "ImagePath", NULL, (PUCHAR)TempImagePath, &ValueSize);
+                    ValueSize = sizeof(TempImagePath);
+                    rc = RegQueryValue(hDriverKey, L"ImagePath", NULL, (PUCHAR)TempImagePath, &ValueSize);
                     if (rc != ERROR_SUCCESS) {
                         DbgPrint((DPRINT_REACTOS, "  ImagePath: not found\n"));
-                        strcpy(ImagePath, szSystemRoot);
-                        strcat(ImagePath, "system32\\drivers\\");
-                        strcat(ImagePath, ServiceName);
-                        strcat(ImagePath, ".sys");
-                    } else if (TempImagePath[0] != '\\') {
-                        strcpy(ImagePath, szSystemRoot);
-                        strcat(ImagePath, TempImagePath);
+                        sprintf(ImagePath, "%ssystem32\\drivers\\%S.sys", szSystemRoot, ServiceName);
+                    } else if (TempImagePath[0] != L'\\') {
+                        sprintf(ImagePath, "%s%S", szSystemRoot, TempImagePath);
                     } else {
-                        strcpy(ImagePath, TempImagePath);
+                        sprintf(ImagePath, "%S", TempImagePath);
                         DbgPrint((DPRINT_REACTOS, "  ImagePath: '%s'\n", ImagePath));
                     }
                 DbgPrint((DPRINT_REACTOS, "  Loading driver: '%s'\n", ImagePath));
@@ -535,7 +542,7 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
 
             } else {
 
-                DbgPrint((DPRINT_REACTOS, "  Skipping driver '%s' with Start %d, Tag %d and Group '%s' (Current group '%s')\n",
+                DbgPrint((DPRINT_REACTOS, "  Skipping driver '%S' with Start %d, Tag %d and Group '%S' (Current group '%S')\n",
                 ServiceName, StartValue, TagValue, DriverGroup, GroupName));
             }
 
@@ -543,12 +550,12 @@ FrLdrLoadBootDrivers(PCHAR szSystemRoot,
         }
 
         /* Move to the next group name */
-        GroupName = GroupName + strlen(GroupName) + 1;
+        GroupName = GroupName + wcslen(GroupName) + 1;
     }
 }
 
 VOID
-LoadAndBootReactOS(PCHAR OperatingSystemName)
+LoadAndBootReactOS(PCSTR OperatingSystemName)
 {
        PFILE FilePointer;
        CHAR  name[1024];
@@ -583,42 +590,42 @@ LoadAndBootReactOS(PCHAR OperatingSystemName)
        /*
         * Setup multiboot information structure
         */
-       LoaderBlock.Flags = MB_INFO_FLAG_MEM_SIZE | MB_INFO_FLAG_BOOT_DEVICE | MB_INFO_FLAG_COMMAND_LINE | MB_INFO_FLAG_MODULES;
+       LoaderBlock.Flags = MB_FLAGS_BOOT_DEVICE | MB_FLAGS_COMMAND_LINE | MB_FLAGS_MODULE_INFO;
        LoaderBlock.PageDirectoryStart = (ULONG)&PageDirectoryStart;
        LoaderBlock.PageDirectoryEnd = (ULONG)&PageDirectoryEnd;
        LoaderBlock.BootDevice = 0xffffffff;
-       LoaderBlock.CommandLine = (unsigned long)multiboot_kernel_cmdline;
+       LoaderBlock.CommandLine = (unsigned long)reactos_kernel_cmdline;
        LoaderBlock.ModsCount = 0;
-       LoaderBlock.ModsAddr = (unsigned long)multiboot_modules;
-       LoaderBlock.MmapLength = (unsigned long)MachGetMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&multiboot_memory_map, 32) * sizeof(memory_map_t);
+       LoaderBlock.ModsAddr = (unsigned long)reactos_modules;
+       LoaderBlock.MmapLength = (unsigned long)MachGetMemoryMap((PBIOS_MEMORY_MAP)(PVOID)&reactos_memory_map, 32) * sizeof(memory_map_t);
        if (LoaderBlock.MmapLength)
        {
-               LoaderBlock.MmapAddr = (unsigned long)&multiboot_memory_map;
-               LoaderBlock.Flags |= MB_INFO_FLAG_MEM_SIZE | MB_INFO_FLAG_MEMORY_MAP;
-               multiboot_memory_map_descriptor_size = sizeof(memory_map_t); // GetBiosMemoryMap uses a fixed value of 24
+               LoaderBlock.MmapAddr = (unsigned long)&reactos_memory_map;
+               LoaderBlock.Flags |= MB_FLAGS_MEM_INFO | MB_FLAGS_MMAP_INFO;
+               reactos_memory_map_descriptor_size = sizeof(memory_map_t); // GetBiosMemoryMap uses a fixed value of 24
                DbgPrint((DPRINT_REACTOS, "memory map length: %d\n", LoaderBlock.MmapLength));
                DbgPrint((DPRINT_REACTOS, "dumping memory map:\n"));
                for (i=0; i<(LoaderBlock.MmapLength/sizeof(memory_map_t)); i++)
                {
-                       if (MEMTYPE_USABLE == multiboot_memory_map[i].type &&
-                           0 == multiboot_memory_map[i].base_addr_low)
+                       if (MEMTYPE_USABLE == reactos_memory_map[i].type &&
+                           0 == reactos_memory_map[i].base_addr_low)
                        {
-                               LoaderBlock.MemLower = (multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low) / 1024;
+                               LoaderBlock.MemLower = (reactos_memory_map[i].base_addr_low + reactos_memory_map[i].length_low) / 1024;
                                if (640 < LoaderBlock.MemLower)
                                {
                                        LoaderBlock.MemLower = 640;
                                }
                        }
-                       if (MEMTYPE_USABLE == multiboot_memory_map[i].type &&
-                           multiboot_memory_map[i].base_addr_low <= 1024 * 1024 &&
-                           1024 * 1024 <= multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low)
+                       if (MEMTYPE_USABLE == reactos_memory_map[i].type &&
+                           reactos_memory_map[i].base_addr_low <= 1024 * 1024 &&
+                           1024 * 1024 <= reactos_memory_map[i].base_addr_low + reactos_memory_map[i].length_low)
                        {
-                               LoaderBlock.MemHigher = (multiboot_memory_map[i].base_addr_low + multiboot_memory_map[i].length_low) / 1024 - 1024;
+                               LoaderBlock.MemHigher = (reactos_memory_map[i].base_addr_low + reactos_memory_map[i].length_low) / 1024 - 1024;
                        }
                        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));
+                                 reactos_memory_map[i].base_addr_low,
+                                 reactos_memory_map[i].length_low,
+                                 reactos_memory_map[i].type));
                }
        }
        DbgPrint((DPRINT_REACTOS, "low_mem = %d\n", LoaderBlock.MemLower));
@@ -641,18 +648,24 @@ LoadAndBootReactOS(PCHAR OperatingSystemName)
        /*
         * Special case for Live CD.
         */
-       if (!stricmp(SystemPath, "LiveCD"))
+       if (!_stricmp(SystemPath, "LiveCD"))
        {
                /* Normalize */
                MachDiskGetBootPath(SystemPath, sizeof(SystemPath));
                strcat(SystemPath, "\\reactos");
-               strcat(strcpy(multiboot_kernel_cmdline, SystemPath),
+               strcat(strcpy(reactos_kernel_cmdline, SystemPath),
                       " /MININT");
        }
        else
        {
+               if (! MachDiskNormalizeSystemPath(SystemPath,
+                                                 sizeof(SystemPath)))
+               {
+                       UiMessageBox("Invalid system path");
+                       return;
+               }
                /* copy system path into kernel command line */
-               strcpy(multiboot_kernel_cmdline, SystemPath);
+               strcpy(reactos_kernel_cmdline, SystemPath);
        }
 
        /*
@@ -660,8 +673,8 @@ LoadAndBootReactOS(PCHAR OperatingSystemName)
         */
        if (IniReadSettingByName(SectionId, "Options", value, 1024))
        {
-               strcat(multiboot_kernel_cmdline, " ");
-               strcat(multiboot_kernel_cmdline, value);
+               strcat(reactos_kernel_cmdline, " ");
+               strcat(reactos_kernel_cmdline, value);
        }
 
 
@@ -673,10 +686,10 @@ LoadAndBootReactOS(PCHAR OperatingSystemName)
         */
        MachHwDetect();
 
-       if (AcpiPresent) LoaderBlock.Flags |= MB_INFO_FLAG_ACPI_TABLE;
+       if (AcpiPresent) LoaderBlock.Flags |= MB_FLAGS_ACPI_TABLE;
 
        UiDrawStatusText("Loading...");
-       UiDrawProgressBarCenter(0, 100, "Loading ReactOS...");
+       UiDrawProgressBarCenter(0, 100, szLoadingMsg);
 
        /*
         * Try to open system drive
@@ -810,16 +823,16 @@ LoadAndBootReactOS(PCHAR OperatingSystemName)
         */
        RegInitCurrentControlSet(FALSE);
 
-       UiDrawProgressBarCenter(15, 100, "Loading ReactOS...");
+       UiDrawProgressBarCenter(15, 100, szLoadingMsg);
 
        /*
         * Export the hardware hive
         */
        Base = FrLdrCreateModule ("HARDWARE");
-       RegExportBinaryHive ("\\Registry\\Machine\\HARDWARE", (PCHAR)Base, &Size);
+       RegExportBinaryHive (L"\\Registry\\Machine\\HARDWARE", (PCHAR)Base, &Size);
        FrLdrCloseModule (Base, Size);
 
-       UiDrawProgressBarCenter(20, 100, "Loading ReactOS...");
+       UiDrawProgressBarCenter(20, 100, szLoadingMsg);
 
        /*
         * Load NLS files
@@ -829,13 +842,13 @@ LoadAndBootReactOS(PCHAR OperatingSystemName)
                UiMessageBox(MsgBuffer);
                return;
        }
-       UiDrawProgressBarCenter(30, 100, "Loading ReactOS...");
+       UiDrawProgressBarCenter(30, 100, szLoadingMsg);
 
        /*
         * Load kernel symbols
         */
        LoadKernelSymbols(szKernelName, 30);
-       UiDrawProgressBarCenter(40, 100, "Loading ReactOS...");
+       UiDrawProgressBarCenter(40, 100, szLoadingMsg);
 
        /*
         * Load boot drivers