Author: fireball Date: Fri Apr 10 14:37:08 2009 New Revision: 40437
URL: http://svn.reactos.org/svn/reactos?rev=40437&view=rev Log: - 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.
Modified: trunk/reactos/base/setup/usetup/interface/usetup.c trunk/reactos/base/setup/usetup/partlist.c trunk/reactos/base/setup/usetup/partlist.h
Modified: trunk/reactos/base/setup/usetup/interface/usetup.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/setup/usetup/interface... ============================================================================== --- trunk/reactos/base/setup/usetup/interface/usetup.c [iso-8859-1] (original) +++ trunk/reactos/base/setup/usetup/interface/usetup.c [iso-8859-1] Fri Apr 10 14:37:08 2009 @@ -2380,6 +2380,28 @@ 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! */
Modified: trunk/reactos/base/setup/usetup/partlist.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/setup/usetup/partlist.... ============================================================================== --- trunk/reactos/base/setup/usetup/partlist.c [iso-8859-1] (original) +++ trunk/reactos/base/setup/usetup/partlist.c [iso-8859-1] Fri Apr 10 14:37:08 2009 @@ -775,10 +775,6 @@ } Checksum = ~Checksum + 1;
- RtlFreeHeap (ProcessHeap, - 0, - Mbr); - swprintf(Identifier, L"%08x-%08x-A", Checksum, Signature); DPRINT("Identifier: %S\n", Identifier);
@@ -798,6 +794,17 @@ DiskEntry->Modified = TRUE; } 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 @@ }
DiskEntry1->NewDisk = FALSE; + DiskEntry1->NoMbr = FALSE; } }
Modified: trunk/reactos/base/setup/usetup/partlist.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/setup/usetup/partlist.... ============================================================================== --- trunk/reactos/base/setup/usetup/partlist.h [iso-8859-1] (original) +++ trunk/reactos/base/setup/usetup/partlist.h [iso-8859-1] Fri Apr 10 14:37:08 2009 @@ -109,6 +109,7 @@ BOOLEAN Modified;
BOOLEAN NewDisk; + BOOLEAN NoMbr; /* MBR is absent */
UNICODE_STRING DriverName;