- Move ReactOS specific code to ReactOS specific files/directories.
- Use NDK instead of redefining the loader structures.
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/mb.S
Modified: trunk/reactos/boot/freeldr/freeldr/freeldr_base.xml
Modified: trunk/reactos/boot/freeldr/freeldr/fs/ntfs.c
Modified: trunk/reactos/boot/freeldr/freeldr/fs/ntfs.h
Modified: trunk/reactos/boot/freeldr/freeldr/include/arch.h
Modified: trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
Modified: trunk/reactos/boot/freeldr/freeldr/include/multiboot.h
Modified: trunk/reactos/boot/freeldr/freeldr/include/reactos.h
Modified: trunk/reactos/boot/freeldr/freeldr/include/rtl.h
Deleted: trunk/reactos/boot/freeldr/freeldr/multiboot.c
Added: trunk/reactos/boot/freeldr/freeldr/reactos/loader.c
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/reactos.c
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/registry.c
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/registry.h
Modified: trunk/reactos/boot/freeldr/freeldr/reactos/setupldr.c
Modified: trunk/reactos/boot/freeldr/freeldr/rtl/print.c
Modified: trunk/reactos/boot/freeldr/freeldr/rtl/stdlib.c
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/mb.S
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/mb.S 2005-07-06
13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/mb.S 2005-07-06
13:41:51 UTC (rev 16454)
@@ -52,10 +52,10 @@
// Boot information structure
//
-EXTERN(_multiboot_memory_map_descriptor_size)
+EXTERN(_reactos_memory_map_descriptor_size)
.long 0
-EXTERN(_multiboot_memory_map)
+EXTERN(_reactos_memory_map)
.rept (32 * /*sizeof(memory_map_t)*/24)
.byte 0
.endr
_____
Modified: trunk/reactos/boot/freeldr/freeldr/freeldr_base.xml
--- trunk/reactos/boot/freeldr/freeldr/freeldr_base.xml 2005-07-06
13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/freeldr_base.xml 2005-07-06
13:41:51 UTC (rev 16454)
@@ -74,6 +74,7 @@
<directory name="reactos">
<file>arcname.c</file>
<file>binhive.c</file>
+ <file>loader.c</file>
<file>reactos.c</file>
<file>registry.c</file>
</directory>
@@ -102,7 +103,6 @@
</directory>
<file>freeldr.c</file>
<file>debug.c</file>
- <file>multiboot.c</file>
<file>version.c</file>
<file>cmdline.c</file>
<file>machine.c</file>
_____
Modified: trunk/reactos/boot/freeldr/freeldr/fs/ntfs.c
--- trunk/reactos/boot/freeldr/freeldr/fs/ntfs.c 2005-07-06
13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/fs/ntfs.c 2005-07-06
13:41:51 UTC (rev 16454)
@@ -1,6 +1,6 @@
/*
* FreeLoader NTFS support
- * Copyright (C) 2004 Filip Navara <xnavara(a)volny.cz>
+ * Copyright (C) 2004 Filip Navara <xnavara(a)volny.cz>
*
* 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
_____
Modified: trunk/reactos/boot/freeldr/freeldr/fs/ntfs.h
--- trunk/reactos/boot/freeldr/freeldr/fs/ntfs.h 2005-07-06
13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/fs/ntfs.h 2005-07-06
13:41:51 UTC (rev 16454)
@@ -1,6 +1,6 @@
/*
* FreeLoader NTFS support
- * Copyright (C) 2004 Filip Navara <xnavara(a)volny.cz>
+ * Copyright (C) 2004 Filip Navara <xnavara(a)volny.cz>
*
* 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
_____
Modified: trunk/reactos/boot/freeldr/freeldr/include/arch.h
--- trunk/reactos/boot/freeldr/freeldr/include/arch.h 2005-07-06
13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/include/arch.h 2005-07-06
13:41:51 UTC (rev 16454)
@@ -28,10 +28,6 @@
#define RMODE_CS 0x18 /* RMode code selector, base 0 limit 64k
*/
#define RMODE_DS 0x20 /* RMode data selector, base 0 limit 64k
*/
-#define KERNEL_BASE 0xC0000000
-#define KERNEL_CS 0x08
-#define KERNEL_DS 0x10
-
#define CR0_PE_SET 0x00000001 /* OR this value with CR0 to
enable pmode */
#define CR0_PE_CLR 0xFFFFFFFE /* AND this value with CR0 to
disable pmode */
_____
Modified: trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
--- trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
2005-07-06 13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/include/freeldr.h
2005-07-06 13:41:51 UTC (rev 16454)
@@ -21,8 +21,8 @@
#define __FREELDR_H
#include <ddk/ntddk.h>
+#include <ndk/ntndk.h>
#include <arch.h>
-#include <reactos.h>
#include <rtl.h>
#include <disk.h>
#include <fs.h>
@@ -33,6 +33,7 @@
#include <inifile.h>
#include <video.h>
#include <portio.h>
+#include <reactos.h>
#define ROUND_UP(N, S) (((N) + (S) - 1) & ~((S) - 1))
#define ROUND_DOWN(N, S) ((N) & ~((S) - 1))
_____
Modified: trunk/reactos/boot/freeldr/freeldr/include/multiboot.h
--- trunk/reactos/boot/freeldr/freeldr/include/multiboot.h
2005-07-06 13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/include/multiboot.h
2005-07-06 13:41:51 UTC (rev 16454)
@@ -52,7 +52,6 @@
#define MB_INFO_FLAG_BOOT_LOADER_NAME 0x00000200
#define MB_INFO_FLAG_APM_TABLE 0x00000400
#define MB_INFO_FLAG_GRAPHICS_TABLE 0x00000800
-#define MB_INFO_FLAG_ACPI_TABLE 0x00001000
#ifndef ASM
/* Do not include here in boot.S. */
@@ -90,35 +89,6 @@
unsigned long shndx;
} elf_section_header_table_t;
-typedef struct _LOADER_PARAMETER_BLOCK
-{
- ULONG Flags;
- ULONG MemLower;
- ULONG MemHigher;
- ULONG BootDevice;
- ULONG CommandLine;
- ULONG ModsCount;
- ULONG ModsAddr;
- UCHAR Syms[12];
- ULONG MmapLength;
- ULONG MmapAddr;
- ULONG DrivesCount;
- ULONG DrivesAddr;
- ULONG ConfigTable;
- ULONG BootLoaderName;
- ULONG PageDirectoryStart;
- ULONG PageDirectoryEnd;
- ULONG KernelBase;
-} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;
-
-/* The module structure. */
-typedef struct _FRLDR_MODULE {
- ULONG_PTR ModuleStart;
- ULONG_PTR ModuleEnd;
- LPSTR ModuleName;
- ULONG Reserved;
-} FRLDR_MODULE, *PFRLDR_MODULE;
-
/* The memory map. Be careful that the offset 0 is base_addr_low
but no size. */
typedef struct memory_map
@@ -132,94 +102,6 @@
unsigned long reserved;
} memory_map_t;
-
-LOADER_PARAMETER_BLOCK LoaderBlock; /* Multiboot info structure passed
to kernel */
-char multiboot_kernel_cmdline[255];
// Command line passed to kernel
-FRLDR_MODULE multiboot_modules[64]; // Array
to hold boot module info loaded for the kernel
-char
multiboot_module_strings[64][256]; // Array to hold module names
-unsigned long multiboot_memory_map_descriptor_size;
-memory_map_t multiboot_memory_map[32];
// Memory map
-
-
-void boot_reactos(void);
-
-#include "fs.h" // Included FILE structure definition
-
-BOOL
-STDCALL
-FrLdrBootReactOs(VOID);
-
-BOOL
-STDCALL
-FrLdrMapKernel(FILE *KernelImage);
-
-ULONG_PTR
-STDCALL
-FrLdrCreateModule(LPSTR ModuleName);
-
-ULONG_PTR
-STDCALL
-FrLdrLoadModule(FILE *ModuleImage,
- LPSTR ModuleName,
- PULONG ModuleSize);
-
-BOOL
-STDCALL
-FrLdrLoadKernel(PCHAR szFileName,
- INT nPos);
-
-BOOL
-FrLdrLoadNlsFile(PCHAR szSystemRoot,
- PCHAR szErrorOut);
-
-BOOL
-FrLdrLoadDriver(PCHAR szFileName,
- INT nPos);
-BOOL
-LoadSymbolFile(PCHAR szSystemRoot,
- PCHAR ModuleName,
- INT nPos);
-
-VOID
-FrLdrLoadBootDrivers(PCHAR szSystemRoot,
- INT nPos);
-
-BOOL
-STDCALL
-FrLdrCloseModule(ULONG_PTR ModuleBase,
- ULONG dwModuleSize);
-
-VOID
-STDCALL
-FrLdrStartup(ULONG Magic);
-
-VOID
-FASTCALL
-FrLdrGetKernelBase(VOID);
-
-VOID
-FASTCALL
-FrLdrSetupPae(ULONG Magic);
-
-VOID
-FASTCALL
-FrLdrGetPaeMode(VOID);
-
-VOID
-FASTCALL
-FrLdrSetupPageDirectory(VOID);
-
-VOID
-LoadAndBootReactOS(PCHAR OperatingSystemName);
-
-VOID FASTCALL AsmCode(VOID);
-typedef VOID (FASTCALL *ASMCODE)(ULONG Magic,
- PLOADER_PARAMETER_BLOCK LoaderBlock);
-
-int GetBootPartition(char *OperatingSystemName);
-
-
-
#endif /* ! ASM */
_____
Modified: trunk/reactos/boot/freeldr/freeldr/include/reactos.h
--- trunk/reactos/boot/freeldr/freeldr/include/reactos.h
2005-07-06 13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/include/reactos.h
2005-07-06 13:41:51 UTC (rev 16454)
@@ -44,5 +44,27 @@
VOID ConstructArcPath(PCHAR ArcPath, PCHAR SystemFolder, ULONG Disk,
ULONG Partition);
ULONG ConvertArcNameToBiosDriveNumber(PCHAR ArcPath);
+///////////////////////////////////////////////////////////////////////
////////////////
+//
+// Loader Functions And Definitions
+//
+///////////////////////////////////////////////////////////////////////
////////////////
+
+extern LOADER_PARAMETER_BLOCK LoaderBlock; /* Multiboot info structure
passed to kernel */
+extern char
reactos_kernel_cmdline[255]; // Command line passed to kernel
+extern LOADER_MODULE reactos_modules[64]; // Array
to hold boot module info loaded for the kernel
+extern char
reactos_module_strings[64][256]; // Array to hold module names
+extern unsigned long reactos_memory_map_descriptor_size;
+extern memory_map_t reactos_memory_map[32];
// Memory map
+VOID FASTCALL FrLdrSetupPae(ULONG Magic);
+VOID FASTCALL FrLdrSetupPageDirectory(VOID);
+VOID FASTCALL FrLdrGetPaeMode(VOID);
+BOOL STDCALL FrLdrMapKernel(FILE *KernelImage);
+ULONG_PTR STDCALL FrLdrCreateModule(LPSTR ModuleName);
+ULONG_PTR STDCALL FrLdrLoadModule(FILE *ModuleImage, LPSTR ModuleName,
PULONG ModuleSize);
+BOOL STDCALL FrLdrCloseModule(ULONG_PTR ModuleBase, ULONG
dwModuleSize);
+VOID STDCALL FrLdrStartup(ULONG Magic);
+typedef VOID (FASTCALL *ASMCODE)(ULONG Magic, PLOADER_PARAMETER_BLOCK
LoaderBlock);
+
#endif // defined __REACTOS_H
_____
Modified: trunk/reactos/boot/freeldr/freeldr/include/rtl.h
--- trunk/reactos/boot/freeldr/freeldr/include/rtl.h 2005-07-06
13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/include/rtl.h 2005-07-06
13:41:51 UTC (rev 16454)
@@ -42,7 +42,7 @@
// Standard Library Functions
//
////////////////////////////////////////////////////////////////////////
///////////////
-int atoi(char *string);
+int atoi(const char *string);
char * itoa(int value, char *string, int radix);
int toupper(int c);
int tolower(int c);
@@ -75,8 +75,8 @@
//
////////////////////////////////////////////////////////////////////////
///////////////
void print(char *str);
-void printf(char *fmt, ...);
-void sprintf(char *buffer, char *format, ...);
+int printf(const char *fmt, ...);
+int sprintf(char *buffer, const char *format, ...);
////////////////////////////////////////////////////////////////////////
///////////////
//
_____
Deleted: trunk/reactos/boot/freeldr/freeldr/multiboot.c
--- trunk/reactos/boot/freeldr/freeldr/multiboot.c 2005-07-06
13:09:23 UTC (rev 16453)
+++ trunk/reactos/boot/freeldr/freeldr/multiboot.c 2005-07-06
13:41:51 UTC (rev 16454)
@@ -1,789 +0,0 @@
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: Freeloader
- * FILE: boot/freeldr/freeldr/multiboot.c
- * PURPOSE: ReactOS Loader
- * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net)
- * Hartmut Birr - SMP/PAE Code
- */
-
-#include <freeldr.h>
-#include <internal/i386/ke.h>
-
-#define NDEBUG
-#include <debug.h>
-
-/* Base Addres of Kernel in Physical Memory */
-#define KERNEL_BASE_PHYS 0x200000
-
-/* Bits to shift to convert a Virtual Address into an Offset in the
Page Table */
-#define PFN_SHIFT 12
-
-/* Bits to shift to convert a Virtual Address into an Offset in the
Page Directory */
-#define PDE_SHIFT 20
-#define PDE_SHIFT_PAE 18
-
-
-/* Converts a Relative Address read from the Kernel into a Physical
Address */
-#define RaToPa(p) \
- (ULONG_PTR)((ULONG_PTR)p + KERNEL_BASE_PHYS)
-
-/* Converts a Phsyical Address Pointer into a Page Frame Number */
-#define PaPtrToPfn(p) \
- (((ULONG_PTR)&p) >> PFN_SHIFT)
-
-/* Converts a Phsyical Address into a Page Frame Number */
-#define PaToPfn(p) \
- ((p) >> PFN_SHIFT)
-
-#define STARTUP_BASE 0xC0000000
-#define HYPERSPACE_BASE 0xC0400000
-#define HYPERSPACE_PAE_BASE 0xC0800000
-#define APIC_BASE 0xFEC00000
-#define KPCR_BASE 0xFF000000
-
-#define LowMemPageTableIndex 0
-#define StartupPageTableIndex (STARTUP_BASE >> 22)
-#define HyperspacePageTableIndex (HYPERSPACE_BASE >> 22)
-#define KpcrPageTableIndex (KPCR_BASE >> 22)
-#define ApicPageTableIndex (APIC_BASE >> 22)
-
-#define LowMemPageTableIndexPae 0
-#define StartupPageTableIndexPae (STARTUP_BASE >> 21)
-#define HyperspacePageTableIndexPae (HYPERSPACE_PAE_BASE >> 21)
-#define KpcrPageTableIndexPae (KPCR_BASE >> 21)
-#define ApicPageTableIndexPae (APIC_BASE >> 21)
-
-
-#define KernelEntryPoint (KernelEntry - KERNEL_BASE_PHYS) +
KernelBase
-
-/* Load Address of Next Module */
-ULONG_PTR NextModuleBase = 0;
-
-/* Currently Opened Module */
-PFRLDR_MODULE CurrentModule = NULL;
-
-/* Unrelocated Kernel Base in Virtual Memory */
-ULONG_PTR KernelBase;
-
-/* Wether PAE is to be used or not */
-BOOLEAN PaeModeEnabled;
-
-/* Kernel Entrypoint in Physical Memory */
-ULONG_PTR KernelEntry;
-
-typedef struct _HARDWARE_PTE_X86 {
- ULONG Valid : 1;
- ULONG Write : 1;
- ULONG Owner : 1;
- ULONG WriteThrough : 1;
- ULONG CacheDisable : 1;
- ULONG Accessed : 1;
- ULONG Dirty : 1;
- ULONG LargePage : 1;
- ULONG Global : 1;
- ULONG CopyOnWrite : 1;
- ULONG Prototype : 1;
- ULONG reserved : 1;
- ULONG PageFrameNumber : 20;
-} HARDWARE_PTE_X86, *PHARDWARE_PTE_X86;
-
-typedef struct _HARDWARE_PTE_X64 {
- ULONG Valid : 1;
- ULONG Write : 1;
- ULONG Owner : 1;
- ULONG WriteThrough : 1;
- ULONG CacheDisable : 1;
- ULONG Accessed : 1;
- ULONG Dirty : 1;
- ULONG LargePage : 1;
- ULONG Global : 1;
- ULONG CopyOnWrite : 1;
- ULONG Prototype : 1;
- ULONG reserved : 1;
- ULONG PageFrameNumber : 20;
- ULONG reserved2 : 31;
- ULONG NoExecute : 1;
-} HARDWARE_PTE_X64, *PHARDWARE_PTE_X64;
-
-typedef struct _PAGE_DIRECTORY_X86 {
- HARDWARE_PTE_X86 Pde[1024];
-} PAGE_DIRECTORY_X86, *PPAGE_DIRECTORY_X86;
-
-typedef struct _PAGE_DIRECTORY_X64 {
- HARDWARE_PTE_X64 Pde[2048];
-} PAGE_DIRECTORY_X64, *PPAGE_DIRECTORY_X64;
-
-typedef struct _PAGE_DIRECTORY_TABLE_X64 {
- HARDWARE_PTE_X64 Pde[4];
-} PAGE_DIRECTORY_TABLE_X64, *PPAGE_DIRECTORY_TABLE_X64;
-
-/* Page Directory and Tables for non-PAE Systems */
-extern PAGE_DIRECTORY_X86 startup_pagedirectory;
-extern PAGE_DIRECTORY_X86 lowmem_pagetable;
-extern PAGE_DIRECTORY_X86 kernel_pagetable;
-extern ULONG_PTR hyperspace_pagetable;
-extern ULONG_PTR _pae_pagedirtable;
-extern PAGE_DIRECTORY_X86 apic_pagetable;
-extern PAGE_DIRECTORY_X86 kpcr_pagetable;
-
-/* Page Directory and Tables for PAE Systems */
-extern PAGE_DIRECTORY_TABLE_X64 startup_pagedirectorytable_pae;
-extern PAGE_DIRECTORY_X64 startup_pagedirectory_pae;
-extern PAGE_DIRECTORY_X64 lowmem_pagetable_pae;
-extern PAGE_DIRECTORY_X64 kernel_pagetable_pae;
-extern ULONG_PTR hyperspace_pagetable_pae;
-extern ULONG_PTR pagedirtable_pae;
-extern PAGE_DIRECTORY_X64 apic_pagetable_pae;
-extern PAGE_DIRECTORY_X64 kpcr_pagetable_pae;
-
-/* FUNCTIONS
*****************************************************************/
-
-/*++
- * FrLdrStartup
- * INTERNAL
- *
- * Prepares the system for loading the Kernel.
- *
- * Params:
- * Magic - Multiboot Magic
- *
- * Returns:
- * None.
- *
- * Remarks:
- * None.
- *
- *--*/
-VOID
-STDCALL
-FrLdrStartup(ULONG Magic)
-{
- /* Disable Interrupts */
- Ke386DisableInterrupts();
-
- /* Re-initalize EFLAGS */
- Ke386EraseFlags();
-
- /* Get the PAE Mode */
- FrLdrGetPaeMode();
-
- /* Initialize the page directory */
- FrLdrSetupPageDirectory();
-
- /* Initialize Paging, Write-Protection and Load NTOSKRNL */
- FrLdrSetupPae(Magic);
-}
-
-/*++
- * FrLdrSetupPae
- * INTERNAL
- *
- * Configures PAE on a MP System, and sets the PDBR if it's
supported, or if
- * the system is UP.
- *
- * Params:
- * Magic - Multiboot Magic
- *
- * Returns:
- * None.
- *
- * Remarks:
- * None.
- *
- *--*/
-VOID
-FASTCALL
-FrLdrSetupPae(ULONG Magic)
-{
- ULONG_PTR PageDirectoryBaseAddress =
(ULONG_PTR)&startup_pagedirectory;
- ASMCODE PagedJump;
-
- if (PaeModeEnabled)
- {
- PageDirectoryBaseAddress =
(ULONG_PTR)&startup_pagedirectorytable_pae;
-
- /* Enable PAE */
- Ke386SetCr4(Ke386GetCr4() | X86_CR4_PAE);
- }
-
- /* Set the PDBR */
- Ke386SetPageTableDirectory(PageDirectoryBaseAddress);
-
- /* Enable Paging and Write Protect*/
- Ke386SetCr0(Ke386GetCr0() | X86_CR0_PG | X86_CR0_WP);
-
- /* Jump to Kernel */
- PagedJump = (ASMCODE)(PVOID)(KernelEntryPoint);
- PagedJump(Magic, &LoaderBlock);
-}
-
-/*++
- * FrLdrGetKernelBase
- * INTERNAL
- *
- * Gets the Kernel Base to use.
- *
- * Params:
- *
- * Returns:
- * None.
- *
- * Remarks:
- * Sets both the FreeLdr internal variable as well as the one which
- * will be used by the Kernel.
- *
- *--*/
-VOID
-FASTCALL
-FrLdrGetKernelBase(VOID)
-{
- PCHAR p;
-
- /* Set KernelBase */
- LoaderBlock.KernelBase = KernelBase;
-
- /* Read Command Line */
- p = (PCHAR)LoaderBlock.CommandLine;
- while ((p = strchr(p, '/')) != NULL) {
-
- /* Find "/3GB" */
- if (!strnicmp(p + 1, "3GB", 3)) {
-
- /* Make sure there's nothing following it */
- if (p[4] == ' ' || p[4] == 0) {
-
- /* Use 3GB */
- KernelBase = 0xE0000000;
- LoaderBlock.KernelBase = 0xC0000000;
- }
- }
-
- p++;
- }
-}
-
-/*++
- * FrLdrGetPaeMode
- * INTERNAL
- *
- * Determines whether PAE mode shoudl be enabled or not.
- *
- * Params:
- * None.
- *
- * Returns:
- * None.
- *
- * Remarks:
- * None.
- *
- *--*/
-VOID
-FASTCALL
-FrLdrGetPaeMode(VOID)
-{
- /* FIXME: Read command line */
- PaeModeEnabled = FALSE;
-
- if (PaeModeEnabled)
- {
- }
-}
-
-/*++
- * FrLdrSetupPageDirectory
- * INTERNAL
- *
- * Sets up the ReactOS Startup Page Directory.
- *
- * Params:
- * None.
- *
- * Returns:
- * None.
- *
- * Remarks:
- * We are setting PDEs, but using the equvivalent (for our purpose)
PTE structure.
- * As such, please note that PageFrameNumber == PageEntryNumber.
- *
- *--*/
-VOID
-FASTCALL
-FrLdrSetupPageDirectory(VOID)
-{
- PPAGE_DIRECTORY_X86 PageDir;
- PPAGE_DIRECTORY_TABLE_X64 PageDirTablePae;
- PPAGE_DIRECTORY_X64 PageDirPae;
- ULONG KernelPageTableIndex;
- ULONG i;
-
- if (PaeModeEnabled) {
-
- /* Get the Kernel Table Index */
- KernelPageTableIndex = (KernelBase >> 21);
-
- /* Get the Startup Page Directory Table */
- PageDirTablePae =
(PPAGE_DIRECTORY_TABLE_X64)&startup_pagedirectorytable_pae;
-
- /* Get the Startup Page Directory */
- PageDirPae = (PPAGE_DIRECTORY_X64)&startup_pagedirectory_pae;
-
- /* Set the Startup page directory table */
- for (i = 0; i < 4; i++)
- {
- PageDirTablePae->Pde[i].Valid = 1;
- PageDirTablePae->Pde[i].PageFrameNumber =
PaPtrToPfn(startup_pagedirectory_pae) + i;
- }
-
- /* Set up the Low Memory PDE */
- for (i = 0; i < 2; i++)
- {
- PageDirPae->Pde[LowMemPageTableIndexPae + i].Valid = 1;
- PageDirPae->Pde[LowMemPageTableIndexPae + i].Write = 1;
- PageDirPae->Pde[LowMemPageTableIndexPae +
i].PageFrameNumber = PaPtrToPfn(lowmem_pagetable_pae) + i;
- }
-
- /* Set up the Kernel PDEs */
- for (i = 0; i < 3; i++)
- {
- PageDirPae->Pde[KernelPageTableIndex + i].Valid = 1;
- PageDirPae->Pde[KernelPageTableIndex + i].Write = 1;
- PageDirPae->Pde[KernelPageTableIndex + i].PageFrameNumber =
PaPtrToPfn(kernel_pagetable_pae) + i;
- }
-
- /* Set up the Startup PDE */
- for (i = 0; i < 4; i++)
- {
- PageDirPae->Pde[StartupPageTableIndexPae + i].Valid = 1;
- PageDirPae->Pde[StartupPageTableIndexPae + i].Write = 1;
- PageDirPae->Pde[StartupPageTableIndexPae +
i].PageFrameNumber = PaPtrToPfn(startup_pagedirectory_pae) + i;
- }
-
- /* Set up the Hyperspace PDE */
- for (i = 0; i < 2; i++)
- {
- PageDirPae->Pde[HyperspacePageTableIndexPae + i].Valid = 1;
- PageDirPae->Pde[HyperspacePageTableIndexPae + i].Write = 1;
- PageDirPae->Pde[HyperspacePageTableIndexPae +
i].PageFrameNumber = PaPtrToPfn(hyperspace_pagetable_pae) + i;
- }
-
- /* Set up the Apic PDE */
- for (i = 0; i < 2; i++)
- {
- PageDirPae->Pde[ApicPageTableIndexPae + i].Valid = 1;
- PageDirPae->Pde[ApicPageTableIndexPae + i].Write = 1;
- PageDirPae->Pde[ApicPageTableIndexPae + i].PageFrameNumber
= PaPtrToPfn(apic_pagetable_pae) + i;
- }
-
- /* Set up the KPCR PDE */
- PageDirPae->Pde[KpcrPageTableIndexPae].Valid = 1;
- PageDirPae->Pde[KpcrPageTableIndexPae].Write = 1;
- PageDirPae->Pde[KpcrPageTableIndexPae].PageFrameNumber =
PaPtrToPfn(kpcr_pagetable_pae);
-
- /* Set up Low Memory PTEs */
- PageDirPae = (PPAGE_DIRECTORY_X64)&lowmem_pagetable_pae;
- for (i=0; i<1024; i++) {
-
- PageDirPae->Pde[i].Valid = 1;
- PageDirPae->Pde[i].Write = 1;
- PageDirPae->Pde[i].Owner = 1;
- PageDirPae->Pde[i].PageFrameNumber = i;
- }
-
- /* Set up Kernel PTEs */
- PageDirPae = (PPAGE_DIRECTORY_X64)&kernel_pagetable_pae;
- for (i=0; i<1536; i++) {
-
- PageDirPae->Pde[i].Valid = 1;
- PageDirPae->Pde[i].Write = 1;
- PageDirPae->Pde[i].PageFrameNumber =
PaToPfn(KERNEL_BASE_PHYS) + i;
- }
-
- /* Set up APIC PTEs */
- PageDirPae = (PPAGE_DIRECTORY_X64)&apic_pagetable_pae;
- PageDirPae->Pde[0].Valid = 1;
- PageDirPae->Pde[0].Write = 1;
- PageDirPae->Pde[0].CacheDisable = 1;
- PageDirPae->Pde[0].WriteThrough = 1;
- PageDirPae->Pde[0].PageFrameNumber = PaToPfn(APIC_BASE);
- PageDirPae->Pde[0x200].Valid = 1;
- PageDirPae->Pde[0x200].Write = 1;
- PageDirPae->Pde[0x200].CacheDisable = 1;
- PageDirPae->Pde[0x200].WriteThrough = 1;
- PageDirPae->Pde[0x200].PageFrameNumber = PaToPfn(APIC_BASE +
KERNEL_BASE_PHYS);
-
- /* Set up KPCR PTEs */
- PageDirPae = (PPAGE_DIRECTORY_X64)&kpcr_pagetable_pae;
- PageDirPae->Pde[0].Valid = 1;
- PageDirPae->Pde[0].Write = 1;
- PageDirPae->Pde[0].PageFrameNumber = 1;
-
- } else {
-
- /* Get the Kernel Table Index */
- KernelPageTableIndex = (KernelBase >> PDE_SHIFT) /
sizeof(HARDWARE_PTE_X86);
-
- /* Get the Startup Page Directory */
- PageDir = (PPAGE_DIRECTORY_X86)&startup_pagedirectory;
-
- /* Set up the Low Memory PDE */
- PageDir->Pde[LowMemPageTableIndex].Valid = 1;
- PageDir->Pde[LowMemPageTableIndex].Write = 1;
- PageDir->Pde[LowMemPageTableIndex].PageFrameNumber =
PaPtrToPfn(lowmem_pagetable);
-
- /* Set up the Kernel PDEs */
- PageDir->Pde[KernelPageTableIndex].Valid = 1;
- PageDir->Pde[KernelPageTableIndex].Write = 1;
- PageDir->Pde[KernelPageTableIndex].PageFrameNumber =
PaPtrToPfn(kernel_pagetable);
- PageDir->Pde[KernelPageTableIndex + 1].Valid = 1;
- PageDir->Pde[KernelPageTableIndex + 1].Write = 1;
- PageDir->Pde[KernelPageTableIndex + 1].PageFrameNumber =
PaPtrToPfn(kernel_pagetable + 4096);
-
- /* Set up the Startup PDE */
- PageDir->Pde[StartupPageTableIndex].Valid = 1;
- PageDir->Pde[StartupPageTableIndex].Write = 1;
- PageDir->Pde[StartupPageTableIndex].PageFrameNumber =
PaPtrToPfn(startup_pagedirectory);
-
- /* Set up the Hyperspace PDE */
- PageDir->Pde[HyperspacePageTableIndex].Valid = 1;
- PageDir->Pde[HyperspacePageTableIndex].Write = 1;
- PageDir->Pde[HyperspacePageTableIndex].PageFrameNumber =
PaPtrToPfn(hyperspace_pagetable);
- PageDir->Pde[HyperspacePageTableIndex + 1].Valid = 1;
- PageDir->Pde[HyperspacePageTableIndex + 1].Write = 1;
- PageDir->Pde[HyperspacePageTableIndex + 1].PageFrameNumber =
PaPtrToPfn(hyperspace_pagetable + 4096);
-
- /* Set up the Apic PDE */
- PageDir->Pde[ApicPageTableIndex].Valid = 1;
- PageDir->Pde[ApicPageTableIndex].Write = 1;
- PageDir->Pde[ApicPageTableIndex].PageFrameNumber =
PaPtrToPfn(apic_pagetable);
-
- /* Set up the KPCR PDE */
- PageDir->Pde[KpcrPageTableIndex].Valid = 1;
- PageDir->Pde[KpcrPageTableIndex].Write = 1;
- PageDir->Pde[KpcrPageTableIndex].PageFrameNumber =
PaPtrToPfn(kpcr_pagetable);
-
- /* Set up Low Memory PTEs */
- PageDir = (PPAGE_DIRECTORY_X86)&lowmem_pagetable;
- for (i=0; i<1024; i++) {
-
- PageDir->Pde[i].Valid = 1;
- PageDir->Pde[i].Write = 1;
- PageDir->Pde[i].Owner = 1;
- PageDir->Pde[i].PageFrameNumber = PaToPfn(i * PAGE_SIZE);
- }
-
- /* Set up Kernel PTEs */
- PageDir = (PPAGE_DIRECTORY_X86)&kernel_pagetable;
- for (i=0; i<1536; i++) {
-
- PageDir->Pde[i].Valid = 1;
- PageDir->Pde[i].Write = 1;
- PageDir->Pde[i].PageFrameNumber = PaToPfn(KERNEL_BASE_PHYS
+ i * PAGE_SIZE);
- }
-
- /* Set up APIC PTEs */
- PageDir = (PPAGE_DIRECTORY_X86)&apic_pagetable;
- PageDir->Pde[0].Valid = 1;
- PageDir->Pde[0].Write = 1;
- PageDir->Pde[0].CacheDisable = 1;
- PageDir->Pde[0].WriteThrough = 1;
- PageDir->Pde[0].PageFrameNumber = PaToPfn(APIC_BASE);
- PageDir->Pde[0x200].Valid = 1;
- PageDir->Pde[0x200].Write = 1;
- PageDir->Pde[0x200].CacheDisable = 1;
- PageDir->Pde[0x200].WriteThrough = 1;
- PageDir->Pde[0x200].PageFrameNumber = PaToPfn(APIC_BASE +
KERNEL_BASE_PHYS);
-
- /* Set up KPCR PTEs */
- PageDir = (PPAGE_DIRECTORY_X86)&kpcr_pagetable;
- PageDir->Pde[0].Valid = 1;
- PageDir->Pde[0].Write = 1;
- PageDir->Pde[0].PageFrameNumber = 1;
- }
- return;
-}
-
-/*++
- * FrLdrMapKernel
- * INTERNAL
- *
- * Maps the Kernel into memory, does PE Section Mapping, initalizes
the
- * uninitialized data sections, and relocates the image.
- *
- * Params:
- * KernelImage - FILE Structure representing the ntoskrnl image
file.
- *
- * Returns:
- * TRUE if the Kernel was mapped.
- *
- * Remarks:
- * None.
- *
- *--*/
-BOOL
-STDCALL
-FrLdrMapKernel(FILE *KernelImage)
-{
- PIMAGE_DOS_HEADER ImageHeader;
- PIMAGE_NT_HEADERS NtHeader;
- PIMAGE_SECTION_HEADER Section;
- ULONG SectionCount;
- ULONG ImageSize;
- ULONG_PTR SourceSection;
- ULONG_PTR TargetSection;
- ULONG SectionSize;
- INT i;
- PIMAGE_DATA_DIRECTORY RelocationDDir;
- PIMAGE_BASE_RELOCATION RelocationDir, RelocationEnd;
- ULONG Count;
- ULONG_PTR Address, MaxAddress;
- PUSHORT TypeOffset;
- ULONG_PTR Delta;
- PUSHORT ShortPtr;
- PULONG LongPtr;
-
- /* Allocate 1024 bytes for PE Header */
- ImageHeader = (PIMAGE_DOS_HEADER)MmAllocateMemory(1024);
-
- /* Make sure it was succesful */
- if (ImageHeader == NULL) {
-
- return FALSE;
- }
-
- /* Load the first 1024 bytes of the kernel image so we can read the
PE header */
- if (!FsReadFile(KernelImage, 1024, NULL, ImageHeader)) {
-
- /* Fail if we couldn't read */
- MmFreeMemory(ImageHeader);
- return FALSE;
- }
-
- /* Now read the MZ header to get the offset to the PE Header */
- NtHeader = (PIMAGE_NT_HEADERS)((PCHAR)ImageHeader +
ImageHeader->e_lfanew);
-
- /* Get Kernel Base */
- KernelBase = NtHeader->OptionalHeader.ImageBase;
- FrLdrGetKernelBase();
-
- /* Save Entrypoint */
- KernelEntry = RaToPa(NtHeader->OptionalHeader.AddressOfEntryPoint);
-
- /* Save the Image Size */
- ImageSize = NtHeader->OptionalHeader.SizeOfImage;
-
- /* Free the Header */
- MmFreeMemory(ImageHeader);
-
- /* Set the file pointer to zero */
- FsSetFilePointer(KernelImage, 0);
-
- /* Load the file image */
- FsReadFile(KernelImage, ImageSize, NULL, (PVOID)KERNEL_BASE_PHYS);
-
- /* Reload the NT Header */
- NtHeader = (PIMAGE_NT_HEADERS)((PCHAR)KERNEL_BASE_PHYS +
ImageHeader->e_lfanew);
-
- /* Load the first section */
- Section = IMAGE_FIRST_SECTION(NtHeader);
- SectionCount = NtHeader->FileHeader.NumberOfSections - 1;
-
- /* Now go to the last section */
- Section += SectionCount;
-
- /* Walk each section backwards */
- for (i=(INT)SectionCount; i >= 0; i--, Section--) {
-
- /* Get the disk location and the memory location, and the size
*/
- SourceSection = RaToPa(Section->PointerToRawData);
- TargetSection = RaToPa(Section->VirtualAddress);
- SectionSize = Section->SizeOfRawData;
-
- /* If the section is already mapped correctly, go to the next
*/
- if (SourceSection == TargetSection) continue;
-
- /* Load it into memory */
- memmove((PVOID)TargetSection, (PVOID)SourceSection,
SectionSize);
-
- /* Check for unitilizated data */
- if (Section->SizeOfRawData < Section->Misc.VirtualSize) {
-
- /* Zero it out */
- memset((PVOID)RaToPa(Section->VirtualAddress +
Section->SizeOfRawData),
- 0,
- Section->Misc.VirtualSize - Section->SizeOfRawData);
- }
- }
-
- /* Get the Relocation Data Directory */
- RelocationDDir =
&NtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]
;
-
- /* Get the Relocation Section Start and End*/
- RelocationDir = (PIMAGE_BASE_RELOCATION)(KERNEL_BASE_PHYS +
RelocationDDir->VirtualAddress);
- RelocationEnd = (PIMAGE_BASE_RELOCATION)((ULONG_PTR)RelocationDir +
RelocationDDir->Size);
-
- /* Calculate Difference between Real Base and Compiled Base*/
- Delta = KernelBase - NtHeader->OptionalHeader.ImageBase;
-
- /* Determine how far we shoudl relocate */
- MaxAddress = KERNEL_BASE_PHYS + ImageSize;
-
- /* Relocate until we've processed all the blocks */
- while (RelocationDir < RelocationEnd && RelocationDir->SizeOfBlock
0) {
-
- /* See how many Relocation Blocks we have */
- Count = (RelocationDir->SizeOfBlock -
sizeof(IMAGE_BASE_RELOCATION)) / sizeof(USHORT);
-
- /* Calculate the Address of this Directory */
- Address = KERNEL_BASE_PHYS + RelocationDir->VirtualAddress;
-
- /* Calculate the Offset of the Type */
- TypeOffset = (PUSHORT)(RelocationDir + 1);
-
- for (i = 0; i < (INT)Count; i++) {
-
- ShortPtr = (PUSHORT)(Address + (*TypeOffset & 0xFFF));
-
- switch (*TypeOffset >> 12) {
-
- case IMAGE_REL_BASED_ABSOLUTE:
- break;
-
- case IMAGE_REL_BASED_HIGH:
- *ShortPtr += HIWORD(Delta);
- break;
-
- case IMAGE_REL_BASED_LOW:
- *ShortPtr += LOWORD(Delta);
- break;
-
- case IMAGE_REL_BASED_HIGHLOW:
- LongPtr = (PULONG)ShortPtr;
- *LongPtr += Delta;
- break;
- }
-
- TypeOffset++;
- }
-
- /* Move to the next Relocation Table */
- RelocationDir =
(PIMAGE_BASE_RELOCATION)((ULONG_PTR)RelocationDir +
RelocationDir->SizeOfBlock);
- }
-
- /* Increase the next Load Base */
- NextModuleBase = ROUND_UP(KERNEL_BASE_PHYS + ImageSize, PAGE_SIZE);
-
- /* Return Success */
- return TRUE;
-}
-
-ULONG_PTR
-STDCALL
-FrLdrLoadModule(FILE *ModuleImage,
- LPSTR ModuleName,
- PULONG ModuleSize)
-{
- ULONG LocalModuleSize;
- PFRLDR_MODULE ModuleData;
- LPSTR NameBuffer;
- LPSTR TempName;
-
- /* Get current module data structure and module name string array
*/
- ModuleData = &multiboot_modules[LoaderBlock.ModsCount];
-
- /* Get only the Module Name */
- do {
-
- TempName = strchr(ModuleName, '\\');
[truncated at 1000 lines; 1197 more skipped]