Separated multiboot kernel loader and reactos kernel loader so that support for other...
authorBrian Palmer <brianp@sginet.com>
Fri, 8 Jun 2001 23:12:40 +0000 (23:12 +0000)
committerBrian Palmer <brianp@sginet.com>
Fri, 8 Jun 2001 23:12:40 +0000 (23:12 +0000)
svn path=/trunk/; revision=1953

14 files changed:
freeldr/freeldr/Makefile
freeldr/freeldr/arcname.c [new file with mode: 0644]
freeldr/freeldr/arcname.h [new file with mode: 0644]
freeldr/freeldr/asmcode.S
freeldr/freeldr/asmcode.h
freeldr/freeldr/boot.S
freeldr/freeldr/freeldr.c
freeldr/freeldr/mb.S [moved from freeldr/freeldr/multiboot.S with 98% similarity]
freeldr/freeldr/menu.c
freeldr/freeldr/multiboot.c [new file with mode: 0644]
freeldr/freeldr/multiboot.h
freeldr/freeldr/pe.h [deleted file]
freeldr/freeldr/reactos.c [moved from freeldr/freeldr/rosboot.c with 58% similarity]
freeldr/freeldr/reactos.h [moved from freeldr/freeldr/rosboot.h with 52% similarity]

index b05b180..06aedc5 100644 (file)
@@ -28,10 +28,11 @@ export CP = cmd /C copy
 FLAGS = -Wall -fno-builtin
 
 # asmcode.o has to be first in the link line because it contains the startup code
-OBJS = asmcode.a asmcode.o multiboot.o boot.o freeldr.o stdlib.o fs.a fs.o fs_fat.o \
-       rosboot.o tui.o menu.o miscboot.o options.o linux.o
-ASM_OBJS = asmcode.o multiboot.o boot.o
-C_OBJS = freeldr.o stdlib.o fs.a rosboot.o tui.o menu.o miscboot.o options.o linux.o
+OBJS = asmcode.a asmcode.o mb.o boot.o freeldr.o stdlib.o fs.a fs.o fs_fat.o \
+       reactos.o tui.o menu.o miscboot.o options.o linux.o multiboot.o arcname.o
+ASM_OBJS = asmcode.o mb.o boot.o
+C_OBJS = freeldr.o stdlib.o fs.a reactos.o tui.o menu.o miscboot.o options.o linux.o \
+       multiboot.o arcname.o
 
 all:   freeldr.sys
 
@@ -47,7 +48,7 @@ c_code.a:     $(C_OBJS)
 asmcode.o:     asmcode.S asmcode.h Makefile
        $(CC) $(FLAGS) -o asmcode.o -c asmcode.S
 
-freeldr.o:     freeldr.c freeldr.h stdlib.h fs.h rosboot.h tui.h asmcode.h menu.h miscboot.h Makefile
+freeldr.o:     freeldr.c freeldr.h stdlib.h fs.h reactos.h tui.h asmcode.h menu.h miscboot.h Makefile
        $(CC) $(FLAGS) -o freeldr.o -c freeldr.c
 
 stdlib.o:      stdlib.c freeldr.h stdlib.h Makefile
@@ -62,11 +63,14 @@ fs.o:       fs.c freeldr.h fs.h stdlib.h tui.h asmcode.h Makefile
 fs_fat.o:      fs_fat.c freeldr.h fs.h stdlib.h tui.h Makefile
        $(CC) $(FLAGS) -o fs_fat.o -c fs_fat.c
 
-rosboot.o:     rosboot.c freeldr.h rosboot.h stdlib.h fs.h tui.h multiboot.h Makefile
-       $(CC) $(FLAGS) -o rosboot.o -c rosboot.c
+reactos.o:     reactos.c freeldr.h reactos.h stdlib.h fs.h tui.h multiboot.h Makefile
+       $(CC) $(FLAGS) -o reactos.o -c reactos.c
 
-multiboot.o:   multiboot.S asmcode.h multiboot.h Makefile
-       $(CC) $(FLAGS) -o multiboot.o -c multiboot.S
+multiboot.o:   multiboot.c freeldr.h stdlib.h fs.h multiboot.h tui.h Makefile
+       $(CC) $(FLAGS) -o multiboot.o -c multiboot.c
+
+mb.o:  mb.S asmcode.h multiboot.h Makefile
+       $(CC) $(FLAGS) -o mb.o -c mb.S
 
 tui.o: tui.c freeldr.h stdlib.h tui.h Makefile
        $(CC) $(FLAGS) -o tui.o -c tui.c
@@ -86,5 +90,10 @@ options.o:   options.c freeldr.h stdlib.h tui.h options.h Makefile
 linux.o:       linux.c freeldr.h stdlib.h tui.h linux.h Makefile
        $(CC) $(FLAGS) -o linux.o -c linux.c
 
+arcname.o:     arcname.c freeldr.h arcname.h stdlib.h Makefile
+       $(CC) $(FLAGS) -o arcname.o -c arcname.c
+
 clean:
-       $(RM) $(OBJS)
+       $(RM) *.o
+       $(RM) *.a
+       $(RM) freeldr.sys
diff --git a/freeldr/freeldr/arcname.c b/freeldr/freeldr/arcname.c
new file mode 100644 (file)
index 0000000..be974ff
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ *  FreeLoader - arcname.c
+ *
+ *  Copyright (C) 2001  Brian Palmer  <brianp@sginet.com>
+ *  Copyright (C) 2001  Eric Kohl
+ *
+ *  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 "arcname.h"
+#include "stdlib.h"
+
+
+BOOL DissectArcPath(char *ArcPath, char *BootPath, unsigned int *BootDrive, unsigned int *BootPartition)
+{
+       char *p;
+
+       if (_strnicmp(ArcPath, "multi(0)disk(0)", 15) != 0)
+               return FALSE;
+
+       p = ArcPath + 15;
+       if (_strnicmp(p, "fdisk(", 6) == 0)
+       {
+               /*
+                * floppy disk path:
+                *  multi(0)disk(0)fdisk(x)\path
+                */
+               p = p + 6;
+               *BootDrive = atoi(p);
+               p = strchr(p, ')');
+               if (p == NULL)
+                       return FALSE;
+               p++;
+               *BootPartition = 0;
+       }
+       else if (_strnicmp(p, "rdisk(", 6) == 0)
+       {
+               /*
+                * hard disk path:
+                *  multi(0)disk(0)rdisk(x)partition(y)\path
+                */
+               p = p + 6;
+               *BootDrive = atoi(p) + 0x80;
+               p = strchr(p, ')');
+               if ((p == NULL) || (_strnicmp(p, ")partition(", 11) != 0))
+                       return FALSE;
+               p = p + 11;
+               *BootPartition = atoi(p);
+               p = strchr(p, ')');
+               if ((p == NULL) || (*BootPartition == 0))
+                       return FALSE;
+               p++;
+       }
+       else
+       {
+               return FALSE;
+       }
+
+       strcpy(BootPath, p);
+
+       return TRUE;
+}
diff --git a/freeldr/freeldr/arcname.h b/freeldr/freeldr/arcname.h
new file mode 100644 (file)
index 0000000..ae68b99
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ *  FreeLoader - arcname.h
+ *
+ *  Copyright (C) 2001  Brian Palmer  <brianp@sginet.com>
+ *  Copyright (C) 2001  Eric Kohl
+ *
+ *  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.
+ */
+
+#ifndef __ARCNAME_H
+#define __ARCNAME_H
+
+BOOL   DissectArcPath(char *ArcPath, char *BootPath, unsigned int *BootDrive, unsigned int *BootPartition);
+//BOOL ConvertBiosDriveToArcName()
+//BOOL ConvertArcNameToBiosDrive()
+
+#endif // defined __ARCNAME_H
\ No newline at end of file
index e4c6f1d..440a233 100644 (file)
@@ -20,6 +20,7 @@
        .text
        .code16
 
