From ebd9a573ec19f42c9fac1404e9509254e64cb079 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sun, 8 Oct 2006 00:04:03 +0000 Subject: [PATCH] - In NTLDR boot, try to get the first kernel physical address from the loader entries. - Fixup HAL's image base in the loader parameter block, since we load it at a different place then freeldr tells us. - We've reached a dead end in NTLDR compatibility. Out memory manager initialization code makes some assumptions which are totally incompatible with the page table state that NTLDR gives us. svn path=/trunk/; revision=24436 --- reactos/ntoskrnl/ke/freeldr.c | 6 +++--- reactos/ntoskrnl/mm/freelist.c | 2 +- reactos/ntoskrnl/mm/mminit.c | 19 ++++++++++++++----- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/ke/freeldr.c b/reactos/ntoskrnl/ke/freeldr.c index fe4cb8e1f14..ccc1b36a36d 100644 --- a/reactos/ntoskrnl/ke/freeldr.c +++ b/reactos/ntoskrnl/ke/freeldr.c @@ -216,6 +216,9 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock, } else if (!(_stricmp(DriverName, "hal.dll"))) { + /* The HAL actually gets loaded somewhere else */ + ModStart = HalModuleObject.DllBase; + /* Create an MD for the HAL */ MdEntry = &BldrMemoryDescriptors[i]; MdEntry->MemoryType = LoaderHalCode; @@ -294,8 +297,6 @@ KiRosPrepareForSystemStartup(IN ULONG Dummy, ULONG HalBase; ULONG DriverBase; ULONG DriverSize; - //PIMAGE_NT_HEADERS NtHeader; - //PIMAGE_OPTIONAL_HEADER OptHead; PLOADER_PARAMETER_BLOCK NtLoaderBlock; CHAR* s; PKTSS Tss; @@ -320,7 +321,6 @@ KiRosPrepareForSystemStartup(IN ULONG Dummy, memcpy(&KeLoaderModules[0], (PVOID)KeRosLoaderBlock.ModsAddr, sizeof(LOADER_MODULE) * KeRosLoaderBlock.ModsCount); - //KeRosLoaderBlock.ModsCount++; KeRosLoaderBlock.ModsAddr = (ULONG)&KeLoaderModules; /* Check for BIOS memory map */ diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index cdc505bc378..0f342b008bc 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -334,7 +334,7 @@ MmInitializePageList(ULONG_PTR FirstPhysKernelAddress, PFN_TYPE FirstUninitializedPage; ULONG PdeStart = PsGetCurrentProcess()->Pcb.DirectoryTableBase.LowPart; - DPRINT1("MmInitializePageList(FirstPhysKernelAddress %x, " + DPRINT("MmInitializePageList(FirstPhysKernelAddress %x, " "LastPhysKernelAddress %x, " "MemorySizeInPages %x, LastKernelAddress %x)\n", FirstPhysKernelAddress, diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 1f8afd7c06f..d54cade931a 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -300,6 +300,7 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, ULONG i; ULONG kernel_len; ULONG_PTR MappingAddress; + PLDR_DATA_TABLE_ENTRY LdrEntry; DPRINT("MmInit1(FirstKrnlPhysAddr, %p, LastKrnlPhysAddr %p, LastKernelAddress %p)\n", FirstKrnlPhysAddr, @@ -328,8 +329,20 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, } /* NTLDR Hacks */ - if (!MmFreeLdrMemHigher) MmFreeLdrMemHigher = 32768; + if (!MmFreeLdrMemHigher) MmFreeLdrMemHigher = 65536; if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000; + if (!FirstKrnlPhysAddr) + { + /* Get the kernel entry */ + LdrEntry = CONTAINING_RECORD(KeLoaderBlock->LoadOrderListHead.Flink, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + /* Get the addresses */ + FirstKrnlPhysAddr = (ULONG_PTR)LdrEntry->DllBase - KSEG0_BASE; + + /* FIXME: How do we get the last address? */ + } if (MmFreeLdrMemHigher >= (MaxMem - 1) * 1024) { @@ -398,10 +411,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr, AddressRangeCount); kernel_len = LastKrnlPhysAddr - FirstKrnlPhysAddr; - //extern LOADER_MODULE KeLoaderModules[]; - //DPRINT1("Module one: %p %p\n", KeLoaderModules[0].ModStart, KeLoaderModules[0].ModEnd); - //while (TRUE); - /* * Unmap low memory */ -- 2.17.1