[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.

svn path=/trunk/; revision=56860
This commit is contained in:
Timo Kreuzer 2012-07-08 22:06:23 +00:00
parent 60c98d7414
commit aec110d514
3 changed files with 15 additions and 20 deletions

View file

@ -71,7 +71,6 @@ typedef struct _LOADER_SYSTEM_BLOCK
CHAR NtBootPathName[MAX_PATH+1]; CHAR NtBootPathName[MAX_PATH+1];
CHAR NtHalPathName[MAX_PATH+1]; CHAR NtHalPathName[MAX_PATH+1];
ARC_DISK_INFORMATION ArcDiskInformation; ARC_DISK_INFORMATION ArcDiskInformation;
ARC_DISK_SIGNATURE_EX ArcDiskSignature[];
} LOADER_SYSTEM_BLOCK, *PLOADER_SYSTEM_BLOCK; } LOADER_SYSTEM_BLOCK, *PLOADER_SYSTEM_BLOCK;
extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock; extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock;

View file

@ -48,12 +48,9 @@ VOID
AllocateAndInitLPB(PLOADER_PARAMETER_BLOCK *OutLoaderBlock) AllocateAndInitLPB(PLOADER_PARAMETER_BLOCK *OutLoaderBlock)
{ {
PLOADER_PARAMETER_BLOCK LoaderBlock; PLOADER_PARAMETER_BLOCK LoaderBlock;
ULONG SystemBlockSize;
/* Allocate and zero-init the LPB */ /* Allocate and zero-init the LPB */
SystemBlockSize = sizeof(LOADER_SYSTEM_BLOCK) + WinLdrSystemBlock = MmAllocateMemoryWithType(sizeof(LOADER_SYSTEM_BLOCK),
reactos_disk_count * sizeof(ARC_DISK_SIGNATURE_EX);
WinLdrSystemBlock = MmAllocateMemoryWithType(SystemBlockSize,
LoaderSystemBlock); LoaderSystemBlock);
if (WinLdrSystemBlock == NULL) if (WinLdrSystemBlock == NULL)
{ {
@ -135,26 +132,27 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
/* Convert ARC disk information from freeldr to a correct format */ /* Convert ARC disk information from freeldr to a correct format */
for (i = 0; i < reactos_disk_count; i++) for (i = 0; i < reactos_disk_count; i++)
{ {
PARC_DISK_SIGNATURE ArcDiskSig; PARC_DISK_SIGNATURE_EX ArcDiskSig;
/* Get the ARC structure */ /* Allocate the ARC structure */
ArcDiskSig = &WinLdrSystemBlock->ArcDiskSignature[i].DiskSignature; ArcDiskSig = HeapAllocate(FrLdrDefaultHeap,
sizeof(ARC_DISK_SIGNATURE_EX),
'giSD');
/* Copy the data over */ /* Copy the data over */
ArcDiskSig->Signature = reactos_arc_disk_info[i].Signature; ArcDiskSig->DiskSignature.Signature = reactos_arc_disk_info[i].Signature;
ArcDiskSig->CheckSum = reactos_arc_disk_info[i].CheckSum; ArcDiskSig->DiskSignature.CheckSum = reactos_arc_disk_info[i].CheckSum;
/* Copy the ARC Name */ /* Copy the ARC Name */
ArcDiskSig->ArcName = WinLdrSystemBlock->ArcDiskSignature[i].ArcName;
strncpy(ArcDiskSig->ArcName, reactos_arc_disk_info[i].ArcName, MAX_PATH); 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 */ /* Mark partition table as valid */
ArcDiskSig->ValidPartitionTable = TRUE; ArcDiskSig->DiskSignature.ValidPartitionTable = TRUE;
/* Insert into the list */ /* Insert into the list */
InsertTailList(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead, InsertTailList(&LoaderBlock->ArcDiskInformation->DiskSignatureListHead,
&ArcDiskSig->ListEntry); &ArcDiskSig->DiskSignature.ListEntry);
} }
/* Convert all list's to Virtual address */ /* Convert all list's to Virtual address */
@ -639,7 +637,9 @@ LoadAndBootWindowsCommon(
WinLdrpDumpMemoryDescriptors(LoaderBlockVA); WinLdrpDumpMemoryDescriptors(LoaderBlockVA);
WinLdrpDumpBootDriver(LoaderBlockVA); WinLdrpDumpBootDriver(LoaderBlockVA);
#ifndef _M_AMD64
WinLdrpDumpArcDisks(LoaderBlockVA); WinLdrpDumpArcDisks(LoaderBlockVA);
#endif
//FIXME: If I substitute this debugging checkpoint, GCC will "optimize away" the code below //FIXME: If I substitute this debugging checkpoint, GCC will "optimize away" the code below
//while (1) {}; //while (1) {};

View file

@ -76,16 +76,12 @@ IopDeleteDriver(IN PVOID ObjectBody)
DriverExtension = NextDriverExtension; DriverExtension = NextDriverExtension;
} }
#if 0
/* Check if the driver image is still loaded */ /* Check if the driver image is still loaded */
if (DriverObject->DriverSection) if (DriverObject->DriverSection)
{ {
/* Unload it */ /* Unload it */
MmUnloadSystemImage(DriverObject->DriverSection); MmUnloadSystemImage(DriverObject->DriverSection);
} }
#else
DPRINT1("HACK: Not unloading the driver image due to critical bugs!\n");
#endif
/* Check if it has a name */ /* Check if it has a name */
if (DriverObject->DriverName.Buffer) if (DriverObject->DriverName.Buffer)
@ -283,7 +279,7 @@ IopNormalizeImagePath(
/* Free caller's string */ /* Free caller's string */
ExFreePoolWithTag(InputImagePath.Buffer, TAG_RTLREGISTRY); ExFreePoolWithTag(InputImagePath.Buffer, TAG_RTLREGISTRY);
} }
DPRINT("Normalized image path is '%wZ' for service '%wZ'\n", ImagePath, ServiceName); DPRINT("Normalized image path is '%wZ' for service '%wZ'\n", ImagePath, ServiceName);
return STATUS_SUCCESS; return STATUS_SUCCESS;
@ -526,7 +522,7 @@ IopInitializeDriverModule(
DPRINT("IopCreateDriver() failed (Status 0x%08lx)\n", Status); DPRINT("IopCreateDriver() failed (Status 0x%08lx)\n", Status);
return Status; return Status;
} }
MmFreeDriverInitialization((PLDR_DATA_TABLE_ENTRY)Driver->DriverSection); MmFreeDriverInitialization((PLDR_DATA_TABLE_ENTRY)Driver->DriverSection);
/* Set the driver as initialized */ /* Set the driver as initialized */