From 1d9101d6ea7433bb451c69702493e5f46d19df64 Mon Sep 17 00:00:00 2001 From: Brian Palmer Date: Fri, 8 Jun 2001 23:12:40 +0000 Subject: [PATCH] Separated multiboot kernel loader and reactos kernel loader so that support for other operating systems can be added svn path=/trunk/; revision=1953 --- freeldr/freeldr/Makefile | 29 +- freeldr/freeldr/arcname.c | 75 +++ freeldr/freeldr/arcname.h | 29 ++ freeldr/freeldr/asmcode.S | 1 + freeldr/freeldr/asmcode.h | 8 + freeldr/freeldr/boot.S | 4 +- freeldr/freeldr/freeldr.c | 4 +- freeldr/freeldr/{multiboot.S => mb.S} | 4 +- freeldr/freeldr/menu.c | 2 + freeldr/freeldr/multiboot.c | 157 ++++++ freeldr/freeldr/multiboot.h | 37 +- freeldr/freeldr/pe.h | 593 ----------------------- freeldr/freeldr/{rosboot.c => reactos.c} | 189 +------- freeldr/freeldr/{rosboot.h => reactos.h} | 22 - 14 files changed, 342 insertions(+), 812 deletions(-) create mode 100644 freeldr/freeldr/arcname.c create mode 100644 freeldr/freeldr/arcname.h rename freeldr/freeldr/{multiboot.S => mb.S} (98%) create mode 100644 freeldr/freeldr/multiboot.c delete mode 100644 freeldr/freeldr/pe.h rename freeldr/freeldr/{rosboot.c => reactos.c} (58%) rename freeldr/freeldr/{rosboot.h => reactos.h} (53%) diff --git a/freeldr/freeldr/Makefile b/freeldr/freeldr/Makefile index b05b180a069..06aedc5cc95 100644 --- a/freeldr/freeldr/Makefile +++ b/freeldr/freeldr/Makefile @@ -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 index 00000000000..be974ffcf61 --- /dev/null +++ b/freeldr/freeldr/arcname.c @@ -0,0 +1,75 @@ +/* + * FreeLoader - arcname.c + * + * Copyright (C) 2001 Brian Palmer + * 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 index 00000000000..ae68b99903d --- /dev/null +++ b/freeldr/freeldr/arcname.h @@ -0,0 +1,29 @@ +/* + * FreeLoader - arcname.h + * + * Copyright (C) 2001 Brian Palmer + * 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 diff --git a/freeldr/freeldr/asmcode.S b/freeldr/freeldr/asmcode.S index e4c6f1d9ec4..440a233fe5f 100644 --- a/freeldr/freeldr/asmcode.S +++ b/freeldr/freeldr/asmcode.S @@ -20,6 +20,7 @@ .text .code16 +#define ASM #include "asmcode.h" diff --git a/freeldr/freeldr/asmcode.h b/freeldr/freeldr/asmcode.h index 5ab2b7247ca..11dd28a7318 100644 --- a/freeldr/freeldr/asmcode.h +++ b/freeldr/freeldr/asmcode.h @@ -55,3 +55,11 @@ /* Makes "x" a global variable or label */ #define EXTERN(x) .global x; x: + + + +#ifndef ASM + +void enable_a20(void); + +#endif /* ! ASM */ diff --git a/freeldr/freeldr/boot.S b/freeldr/freeldr/boot.S index c8f5124dbea..6005e312eeb 100644 --- a/freeldr/freeldr/boot.S +++ b/freeldr/freeldr/boot.S @@ -1,6 +1,6 @@ /* * FreeLoader - * Copyright (C) 1999, 2000 Brian Palmer + * Copyright (C) 1999, 2000, 2001 Brian Palmer * * 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 diff --git a/freeldr/freeldr/freeldr.c b/freeldr/freeldr/freeldr.c index c36415fe96d..2d5302a0600 100644 --- a/freeldr/freeldr/freeldr.c +++ b/freeldr/freeldr/freeldr.c @@ -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."); diff --git a/freeldr/freeldr/multiboot.S b/freeldr/freeldr/mb.S similarity index 98% rename from freeldr/freeldr/multiboot.S rename to freeldr/freeldr/mb.S index d22044a7db3..5a0c273ef64 100644 --- a/freeldr/freeldr/multiboot.S +++ b/freeldr/freeldr/mb.S @@ -20,14 +20,16 @@ .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 diff --git a/freeldr/freeldr/menu.c b/freeldr/freeldr/menu.c index 90846db4ba4..4b81045fbdb 100644 --- a/freeldr/freeldr/menu.c +++ b/freeldr/freeldr/menu.c @@ -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 index 00000000000..32cd67d40c8 --- /dev/null +++ b/freeldr/freeldr/multiboot.c @@ -0,0 +1,157 @@ +/* + * FreeLoader + * Copyright (C) 1999, 2000, 2001 Brian Palmer + * + * 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 diff --git a/freeldr/freeldr/multiboot.h b/freeldr/freeldr/multiboot.h index fbd58790076..e557d78b607 100644 --- a/freeldr/freeldr/multiboot.h +++ b/freeldr/freeldr/multiboot.h @@ -40,6 +40,21 @@ # 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; + +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); + +BOOL MultiBootLoadKernel(FILE *KernelImage); +BOOL MultiBootLoadModule(FILE *ModuleImage, char *ModuleName); +int GetBootPartition(char *OperatingSystemName); + + #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 - - #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 index c1454f9c7b3..00000000000 --- a/freeldr/freeldr/pe.h +++ /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 - diff --git a/freeldr/freeldr/rosboot.c b/freeldr/freeldr/reactos.c similarity index 58% rename from freeldr/freeldr/rosboot.c rename to freeldr/freeldr/reactos.c index e875082bf16..c44afa55705 100644 --- a/freeldr/freeldr/rosboot.c +++ b/freeldr/freeldr/reactos.c @@ -17,28 +17,25 @@ * 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(); + boot_reactos(); } -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; -} - - -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; -} diff --git a/freeldr/freeldr/rosboot.h b/freeldr/freeldr/reactos.h similarity index 53% rename from freeldr/freeldr/rosboot.h rename to freeldr/freeldr/reactos.h index 499a513e62f..c2928daf2ab 100644 --- a/freeldr/freeldr/rosboot.h +++ b/freeldr/freeldr/reactos.h @@ -20,30 +20,8 @@ #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