+#define ASM
 #include "asmcode.h"
 
 
index 5ab2b72..11dd28a 100644 (file)
 /* Makes "x" a global variable or label */
 #define EXTERN(x)      .global x; x:
 
+
+
+
+#ifndef ASM
+
+void   enable_a20(void);
+
+#endif /* ! ASM */
index c8f5124..6005e31 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  FreeLoader
- *  Copyright (C) 1999, 2000  Brian Palmer  <brianp@sginet.com>
+ *  Copyright (C) 1999, 2000, 2001  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
@@ -20,7 +20,9 @@
        .text
        .code16
 
+#define ASM
 #include "asmcode.h"
+#include "multiboot.h"
 
 
        .code32
index c36415f..2d5302a 100644 (file)
@@ -20,7 +20,7 @@
 #include "freeldr.h"
 #include "stdlib.h"
 #include "fs.h"
-#include "rosboot.h"
+#include "reactos.h"
 #include "tui.h"
 #include "asmcode.h"
 #include "menu.h"
@@ -114,6 +114,8 @@ void BootMain(void)
                        LoadAndBootDrive(nOSToBoot);
                        break;
                }
+
+               DrawBackdrop()
        }
 
        MessageBox("Press any key to reboot.");
similarity index 98%
rename from freeldr/freeldr/multiboot.S
rename to freeldr/freeldr/mb.S
index d22044a..5a0c273 100644 (file)
        .text
        .code16
 
+#define ASM
 #include "asmcode.h"
+#include "multiboot.h"
 
        /*
      * Here we assume the kernel is loaded at 1mb
      * This boots the kernel
         */
        .code32
-EXTERN(_boot_ros)
+EXTERN(_boot_reactos)
        call    switch_to_real
        .code16
 
index 90846db..4b81045 100644 (file)
@@ -141,6 +141,8 @@ void InitMenu(void)
        nOSListBoxRight = nOSListBoxLeft + width;
        nOSListBoxTop = (nScreenHeight - height) / 2 + 1;
        nOSListBoxBottom = nOSListBoxTop + height;
+
+       nOSSelected = 0;
 }
 
 void DrawMenu(void)
diff --git a/freeldr/freeldr/multiboot.c b/freeldr/freeldr/multiboot.c
new file mode 100644 (file)
index 0000000..32cd67d
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1999, 2000, 2001  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
+ *  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 "asmcode.h"
+#include "stdlib.h"
+#include "fs.h"
+#include "multiboot.h"
+#include "tui.h"
+
+unsigned long                          next_module_load_base = 0;
+
+BOOL MultiBootLoadKernel(FILE *KernelImage)
+{
+       DWORD                           ImageHeaders[2048];
+       int                                     Idx;
+       DWORD                           dwHeaderChecksum;
+       DWORD                           dwFileLoadOffset;
+       DWORD                           dwDataSize;
+       DWORD                           dwBssSize;
+
+       /*
+        * Load the first 8192 bytes of the kernel image
+        * so we can search for the multiboot header
+        */
+       ReadFile(KernelImage, 8192, ImageHeaders);
+
+       /*
+        * Now find the multiboot header and copy it
+        */
+       for (Idx=0; Idx<2048; Idx++)
+       {
+               // Did we find it?
+               if (ImageHeaders[Idx] == MULTIBOOT_HEADER_MAGIC)
+               {
+                       // Yes, copy it and break out of this loop
+                       memcpy(&mb_header, &ImageHeaders[Idx], sizeof(multiboot_header_t));
+
+                       break;
+               }
+       }
+
+       /*
+        * If we reached the end of the 8192 bytes without
+        * finding the multiboot header then return error
+        */
+       if (Idx == 2048)
+       {
+               MessageBox("No multiboot header found!");
+               return FALSE;
+       }
+
+       /*printf("multiboot header:\n");
+       printf("0x%x\n", mb_header.magic);
+       printf("0x%x\n", mb_header.flags);
+       printf("0x%x\n", mb_header.checksum);
+       printf("0x%x\n", mb_header.header_addr);
+       printf("0x%x\n", mb_header.load_addr);
+       printf("0x%x\n", mb_header.load_end_addr);
+       printf("0x%x\n", mb_header.bss_end_addr);
+       printf("0x%x\n", mb_header.entry_addr);
+       getch();*/
+
+       /*
+        * Calculate the checksum and make sure it matches
+        */
+       dwHeaderChecksum = mb_header.magic;
+       dwHeaderChecksum += mb_header.flags;
+       dwHeaderChecksum += mb_header.checksum;
+       if (dwHeaderChecksum != 0)
+       {
+               MessageBox("Multiboot header checksum invalid!");
+               return FALSE;
+       }
+       
+       /*
+        * Get the file offset, this should be 0, and move the file pointer
+        */
+       dwFileLoadOffset = (Idx * sizeof(DWORD)) - (mb_header.header_addr - mb_header.load_addr);
+       fseek(KernelImage, dwFileLoadOffset);
+       
+       /*
+        * Load the file image
+        */
+       dwDataSize = (mb_header.load_end_addr - mb_header.load_addr);
+       ReadFile(KernelImage, dwDataSize, (void*)mb_header.load_addr);
+
+       /*
+        * Initialize bss area
+        */
+       dwBssSize = (mb_header.bss_end_addr - mb_header.load_end_addr);
+       memset((void*)mb_header.load_end_addr, 0, dwBssSize);
+
+       next_module_load_base = ROUND_UP(mb_header.bss_end_addr, /*PAGE_SIZE*/4096);
+
+       return TRUE;
+}
+
+BOOL MultiBootLoadModule(FILE *ModuleImage, char *ModuleName)
+{
+       DWORD           dwModuleSize;
+       module_t*       pModule;
+       char*           ModuleNameString;
+       
+       /*
+        * Get current module data structure and module name string array
+        */
+       pModule = &multiboot_modules[mb_info.mods_count];
+       ModuleNameString = multiboot_module_strings[mb_info.mods_count];
+       
+       dwModuleSize = GetFileSize(ModuleImage);
+       pModule->mod_start = next_module_load_base;
+       pModule->mod_end = next_module_load_base + dwModuleSize;
+       strcpy(ModuleNameString, ModuleName);
+       pModule->string = (unsigned long)ModuleNameString;
+       
+       /*
+        * Load the file image
+        */
+       ReadFile(ModuleImage, dwModuleSize, (void*)next_module_load_base);
+
+       next_module_load_base = ROUND_UP(pModule->mod_end, /*PAGE_SIZE*/4096);
+       mb_info.mods_count++;
+
+       return TRUE;
+}
+
+int GetBootPartition(char *OperatingSystemName)
+{
+       int             BootPartitionNumber = -1;
+       char    name[1024];
+       char    value[1024];
+
+       if (ReadSectionSettingByName(OperatingSystemName, "BootPartition", name, value))
+       {
+               BootPartitionNumber = atoi(value);
+       }
+
+       return BootPartitionNumber;
+}
\ No newline at end of file
index fbd5879..e557d78 100644 (file)
 # define EXT_C(sym)                     sym
 #endif
 
