Author: tkreuzer
Date: Sun Jul  8 22:06:23 2012
New Revision: 56860

URL: http://svn.reactos.org/svn/reactos?rev=56860&view=rev
Log:
[FREELDR]
Allocate the ARC_DISK_SIGNATURE structures from the heap instead of putting 
them into the initial loader block allocation, since the number of disks 
changes later. Fixes memory corrruption and boot breakage when 3 hdds are 
connected.

[NTOSKRNL]
Remove a hack that disabled unloading drivers, which didn't work because of 
memory corruption from freeldr. This works now, too.

See issue #7139 for more details.

Modified:
    trunk/reactos/boot/freeldr/freeldr/include/winldr.h
    trunk/reactos/boot/freeldr/freeldr/windows/winldr.c
    trunk/reactos/ntoskrnl/io/iomgr/driver.c

Modified: trunk/reactos/boot/freeldr/freeldr/include/winldr.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/include/winldr.h?rev=56860&r1=56859&r2=56860&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/include/winldr.h [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/include/winldr.h [iso-8859-1] Sun Jul  8 
22:06:23 2012
@@ -71,7 +71,6 @@
     CHAR NtBootPathName[MAX_PATH+1];
     CHAR NtHalPathName[MAX_PATH+1];
     ARC_DISK_INFORMATION ArcDiskInformation;
-    ARC_DISK_SIGNATURE_EX ArcDiskSignature[];
 } LOADER_SYSTEM_BLOCK, *PLOADER_SYSTEM_BLOCK;
 
 extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock;

Modified: trunk/reactos/boot/freeldr/freeldr/windows/winldr.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windows/winldr.c?rev=56860&r1=56859&r2=56860&view=diff
==============================================================================
--- trunk/reactos/boot/freeldr/freeldr/windows/winldr.c [iso-8859-1] (original)
+++ trunk/reactos/boot/freeldr/freeldr/windows/winldr.c [iso-8859-1] Sun Jul  8 
22:06:23 2012
@@ -48,12 +48,9 @@
 AllocateAndInitLPB(PLOADER_PARAMETER_BLOCK *OutLoaderBlock)
 {
        PLOADER_PARAMETER_BLOCK LoaderBlock;
-       ULONG SystemBlockSize;
 
        /* Allocate and zero-init the LPB */
-       SystemBlockSize = sizeof(LOADER_SYSTEM_BLOCK) +
-                         reactos_disk_count * sizeof(ARC_DISK_SIGNATURE_EX);
-       WinLdrSystemBlock = MmAllocateMemoryWithType(SystemBlockSize,
+       WinLdrSystemBlock = 
MmAllocateMemoryWithType(sizeof(LOADER_SYSTEM_BLOCK),
                                                  LoaderSystemBlock);
        if (WinLdrSystemBlock == NULL)
        {
@@ -135,26 +132,27 @@
        /* Convert ARC disk information from freeldr to a correct format */
        for (i = 0; i < reactos_disk_count; i++)
        {
-               PARC_DISK_SIGNATURE ArcDiskSig;
-
-               /* Get the ARC structure */
-               ArcDiskSig = 
&WinLdrSystemBlock->ArcDiskSignature[i].DiskSignature;
+               PARC_DISK_SIGNATURE_EX ArcDiskSig;
+
+               /* Allocate the ARC structure */
+               ArcDiskSig = HeapAllocate(FrLdrDefaultHeap,
+                                  sizeof(ARC_DISK_SIGNATURE_EX),
+                                 'giSD');
 
                /* Copy the data over */
-               ArcDiskSig->Signature = reactos_arc_disk_info[i].Signature;
-               ArcDiskSig->CheckSum = reactos_arc_disk_info[i].CheckSum;
+               ArcDiskSig->DiskSignature.Signature = 
reactos_arc_disk_info[i].Signature;
+               ArcDiskSig->DiskSignature.CheckSum = 
reactos_arc_disk_info[i].CheckSum;
 
                /* Copy the ARC Name */
-               ArcDiskSig->ArcName = 
WinLdrSystemBlock->ArcDiskSignature[i].ArcName;
                strncpy(ArcDiskSig->ArcName, reactos_arc_disk_info[i].ArcName, 
MAX_PATH);
-               ArcDiskSig->ArcName = PaToVa(ArcDiskSig->ArcName);
+               ArcDiskSig->DiskSignature.ArcName = PaToVa(ArcDiskSig->ArcName);
 
                /* Mark partition table as valid */
-               ArcDiskSig->ValidPartitionTable = TRUE;
+               ArcDiskSig->DiskSignature.ValidPartitionTable = TRUE;
 
                /* Insert into the list */
                
InsertTailList(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead,
-                       &ArcDiskSig->ListEntry);
+                              &ArcDiskSig->DiskSignature.ListEntry);
        }
 
        /* Convert all list's to Virtual address */
@@ -639,7 +637,9 @@
 
        WinLdrpDumpMemoryDescriptors(LoaderBlockVA);
        WinLdrpDumpBootDriver(LoaderBlockVA);
+#ifndef _M_AMD64
        WinLdrpDumpArcDisks(LoaderBlockVA);
+#endif
 
        //FIXME: If I substitute this debugging checkpoint, GCC will "optimize 
away" the code below
        //while (1) {};

Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/driver.c?rev=56860&r1=56859&r2=56860&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/driver.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/driver.c [iso-8859-1] Sun Jul  8 22:06:23 
2012
@@ -76,16 +76,12 @@
         DriverExtension = NextDriverExtension;
     }
 
-#if 0
     /* Check if the driver image is still loaded */
     if (DriverObject->DriverSection)
     {
         /* Unload it */
         MmUnloadSystemImage(DriverObject->DriverSection);
     }
-#else
-    DPRINT1("HACK: Not unloading the driver image due to critical bugs!\n");
-#endif
 
     /* Check if it has a name */
     if (DriverObject->DriverName.Buffer)
@@ -283,7 +279,7 @@
       /* Free caller's string */
       ExFreePoolWithTag(InputImagePath.Buffer, TAG_RTLREGISTRY);
    }
- 
+
    DPRINT("Normalized image path is '%wZ' for service '%wZ'\n", ImagePath, 
ServiceName);
 
    return STATUS_SUCCESS;
@@ -526,7 +522,7 @@
       DPRINT("IopCreateDriver() failed (Status 0x%08lx)\n", Status);
       return Status;
    }
-   
+
    MmFreeDriverInitialization((PLDR_DATA_TABLE_ENTRY)Driver->DriverSection);
 
    /* Set the driver as initialized */


Reply via email to