From b3c86c2ac02a3fdb366791365e5b9b869bdc8461 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Fri, 10 Apr 2009 10:37:08 +0000 Subject: [PATCH] - Add a new property to the disk entry: NoMbr flag. It's set, if MBR's first two bytes are zero (same algorithm is used by our cdrom bootsector). - If this flag is set for a boot disk, ReactOS MBR code will be installed on it. See issue #4355 for more details. svn path=/trunk/; revision=40437 --- reactos/base/setup/usetup/interface/usetup.c | 22 ++++++++++++++++++++ reactos/base/setup/usetup/partlist.c | 16 ++++++++++---- reactos/base/setup/usetup/partlist.h | 1 + 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index 87c0bc50228..5574cee4009 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -2380,6 +2380,28 @@ FormatPartitionPage (PINPUT_RECORD Ir) CheckActiveBootPartition(PartitionList); } + /* Install MBR if necessary */ + if (DiskEntry->NoMbr && + DiskEntry->BiosDiskNumber == 0) + { + wcscpy(PathBuffer, SourceRootPath.Buffer); + wcscat(PathBuffer, L"\\loader\\dosmbr.bin"); + + DPRINT("Install MBR bootcode: %S ==> %S\n", + PathBuffer, DestinationRootPath.Buffer); + + /* Install MBR bootcode */ + Status = InstallMbrBootCodeToDisk(PathBuffer, DestinationRootPath.Buffer); + if (!NT_SUCCESS (Status)) + { + DPRINT1("InstallMbrBootCodeToDisk() failed (Status %lx)\n", + Status); + return FALSE; + } + + DiskEntry->NoMbr = FALSE; + } + if (wcscmp(FileSystemList->Selected->FileSystem, L"FAT") == 0) { /* FIXME: Install boot code. This is a hack! */ diff --git a/reactos/base/setup/usetup/partlist.c b/reactos/base/setup/usetup/partlist.c index f4b2c3165fb..352886270ca 100644 --- a/reactos/base/setup/usetup/partlist.c +++ b/reactos/base/setup/usetup/partlist.c @@ -775,10 +775,6 @@ AddDiskToList (HANDLE FileHandle, } Checksum = ~Checksum + 1; - RtlFreeHeap (ProcessHeap, - 0, - Mbr); - swprintf(Identifier, L"%08x-%08x-A", Checksum, Signature); DPRINT("Identifier: %S\n", Identifier); @@ -799,6 +795,17 @@ AddDiskToList (HANDLE FileHandle, } DiskEntry->BiosFound = FALSE; + /* Check if this disk has a valid MBR */ + if (Mbr->BootCode[0] == 0 && Mbr->BootCode[1] == 0) + DiskEntry->NoMbr = TRUE; + else + DiskEntry->NoMbr = FALSE; + + /* Free Mbr sector buffer */ + RtlFreeHeap (ProcessHeap, + 0, + Mbr); + ListEntry = List->BiosDiskListHead.Flink; while(ListEntry != &List->BiosDiskListHead) { @@ -2672,6 +2679,7 @@ WritePartitionsToDisk (PPARTLIST List) } DiskEntry1->NewDisk = FALSE; + DiskEntry1->NoMbr = FALSE; } } diff --git a/reactos/base/setup/usetup/partlist.h b/reactos/base/setup/usetup/partlist.h index 13b14589a12..a1a48268b67 100644 --- a/reactos/base/setup/usetup/partlist.h +++ b/reactos/base/setup/usetup/partlist.h @@ -109,6 +109,7 @@ typedef struct _DISKENTRY BOOLEAN Modified; BOOLEAN NewDisk; + BOOLEAN NoMbr; /* MBR is absent */ UNICODE_STRING DriverName;