+#define MB_INFO_FLAG_MEM_SIZE                  0x00000001
+#define MB_INFO_FLAG_BOOT_DEVICE               0x00000002
+#define MB_INFO_FLAG_COMMAND_LINE              0x00000004
+#define MB_INFO_FLAG_MODULES                   0x00000008
+#define MB_INFO_FLAG_AOUT_SYMS                 0x00000010
+#define MB_INFO_FLAG_ELF_SYMS                  0x00000020
+#define MB_INFO_FLAG_MEMORY_MAP                        0x00000040
+#define MB_INFO_FLAG_DRIVES                            0x00000080
+#define MB_INFO_FLAG_CONFIG_TABLE              0x00000100
+#define MB_INFO_FLAG_BOOT_LOADER_NAME  0x00000200
+#define MB_INFO_FLAG_APM_TABLE                 0x00000400
+#define MB_INFO_FLAG_GRAPHICS_TABLE            0x00000800
+
+#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
+
 #ifndef ASM
 /* Do not include here in boot.S. */
 
@@ -116,14 +131,22 @@ typedef struct memory_map
   unsigned long type;
 } memory_map_t;
 
-#endif /* ! ASM */
 
+multiboot_header_t             mb_header;                                                      // Multiboot header structure defined in kernel image file
+multiboot_info_t               mb_info;                                                        // Multiboot info structure passed to kernel
+char                                   multiboot_kernel_cmdline[255];          // Command line passed to kernel
+module_t                               multiboot_modules[64];                          // Array to hold boot module info loaded for the kernel
+char                                   multiboot_module_strings[64][256];      // Array to hold module names
+
+
+void   boot_reactos(void);
 
-multiboot_header_t     mb_header;                              // Multiboot header structure defined in kernel image file
-multiboot_info_t       mb_info;                                // Multiboot info structure passed to kernel
-char                   multiboot_kernel_cmdline[255];          // Command line passed to kernel
-module_t               multiboot_modules[64];                  // Array to hold boot module info loaded for the kernel
-char                   multiboot_module_strings[64][256];      // Array to hold module names
+BOOL   MultiBootLoadKernel(FILE *KernelImage);
+BOOL   MultiBootLoadModule(FILE *ModuleImage, char *ModuleName);
+int            GetBootPartition(char *OperatingSystemName);
+
+
+#endif /* ! ASM */
 
 
 #endif // defined __MULTIBOOT_H
