mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
Separated multiboot kernel loader and reactos kernel loader so that support for other operating systems can be added
svn path=/trunk/; revision=1953
This commit is contained in:
parent
4c1911c2ca
commit
1d9101d6ea
14 changed files with 342 additions and 812 deletions
|
@ -28,10 +28,11 @@ export CP = cmd /C copy
|
||||||
FLAGS = -Wall -fno-builtin
|
FLAGS = -Wall -fno-builtin
|
||||||
|
|
||||||
# asmcode.o has to be first in the link line because it contains the startup code
|
# 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 \
|
OBJS = asmcode.a asmcode.o mb.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
|
reactos.o tui.o menu.o miscboot.o options.o linux.o multiboot.o arcname.o
|
||||||
ASM_OBJS = asmcode.o multiboot.o boot.o
|
ASM_OBJS = asmcode.o mb.o boot.o
|
||||||
C_OBJS = freeldr.o stdlib.o fs.a rosboot.o tui.o menu.o miscboot.o options.o linux.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
|
all: freeldr.sys
|
||||||
|
|
||||||
|
@ -47,7 +48,7 @@ c_code.a: $(C_OBJS)
|
||||||
asmcode.o: asmcode.S asmcode.h Makefile
|
asmcode.o: asmcode.S asmcode.h Makefile
|
||||||
$(CC) $(FLAGS) -o asmcode.o -c asmcode.S
|
$(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
|
$(CC) $(FLAGS) -o freeldr.o -c freeldr.c
|
||||||
|
|
||||||
stdlib.o: stdlib.c freeldr.h stdlib.h Makefile
|
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
|
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
|
$(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
|
reactos.o: reactos.c freeldr.h reactos.h stdlib.h fs.h tui.h multiboot.h Makefile
|
||||||
$(CC) $(FLAGS) -o rosboot.o -c rosboot.c
|
$(CC) $(FLAGS) -o reactos.o -c reactos.c
|
||||||
|
|
||||||
multiboot.o: multiboot.S asmcode.h multiboot.h Makefile
|
multiboot.o: multiboot.c freeldr.h stdlib.h fs.h multiboot.h tui.h Makefile
|
||||||
$(CC) $(FLAGS) -o multiboot.o -c multiboot.S
|
$(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
|
tui.o: tui.c freeldr.h stdlib.h tui.h Makefile
|
||||||
$(CC) $(FLAGS) -o tui.o -c tui.c
|
$(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
|
linux.o: linux.c freeldr.h stdlib.h tui.h linux.h Makefile
|
||||||
$(CC) $(FLAGS) -o linux.o -c linux.c
|
$(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:
|
clean:
|
||||||
$(RM) $(OBJS)
|
$(RM) *.o
|
||||||
|
$(RM) *.a
|
||||||
|
$(RM) freeldr.sys
|
||||||
|
|
75
freeldr/freeldr/arcname.c
Normal file
75
freeldr/freeldr/arcname.c
Normal file
|
@ -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;
|
||||||
|
}
|
29
freeldr/freeldr/arcname.h
Normal file
29
freeldr/freeldr/arcname.h
Normal file
|
@ -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
|
|
@ -20,6 +20,7 @@
|
||||||
.text
|
.text
|
||||||
.code16
|
.code16
|
||||||
|
|
||||||
|
#define ASM
|
||||||
#include "asmcode.h"
|
#include "asmcode.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -55,3 +55,11 @@
|
||||||
/* Makes "x" a global variable or label */
|
/* Makes "x" a global variable or label */
|
||||||
#define EXTERN(x) .global x; x:
|
#define EXTERN(x) .global x; x:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef ASM
|
||||||
|
|
||||||
|
void enable_a20(void);
|
||||||
|
|
||||||
|
#endif /* ! ASM */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* FreeLoader
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -20,7 +20,9 @@
|
||||||
.text
|
.text
|
||||||
.code16
|
.code16
|
||||||
|
|
||||||
|
#define ASM
|
||||||
#include "asmcode.h"
|
#include "asmcode.h"
|
||||||
|
#include "multiboot.h"
|
||||||
|
|
||||||
|
|
||||||
.code32
|
.code32
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include "freeldr.h"
|
#include "freeldr.h"
|
||||||
#include "stdlib.h"
|
#include "stdlib.h"
|
||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
#include "rosboot.h"
|
#include "reactos.h"
|
||||||
#include "tui.h"
|
#include "tui.h"
|
||||||
#include "asmcode.h"
|
#include "asmcode.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
|
@ -114,6 +114,8 @@ void BootMain(void)
|
||||||
LoadAndBootDrive(nOSToBoot);
|
LoadAndBootDrive(nOSToBoot);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DrawBackdrop()
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageBox("Press any key to reboot.");
|
MessageBox("Press any key to reboot.");
|
||||||
|
|
|
@ -20,14 +20,16 @@
|
||||||
.text
|
.text
|
||||||
.code16
|
.code16
|
||||||
|
|
||||||
|
#define ASM
|
||||||
#include "asmcode.h"
|
#include "asmcode.h"
|
||||||
|
#include "multiboot.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Here we assume the kernel is loaded at 1mb
|
* Here we assume the kernel is loaded at 1mb
|
||||||
* This boots the kernel
|
* This boots the kernel
|
||||||
*/
|
*/
|
||||||
.code32
|
.code32
|
||||||
EXTERN(_boot_ros)
|
EXTERN(_boot_reactos)
|
||||||
call switch_to_real
|
call switch_to_real
|
||||||
.code16
|
.code16
|
||||||
|
|
|
@ -141,6 +141,8 @@ void InitMenu(void)
|
||||||
nOSListBoxRight = nOSListBoxLeft + width;
|
nOSListBoxRight = nOSListBoxLeft + width;
|
||||||
nOSListBoxTop = (nScreenHeight - height) / 2 + 1;
|
nOSListBoxTop = (nScreenHeight - height) / 2 + 1;
|
||||||
nOSListBoxBottom = nOSListBoxTop + height;
|
nOSListBoxBottom = nOSListBoxTop + height;
|
||||||
|
|
||||||
|
nOSSelected = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawMenu(void)
|
void DrawMenu(void)
|
||||||
|
|
157
freeldr/freeldr/multiboot.c
Normal file
157
freeldr/freeldr/multiboot.c
Normal file
|
@ -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;
|
||||||
|
}
|
|
@ -40,6 +40,21 @@
|
||||||
# define EXT_C(sym) sym
|
# define EXT_C(sym) sym
|
||||||
#endif
|
#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
|
#ifndef ASM
|
||||||
/* Do not include here in boot.S. */
|
/* Do not include here in boot.S. */
|
||||||
|
|
||||||
|
@ -116,14 +131,22 @@ typedef struct memory_map
|
||||||
unsigned long type;
|
unsigned long type;
|
||||||
} memory_map_t;
|
} 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 */
|
#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
|
#endif // defined __MULTIBOOT_H
|
|
@ -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
|
|
||||||
|
|
|
@ -17,28 +17,25 @@
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "freeldr.h"
|
#include "freeldr.h"
|
||||||
#include "asmcode.h"
|
#include "asmcode.h"
|
||||||
#include "rosboot.h"
|
#include "reactos.h"
|
||||||
#include "stdlib.h"
|
#include "stdlib.h"
|
||||||
#include "fs.h"
|
#include "fs.h"
|
||||||
#include "tui.h"
|
#include "tui.h"
|
||||||
#include "multiboot.h"
|
#include "multiboot.h"
|
||||||
|
#include "arcname.h"
|
||||||
|
|
||||||
|
BOOL LoadReactOSKernel(char *OperatingSystemName);
|
||||||
static BOOL
|
BOOL LoadReactOSDrivers(char *OperatingSystemName);
|
||||||
DissectArcPath(char *ArcPath, char *BootPath, unsigned int *BootDrive, unsigned int *BootPartition);
|
|
||||||
|
|
||||||
|
|
||||||
unsigned long next_module_load_base = 0;
|
|
||||||
|
|
||||||
void LoadAndBootReactOS(char *OperatingSystemName)
|
void LoadAndBootReactOS(char *OperatingSystemName)
|
||||||
{
|
{
|
||||||
FILE file;
|
FILE file;
|
||||||
char name[1024];
|
char name[1024];
|
||||||
char value[1024];
|
char value[1024];
|
||||||
char szFileName[1024];
|
char szFileName[1024];
|
||||||
char szBootPath[256];
|
char szBootPath[256];
|
||||||
int i;
|
int i;
|
||||||
int nNumDriverFiles=0;
|
int nNumDriverFiles=0;
|
||||||
|
@ -58,7 +55,6 @@ void LoadAndBootReactOS(char *OperatingSystemName)
|
||||||
mb_info.mmap_length = 0;
|
mb_info.mmap_length = 0;
|
||||||
mb_info.mmap_addr = 0;
|
mb_info.mmap_addr = 0;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure the system path is set in the .ini file
|
* Make sure the system path is set in the .ini file
|
||||||
*/
|
*/
|
||||||
|
@ -78,7 +74,6 @@ void LoadAndBootReactOS(char *OperatingSystemName)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* set boot drive and partition */
|
/* set boot drive and partition */
|
||||||
((char *)(&mb_info.boot_device))[0] = (char)BootDrive;
|
((char *)(&mb_info.boot_device))[0] = (char)BootDrive;
|
||||||
((char *)(&mb_info.boot_device))[1] = (char)BootPartition;
|
((char *)(&mb_info.boot_device))[1] = (char)BootPartition;
|
||||||
|
@ -109,7 +104,6 @@ void LoadAndBootReactOS(char *OperatingSystemName)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DrawBackdrop();
|
DrawBackdrop();
|
||||||
|
|
||||||
DrawStatusText(" Loading...");
|
DrawStatusText(" Loading...");
|
||||||
|
@ -188,7 +182,8 @@ void LoadAndBootReactOS(char *OperatingSystemName)
|
||||||
/*
|
/*
|
||||||
* Set the name and try to open the PE image
|
* Set the name and try to open the PE image
|
||||||
*/
|
*/
|
||||||
strcpy(szFileName, value);
|
strcpy(szFileName, szBootPath);
|
||||||
|
strcat(szFileName, value);
|
||||||
if (!OpenFile(szFileName, &file))
|
if (!OpenFile(szFileName, &file))
|
||||||
{
|
{
|
||||||
strcat(value, " not found.");
|
strcat(value, " not found.");
|
||||||
|
@ -251,166 +246,6 @@ void LoadAndBootReactOS(char *OperatingSystemName)
|
||||||
* Now boot the kernel
|
* Now boot the kernel
|
||||||
*/
|
*/
|
||||||
stop_floppy();
|
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;
|
|
||||||
}
|
|
|
@ -20,30 +20,8 @@
|
||||||
#ifndef __ROSBOOT_H
|
#ifndef __ROSBOOT_H
|
||||||
#define __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);
|
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
|
#endif // defined __ROSBOOT_H
|
Loading…
Reference in a new issue