- In NTLDR boot, try to get the first kernel physical address from the loader entries.
authorAlex Ionescu <aionescu@gmail.com>
Sun, 8 Oct 2006 00:04:03 +0000 (00:04 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Sun, 8 Oct 2006 00:04:03 +0000 (00:04 +0000)
- 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
reactos/ntoskrnl/mm/freelist.c
reactos/ntoskrnl/mm/mminit.c

index fe4cb8e..ccc1b36 100644 (file)
@@ -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 */
index cdc505b..0f342b0 100644 (file)
@@ -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,
index 1f8afd7..d54cade 100644 (file)
@@ -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
     */