\ No newline at end of file
diff --git a/freeldr/freeldr/pe.h b/freeldr/freeldr/pe.h
deleted file mode 100644 (file)
index c1454f9..0000000
+++ /dev/null
@@ -1,593 +0,0 @@
-
-#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
-
-#define IMAGE_SECTION_CHAR_CODE          0x00000020
-#define IMAGE_SECTION_CHAR_DATA          0x00000040
-#define IMAGE_SECTION_CHAR_BSS           0x00000080
-#define IMAGE_SECTION_CHAR_NON_CACHABLE  0x04000000
-#define IMAGE_SECTION_CHAR_NON_PAGEABLE  0x08000000
-#define IMAGE_SECTION_CHAR_SHARED        0x10000000
-#define IMAGE_SECTION_CHAR_EXECUTABLE    0x20000000
-#define IMAGE_SECTION_CHAR_READABLE      0x40000000
-#define IMAGE_SECTION_CHAR_WRITABLE      0x80000000
-
-
-#define IMAGE_DOS_MAGIC  0x5a4d
-#define IMAGE_PE_MAGIC   0x00004550
-
-typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
-    WORD   e_magic;                     // Magic number
-    WORD   e_cblp;                      // Bytes on last page of file
-    WORD   e_cp;                        // Pages in file
-    WORD   e_crlc;                      // Relocations
-    WORD   e_cparhdr;                   // Size of header in paragraphs
-    WORD   e_minalloc;                  // Minimum extra paragraphs needed
-    WORD   e_maxalloc;                  // Maximum extra paragraphs needed
-    WORD   e_ss;                        // Initial (relative) SS value
-    WORD   e_sp;                        // Initial SP value
-    WORD   e_csum;                      // Checksum
-    WORD   e_ip;                        // Initial IP value
-    WORD   e_cs;                        // Initial (relative) CS value
-    WORD   e_lfarlc;                    // File address of relocation table
-    WORD   e_ovno;                      // Overlay number
-    WORD   e_res[4];                    // Reserved words
-    WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
-    WORD   e_oeminfo;                   // OEM information; e_oemid specific
-    WORD   e_res2[10];                  // Reserved words
-    LONG   e_lfanew;                    // File address of new exe header
-} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
-
-typedef struct _IMAGE_FILE_HEADER {
-    WORD    Machine;
-    WORD    NumberOfSections;
-    DWORD   TimeDateStamp;
-    DWORD   PointerToSymbolTable;
-    DWORD   NumberOfSymbols;
-    WORD    SizeOfOptionalHeader;
-    WORD    Characteristics;
-} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
-
-#define IMAGE_SIZEOF_FILE_HEADER             20
-
-#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
-#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references).
-#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
-#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
-#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
-#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
-#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
-#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file.
-#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // If Image is on Net, copy and run from the swap file.
-#define IMAGE_FILE_SYSTEM                    0x1000  // System File.
-#define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
-#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // File should only be run on a UP machine
-#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
-
-#define IMAGE_FILE_MACHINE_UNKNOWN           0
-#define IMAGE_FILE_MACHINE_I386              0x14c   // Intel 386.
-#define IMAGE_FILE_MACHINE_R3000             0x162   // MIPS little-endian, 0x160 big-endian
-#define IMAGE_FILE_MACHINE_R4000             0x166   // MIPS little-endian
-#define IMAGE_FILE_MACHINE_R10000            0x168   // MIPS little-endian
-#define IMAGE_FILE_MACHINE_ALPHA             0x184   // Alpha_AXP
-#define IMAGE_FILE_MACHINE_POWERPC           0x1F0   // IBM PowerPC Little-Endian
-
-
-//
-// Directory format.
-//
-
-typedef struct _IMAGE_DATA_DIRECTORY {
-    DWORD   VirtualAddress;
-    DWORD   Size;
-} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
-
-#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
-
-//
-// Optional header format.
-//
-
-typedef struct _IMAGE_OPTIONAL_HEADER {
-    //
-    // Standard fields.
-    //
-
-    WORD    Magic;
-    BYTE    MajorLinkerVersion;
-    BYTE    MinorLinkerVersion;
-    DWORD   SizeOfCode;
-    DWORD   SizeOfInitializedData;
-    DWORD   SizeOfUninitializedData;
-    DWORD   AddressOfEntryPoint;
-    DWORD   BaseOfCode;
-    DWORD   BaseOfData;
-
-    //
-    // NT additional fields.
-    //
-
-    DWORD   ImageBase;
-    DWORD   SectionAlignment;
-    DWORD   FileAlignment;
-    WORD    MajorOperatingSystemVersion;
-    WORD    MinorOperatingSystemVersion;
-    WORD    MajorImageVersion;
-    WORD    MinorImageVersion;
-    WORD    MajorSubsystemVersion;
-    WORD    MinorSubsystemVersion;
-    DWORD   Win32VersionValue;
-    DWORD   SizeOfImage;
-    DWORD   SizeOfHeaders;
-    DWORD   CheckSum;
-    WORD    Subsystem;
-    WORD    DllCharacteristics;
-    DWORD   SizeOfStackReserve;
-    DWORD   SizeOfStackCommit;
-    DWORD   SizeOfHeapReserve;
-    DWORD   SizeOfHeapCommit;
-    DWORD   LoaderFlags;
-    DWORD   NumberOfRvaAndSizes;
-    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
-} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
-
-#define IMAGE_SUBSYSTEM_UNKNOWN                0
-#define IMAGE_SUBSYSTEM_NATIVE         1
-#define IMAGE_SUBSYSTEM_WINDOWS_GUI    2
-#define IMAGE_SUBSYSTEM_WINDOWS_CUI    3
-#define IMAGE_SUBSYSTEM_OS2_GUI                4
-#define IMAGE_SUBSYSTEM_OS2_CUI                5
-#define IMAGE_SUBSYSTEM_POSIX_GUI      6
-#define IMAGE_SUBSYSTEM_POSIX_CUI      7
-#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
-
-typedef struct _IMAGE_NT_HEADERS {
-    DWORD Signature;
-    IMAGE_FILE_HEADER FileHeader;
-    IMAGE_OPTIONAL_HEADER OptionalHeader;
-} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
-
-
-// Directory Entries
-
-#define IMAGE_DIRECTORY_ENTRY_EXPORT         0   // Export Directory
-#define IMAGE_DIRECTORY_ENTRY_IMPORT         1   // Import Directory
-#define IMAGE_DIRECTORY_ENTRY_RESOURCE       2   // Resource Directory
-#define IMAGE_DIRECTORY_ENTRY_EXCEPTION      3   // Exception Directory
-#define IMAGE_DIRECTORY_ENTRY_SECURITY       4   // Security Directory
-#define IMAGE_DIRECTORY_ENTRY_BASERELOC      5   // Base Relocation Table
-#define IMAGE_DIRECTORY_ENTRY_DEBUG          6   // Debug Directory
-#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT      7   // Description String
-#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR      8   // Machine Value (MIPS GP)
-#define IMAGE_DIRECTORY_ENTRY_TLS            9   // TLS Directory
-#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG   10   // Load Configuration Directory
-#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT  11   // Bound Import Directory in headers
-#define IMAGE_DIRECTORY_ENTRY_IAT           12   // Import Address 
-//
-// Section header format.
-//
-
-#define IMAGE_SIZEOF_SHORT_NAME              8
-
-typedef struct _IMAGE_SECTION_HEADER {
-    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
-    union {
-            DWORD   PhysicalAddress;
-            DWORD   VirtualSize;
-    } Misc;
-    DWORD   VirtualAddress;
-    DWORD   SizeOfRawData;
-    DWORD   PointerToRawData;
-    DWORD   PointerToRelocations;
-    DWORD   PointerToLinenumbers;
-    WORD    NumberOfRelocations;
-    WORD    NumberOfLinenumbers;
-    DWORD   Characteristics;
-} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
-
-#define IMAGE_SIZEOF_SECTION_HEADER          40
-
-#define IMAGE_SECTION_CODE (0x20)
-#define IMAGE_SECTION_INITIALIZED_DATA (0x40)
-#define IMAGE_SECTION_UNINITIALIZED_DATA (0x80)
-
-//
-// Export Format
-//
-
-typedef struct _IMAGE_EXPORT_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    DWORD   Name;
-    DWORD   Base;
-    DWORD   NumberOfFunctions;
-    DWORD   NumberOfNames;
-    PDWORD  *AddressOfFunctions;
-    PDWORD  *AddressOfNames;
-    PWORD   *AddressOfNameOrdinals;
-} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
-
-//
-// Import Format
-//
-
-typedef struct _IMAGE_IMPORT_BY_NAME {
-    WORD    Hint;
-    BYTE    Name[1];
-} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
-
-#define IMAGE_ORDINAL_FLAG 0x80000000
-#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff)
-
-
-// Predefined resource types ... there may be some more, but I don't have
-//                               the information yet.  .....sang cho.....
-
-#define    RT_NEWRESOURCE   0x2000
-#define    RT_ERROR         0x7fff
-#define    NEWBITMAP        (RT_BITMAP|RT_NEWRESOURCE)
-#define    NEWMENU          (RT_MENU|RT_NEWRESOURCE)
-#define    NEWDIALOG        (RT_DIALOG|RT_NEWRESOURCE)
-
-
-//
-// Resource Format.
-//
-
-//
-// Resource directory consists of two counts, following by a variable length
-// array of directory entries.  The first count is the number of entries at
-// beginning of the array that have actual names associated with each entry.
-// The entries are in ascending order, case insensitive strings.  The second
-// count is the number of entries that immediately follow the named entries.
-// This second count identifies the number of entries that have 16-bit integer
-// Ids as their name.  These entries are also sorted in ascending order.
-//
-// This structure allows fast lookup by either name or number, but for any
-// given resource entry only one form of lookup is supported, not both.
-// This is consistant with the syntax of the .RC file and the .RES file.
-//
-
-
-//
-// Each directory contains the 32-bit Name of the entry and an offset,
-// relative to the beginning of the resource directory of the data associated
-// with this directory entry.  If the name of the entry is an actual text
-// string instead of an integer Id, then the high order bit of the name field
-// is set to one and the low order 31-bits are an offset, relative to the
-// beginning of the resource directory of the string, which is of type
-// IMAGE_RESOURCE_DIRECTORY_STRING.  Otherwise the high bit is clear and the
-// low-order 16-bits are the integer Id that identify this resource directory
-// entry. If the directory entry is yet another resource directory (i.e. a
-// subdirectory), then the high order bit of the offset field will be
-// set to indicate this.  Otherwise the high bit is clear and the offset
-// field points to a resource data entry.
-//
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
-    DWORD    Name;
-    DWORD    OffsetToData;
-} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
-
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    WORD    NumberOfNamedEntries;
-    WORD    NumberOfIdEntries;
-    IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[0];
-} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
-
-#define IMAGE_RESOURCE_NAME_IS_STRING        0x80000000
-#define IMAGE_RESOURCE_DATA_IS_DIRECTORY     0x80000000
-
-
-
-//
-// For resource directory entries that have actual string names, the Name
-// field of the directory entry points to an object of the following type.
-// All of these string objects are stored together after the last resource
-// directory entry and before the first resource data object.  This minimizes
-// the impact of these variable length objects on the alignment of the fixed
-// size directory entry objects.
-//
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
-    WORD    Length;
-    CHAR    NameString[ 1 ];
-} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
-
-
-typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
-    WORD    Length;
-    WCHAR   NameString[ 1 ];
-} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
-
-
-//
-// Each resource data entry describes a leaf node in the resource directory
-// tree.  It contains an offset, relative to the beginning of the resource
-// directory of the data for the resource, a size field that gives the number
-// of bytes of data at that offset, a CodePage that should be used when
-// decoding code point values within the resource data.  Typically for new
-// applications the code page would be the unicode code page.
-//
-
-typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
-    DWORD   OffsetToData;
-    DWORD   Size;
-    DWORD   CodePage;
-    DWORD   Reserved;
-} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
-
-
-//  Menu Resources      ... added by .....sang cho....
-
-// Menu resources are composed of a menu header followed by a sequential list
-// of menu items. There are two types of menu items: pop-ups and normal menu
-// itmes. The MENUITEM SEPARATOR is a special case of a normal menu item with
-// an empty name, zero ID, and zero flags.
-
-typedef struct _IMAGE_MENU_HEADER{
-    WORD   wVersion;     // Currently zero
-       WORD   cbHeaderSize;  // Also zero
-} IMAGE_MENU_HEADER, *PIMAGE_MENU_HEADER;
-
-typedef struct _IMAGE_POPUP_MENU_ITEM{
-    WORD   fItemFlags; 
-       WCHAR  szItemText[1];
-} IMAGE_POPUP_MENU_ITEM, *PIMAGE_POPUP_MENU_ITEM;
-
-typedef struct _IMAGE_NORMAL_MENU_ITEM{
-    WORD   fItemFlags; 
-       WORD   wMenuID;
-       WCHAR  szItemText[1];
-} IMAGE_NORMAL_MENU_ITEM, *PIMAGE_NORMAL_MENU_ITEM;
-
-#define MI_GRAYED       0x0001 // GRAYED keyword
-#define MI_INACTIVE     0x0002 // INACTIVE keyword
-#define MI_BITMAP       0x0004 // BITMAP keyword
-#define MI_OWNERDRAW    0x0100 // OWNERDRAW keyword
-#define MI_CHECKED      0x0008 // CHECKED keyword
-#define MI_POPUP        0x0010 // used internally
-#define MI_MENUBARBREAK 0x0020 // MENUBARBREAK keyword
-#define MI_MENUBREAK    0x0040 // MENUBREAK keyword
-#define MI_ENDMENU      0x0080 // used internally
-
-// Dialog Box Resources        .................. added by sang cho.
-
-// A dialog box is contained in a single resource and has a header and 
-// a portion repeated for each control in the dialog box.
-// The item DWORD IStyle is a standard window style composed of flags found
-// in WINDOWS.H.
-// The default style for a dialog box is:
-// WS_POPUP | WS_BORDER | WS_SYSMENU
-// 
-// The itme marked "Name or Ordinal" are :
-// If the first word is an 0xffff, the next two bytes contain an ordinal ID.
-// Otherwise, the first one or more WORDS contain a double-null-terminated string.
-// An empty string is represented by a single WORD zero in the first location.
-// 
-// The WORD wPointSize and WCHAR szFontName entries are present if the FONT
-// statement was included for the dialog box. This can be detected by checking
-// the entry IStyle. If IStyle & DS_SETFONT ( which is 0x40), then these
-// entries will be present.
-
-typedef struct _IMAGE_DIALOG_BOX_HEADER1{
-    DWORD  IStyle;
-       DWORD  IExtendedStyle;    // New for Windows NT
-       WORD   nControls;         // Number of Controls
-       WORD   x;
-       WORD   y;
-       WORD   cx;
-       WORD   cy;
-//     N_OR_O MenuName;         // Name or Ordinal ID
-//     N_OR_O ClassName;                // Name or Ordinal ID
-//     WCHAR  szCaption[];
-//     WORD   wPointSize;       // Only here if FONT set for dialog
-//     WCHAR  szFontName[];     // This too
-} IMAGE_DIALOG_HEADER, *PIMAGE_DIALOG_HEADER;
-
-typedef union _NAME_OR_ORDINAL{    // Name or Ordinal ID
-       struct _ORD_ID{
-           WORD   flgId;
-        WORD   Id;
-       } ORD_ID;
-       WCHAR  szName[1];      
-} NAME_OR_ORDINAL, *PNAME_OR_ORDINAL;
-
-// The data for each control starts on a DWORD boundary (which may require
-// some padding from the previous control), and its format is as follows:
-
-typedef struct _IMAGE_CONTROL_DATA{
-    DWORD   IStyle;
-       DWORD   IExtendedStyle;
-       WORD    x;
-       WORD    y;
-       WORD    cx;
-       WORD    cy;
-       WORD    wId;
-//  N_OR_O  ClassId;
-//  N_OR_O  Text;
-//  WORD    nExtraStuff;
-} IMAGE_CONTROL_DATA, *PIMAGE_CONTROL_DATA;
-
-#define BUTTON       0x80
-#define EDIT         0x81
-#define STATIC       0x82
-#define LISTBOX      0x83
-#define SCROLLBAR    0x84
-#define COMBOBOX     0x85
-
-// The various statements used in a dialog script are all mapped to these
-// classes along with certain modifying styles. The values for these styles
-// can be found in WINDOWS.H. All dialog controls have the default styles
-// of WS_CHILD and WS_VISIBLE. A list of the default styles used follows:
-//
-// Statement           Default Class         Default Styles
-// CONTROL             None                  WS_CHILD|WS_VISIBLE
-// LTEXT               STATIC                ES_LEFT
-// RTEXT               STATIC                ES_RIGHT
-// CTEXT               STATIC                ES_CENTER
-// LISTBOX             LISTBOX               WS_BORDER|LBS_NOTIFY
-// CHECKBOX            BUTTON                BS_CHECKBOX|WS_TABSTOP
-// PUSHBUTTON          BUTTON                BS_PUSHBUTTON|WS_TABSTOP
-// GROUPBOX            BUTTON                BS_GROUPBOX
-// DEFPUSHBUTTON       BUTTON                BS_DFPUSHBUTTON|WS_TABSTOP
-// RADIOBUTTON         BUTTON                BS_RADIOBUTTON
-// AUTOCHECKBOX        BUTTON                BS_AUTOCHECKBOX
-// AUTO3STATE          BUTTON                BS_AUTO3STATE
-// AUTORADIOBUTTON     BUTTON                BS_AUTORADIOBUTTON
-// PUSHBOX             BUTTON                BS_PUSHBOX
-// STATE3              BUTTON                BS_3STATE
-// EDITTEXT            EDIT                  ES_LEFT|WS_BORDER|WS_TABSTOP
-// COMBOBOX            COMBOBOX              None
-// ICON                STATIC                SS_ICON
-// SCROLLBAR           SCROLLBAR             None
-///
-
-//
-// Debug Format
-//
-
-typedef struct _IMAGE_DEBUG_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    DWORD   Type;
-    DWORD   SizeOfData;
-    DWORD   AddressOfRawData;
-    DWORD   PointerToRawData;
-} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
-
-#define IMAGE_DEBUG_TYPE_UNKNOWN          0
-#define IMAGE_DEBUG_TYPE_COFF             1
-#define IMAGE_DEBUG_TYPE_CODEVIEW         2
-#define IMAGE_DEBUG_TYPE_FPO              3
-#define IMAGE_DEBUG_TYPE_MISC             4
-#define IMAGE_DEBUG_TYPE_EXCEPTION        5
-#define IMAGE_DEBUG_TYPE_FIXUP            6
-#define IMAGE_DEBUG_TYPE_OMAP_TO_SRC      7
-#define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC    8
-
-
-typedef struct _IMAGE_DEBUG_MISC {
-    DWORD       DataType;               // type of misc data, see defines
-    DWORD       Length;                 // total length of record, rounded to four
-                                        // byte multiple.
-    BOOL        Unicode;                // TRUE if data is unicode string
-    BYTE        Reserved[ 3 ];
-    BYTE        Data[ 1 ];              // Actual data
-} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
-
-
-//
-// Debugging information can be stripped from an image file and placed
-// in a separate .DBG file, whose file name part is the same as the
-// image file name part (e.g. symbols for CMD.EXE could be stripped
-// and placed in CMD.DBG).  This is indicated by the IMAGE_FILE_DEBUG_STRIPPED
-// flag in the Characteristics field of the file header.  The beginning of
-// the .DBG file contains the following structure which captures certain
-// information from the image file.  This allows a debug to proceed even if
-// the original image file is not accessable.  This header is followed by
-// zero of more IMAGE_SECTION_HEADER structures, followed by zero or more
-// IMAGE_DEBUG_DIRECTORY structures.  The latter structures and those in
-// the image file contain file offsets relative to the beginning of the
-// .DBG file.
-//
-// If symbols have been stripped from an image, the IMAGE_DEBUG_MISC structure
-// is left in the image file, but not mapped.  This allows a debugger to
-// compute the name of the .DBG file, from the name of the image in the
-// IMAGE_DEBUG_MISC structure.
-//
-
-typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
-    WORD        Signature;
-    WORD        Flags;
-    WORD        Machine;
-    WORD        Characteristics;
-    DWORD       TimeDateStamp;
-    DWORD       CheckSum;
-    DWORD       ImageBase;
-    DWORD       SizeOfImage;
-    DWORD       NumberOfSections;
-    DWORD       ExportedNamesSize;
-    DWORD       DebugDirectorySize;
-    DWORD       SectionAlignment;
-    DWORD       Reserved[2];
-} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
-
-#define IMAGE_SEPARATE_DEBUG_SIGNATURE  0x4944
-
-#define IMAGE_SEPARATE_DEBUG_FLAGS_MASK 0x8000
-#define IMAGE_SEPARATE_DEBUG_MISMATCH   0x8000  // when DBG was updated, the
-                                                // old checksum didn't match.
-
-//
-// End Image Format
-//
-
-#define SIZE_OF_NT_SIGNATURE   sizeof (DWORD)
-#define MAXRESOURCENAME        13
-
-/* global macros to define header offsets into file */
-/* offset to PE file signature                                */
-#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a                  +  \
-                       ((PIMAGE_DOS_HEADER)a)->e_lfanew))
-
-/* DOS header identifies the NT PEFile signature dword
-   the PEFILE header exists just after that dword             */
-#define PEFHDROFFSET(a) ((LPVOID)((BYTE *)a                 +  \
-                        ((PIMAGE_DOS_HEADER)a)->e_lfanew    +  \
-                        SIZE_OF_NT_SIGNATURE))
-
-/* PE optional header is immediately after PEFile header       */
-#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a                 +  \
-                        ((PIMAGE_DOS_HEADER)a)->e_lfanew    +  \
-                        SIZE_OF_NT_SIGNATURE                +  \
-                        sizeof (IMAGE_FILE_HEADER)))
-
-/* section headers are immediately after PE optional header    */
-#define SECHDROFFSET(a) ((LPVOID)((BYTE *)a                 +  \
-                        ((PIMAGE_DOS_HEADER)a)->e_lfanew    +  \
-                        SIZE_OF_NT_SIGNATURE                +  \
-                        sizeof (IMAGE_FILE_HEADER)          +  \
-                        sizeof (IMAGE_OPTIONAL_HEADER)))
-
-#define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr) + (DWORD)(addValue))
-
-typedef struct _IMAGE_IMPORT_MODULE_DIRECTORY
-{
-  DWORD    dwRVAFunctionNameList;
-  DWORD    dwUseless1;
-  DWORD    dwUseless2;
-  DWORD    dwRVAModuleName;
-  DWORD    dwRVAFunctionAddressList;
-} IMAGE_IMPORT_MODULE_DIRECTORY, *PIMAGE_IMPORT_MODULE_DIRECTORY;
-
-typedef struct _RELOCATION_DIRECTORY
-{
-    DWORD  VirtualAddress; /* adresse virtuelle du bloc ou se font les relocations */
-    DWORD   SizeOfBlock;    // taille de cette structure + des structures
-                       // relocation_entry qui suivent (ces dernieres sont
-                       // donc au nombre de (SizeOfBlock-8)/2
-} RELOCATION_DIRECTORY, *PRELOCATION_DIRECTORY;
-
-typedef struct _RELOCATION_ENTRY
-{
-    WORD    TypeOffset;
-       //      (TypeOffset >> 12) est le type
-       //      (TypeOffset&0xfff) est l'offset dans le bloc
-} RELOCATION_ENTRY, *PRELOCATION_ENTRY;
-
-#define        TYPE_RELOC_ABSOLUTE     0
-#define        TYPE_RELOC_HIGH         1
-#define        TYPE_RELOC_LOW          2
-#define        TYPE_RELOC_HIGHLOW      3
-#define        TYPE_RELOC_HIGHADJ      4
-#define        TYPE_RELOC_MIPS_JMPADDR 5
-
similarity index 58%
rename from freeldr/freeldr/rosboot.c
rename to freeldr/freeldr/reactos.c
index e875082..c44afa5 100644 (file)
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-
+       
 #include "freeldr.h"
 #include "asmcode.h"
-#include "rosboot.h"
+#include "reactos.h"
 #include "stdlib.h"
 #include "fs.h"
 #include "tui.h"
 #include "multiboot.h"
+#include "arcname.h"
 
-
-static BOOL
-DissectArcPath(char *ArcPath, char *BootPath, unsigned int *BootDrive, unsigned int *BootPartition);
-
-
-unsigned long                          next_module_load_base = 0;
+BOOL   LoadReactOSKernel(char *OperatingSystemName);
+BOOL   LoadReactOSDrivers(char *OperatingSystemName);
 
 void LoadAndBootReactOS(char *OperatingSystemName)
 {
-       FILE    file;
-       char    name[1024];
-       char    value[1024];
-       char    szFileName[1024];
+       FILE            file;
+       char            name[1024];
+       char            value[1024];
+       char            szFileName[1024];
        char    szBootPath[256];
        int                     i;
        int                     nNumDriverFiles=0;
@@ -58,7 +55,6 @@ void LoadAndBootReactOS(char *OperatingSystemName)
        mb_info.mmap_length = 0;
        mb_info.mmap_addr = 0;
 
-
        /*
         * Make sure the system path is set in the .ini file
         */
@@ -78,7 +74,6 @@ void LoadAndBootReactOS(char *OperatingSystemName)
                return;
        }
 
-
        /* set boot drive and partition */
        ((char *)(&mb_info.boot_device))[0] = (char)BootDrive;
        ((char *)(&mb_info.boot_device))[1] = (char)BootPartition;
@@ -109,7 +104,6 @@ void LoadAndBootReactOS(char *OperatingSystemName)
                return;
        }
 
-
        DrawBackdrop();
 
        DrawStatusText(" Loading...");
@@ -188,7 +182,8 @@ void LoadAndBootReactOS(char *OperatingSystemName)
                        /*
                         * Set the name and try to open the PE image
                         */
-                       strcpy(szFileName, value);
+                       strcpy(szFileName, szBootPath);
+                       strcat(szFileName, value);
                        if (!OpenFile(szFileName, &file))
                        {
                                strcat(value, " not found.");
@@ -251,166 +246,6 @@ void LoadAndBootReactOS(char *OperatingSystemName)
         * Now boot the kernel
         */
        stop_floppy();
-       boot_ros();
-}
-
-BOOL MultiBootLoadKernel(FILE *KernelImage)
-{
-       DWORD                           ImageHeaders[2048];
-       int                                     Idx;
-       DWORD                           dwHeaderChecksum;
-       DWORD                           dwFileLoadOffset;
-       DWORD                           dwDataSize;
-       DWORD                           dwBssSize;
-
-       /*
-        * Load the first 8192 bytes of the kernel image
-        * so we can search for the multiboot header
-        */
-       ReadFile(KernelImage, 8192, ImageHeaders);
-
-       /*
-        * Now find the multiboot header and copy it
-        */
-       for (Idx=0; Idx<2048; Idx++)
-       {
-               // Did we find it?
-               if (ImageHeaders[Idx] == MULTIBOOT_HEADER_MAGIC)
-               {
-                       // Yes, copy it and break out of this loop
-                       memcpy(&mb_header, &ImageHeaders[Idx], sizeof(multiboot_header_t));
-
-                       break;
-               }
-       }
-
-       /*
-        * If we reached the end of the 8192 bytes without
-        * finding the multiboot header then return error
-        */
-       if (Idx == 2048)
-       {
-               MessageBox("No multiboot header found!");
-               return FALSE;
-       }
-
-       /*printf("multiboot header:\n");
-       printf("0x%x\n", mb_header.magic);
-       printf("0x%x\n", mb_header.flags);
-       printf("0x%x\n", mb_header.checksum);
-       printf("0x%x\n", mb_header.header_addr);
-       printf("0x%x\n", mb_header.load_addr);
-       printf("0x%x\n", mb_header.load_end_addr);
-       printf("0x%x\n", mb_header.bss_end_addr);
-       printf("0x%x\n", mb_header.entry_addr);
-       getch();*/
-
-       /*
-        * Calculate the checksum and make sure it matches
-        */
-       dwHeaderChecksum = mb_header.magic;
-       dwHeaderChecksum += mb_header.flags;
-       dwHeaderChecksum += mb_header.checksum;
-       if (dwHeaderChecksum != 0)
-       {
-               MessageBox("Multiboot header checksum invalid!");
-               return FALSE;
-       }
-       
-       /*
-        * Get the file offset, this should be 0, and move the file pointer
-        */
-       dwFileLoadOffset = (Idx * sizeof(DWORD)) - (mb_header.header_addr - mb_header.load_addr);
-       fseek(KernelImage, dwFileLoadOffset);
-       
-       /*
-        * Load the file image
-        */
-       dwDataSize = (mb_header.load_end_addr - mb_header.load_addr);
-       ReadFile(KernelImage, dwDataSize, (void*)mb_header.load_addr);
-
-       /*
-        * Initialize bss area
-        */
-       dwBssSize = (mb_header.bss_end_addr - mb_header.load_end_addr);
-       memset((void*)mb_header.load_end_addr, 0, dwBssSize);
-
-       next_module_load_base = ROUND_UP(mb_header.bss_end_addr, /*PAGE_SIZE*/4096);
-
-       return TRUE;
-}
-
-BOOL MultiBootLoadModule(FILE *ModuleImage, char *ModuleName)
-{
-       DWORD           dwModuleSize;
-       module_t*       pModule = &multiboot_modules[mb_info.mods_count];
-       char*           ModuleNameString = multiboot_module_strings[mb_info.mods_count];
-
-       dwModuleSize = GetFileSize(ModuleImage);
-       pModule->mod_start = next_module_load_base;
-       pModule->mod_end = next_module_load_base + dwModuleSize;
-       strcpy(ModuleNameString, ModuleName);
-       pModule->string = (unsigned long)ModuleNameString;
-       
-       /*
-        * Load the file image
-        */
-       ReadFile(ModuleImage, dwModuleSize, (void*)next_module_load_base);
-
-       next_module_load_base = ROUND_UP(pModule->mod_end, /*PAGE_SIZE*/4096);
-       mb_info.mods_count++;
-
-       return TRUE;
+       boot_reactos();
 }
 
-
-static BOOL
-DissectArcPath(char *ArcPath, char *BootPath, unsigned int *BootDrive, unsigned int *BootPartition)
-{
-       char *p;
-
-       if (_strnicmp(ArcPath, "multi(0)disk(0)", 15) != 0)
-               return FALSE;
-
-       p = ArcPath + 15;
-       if (_strnicmp(p, "fdisk(", 6) == 0)
-       {
-               /*
-                * floppy disk path:
-                *  multi(0)disk(0)fdisk(x)\path
-                */
-               p = p + 6;
-               *BootDrive = atoi(p);
-               p = strchr(p, ')');
-               if (p == NULL)
-                       return FALSE;
-               p++;
-               *BootPartition = 0;
-       }
-       else if (_strnicmp(p, "rdisk(", 6) == 0)
-       {
-               /*
-                * hard disk path:
-                *  multi(0)disk(0)rdisk(x)partition(y)\path
-                */
-               p = p + 6;
-               *BootDrive = atoi(p) + 0x80;
-               p = strchr(p, ')');
-               if ((p == NULL) || (_strnicmp(p, ")partition(", 11) != 0))
-                       return FALSE;
-               p = p + 11;
-               *BootPartition = atoi(p);
-               p = strchr(p, ')');
-               if ((p == NULL) || (*BootPartition == 0))
-                       return FALSE;
-               p++;
-       }
-       else
-       {
-               return FALSE;
-       }
-
-       strcpy(BootPath, p);
-
-       return TRUE;
-}
similarity index 52%
rename from freeldr/freeldr/rosboot.h
rename to freeldr/freeldr/reactos.h
index 499a513..c2928da 100644 (file)
 #ifndef __ROSBOOT_H
 #define __ROSBOOT_H
 
-#include "freeldr.h"
-#include "stdlib.h"
-#include "pe.h"
-
-#define PACKED __attribute__((packed))
-
-#define MB_INFO_FLAG_MEM_SIZE                  0x00000001
-#define MB_INFO_FLAG_BOOT_DEVICE               0x00000002
-#define MB_INFO_FLAG_COMMAND_LINE              0x00000004
-#define MB_INFO_FLAG_MODULES                   0x00000008
-#define MB_INFO_FLAG_AOUT_SYMS                 0x00000010
-#define MB_INFO_FLAG_ELF_SYMS                  0x00000020
-#define MB_INFO_FLAG_MEMORY_MAP                        0x00000040
-#define MB_INFO_FLAG_DRIVES                            0x00000080
-#define MB_INFO_FLAG_CONFIG_TABLE              0x00000100
-#define MB_INFO_FLAG_BOOT_LOADER_NAME  0x00000200
-#define MB_INFO_FLAG_APM_TABLE                 0x00000400
-#define MB_INFO_FLAG_GRAPHICS_TABLE            0x00000800
 
 void   LoadAndBootReactOS(char *OperatingSystemName);
-BOOL   MultiBootLoadKernel(FILE *KernelImage);
-BOOL   MultiBootLoadModule(FILE *ModuleImage, char *ModuleName);
-void   enable_a20(void);
-void   boot_ros(void);
 
 
 #endif // defined __ROSBOOT_H
\ No newline at end of file