Author: hbelusca
Date: Tue May 9 15:31:53 2017
New Revision: 74512
URL:
http://svn.reactos.org/svn/reactos?rev=74512&view=rev
Log:
[USETUP]: Improve the bootsector validity check performed in IsThereAValidBootSector:
- Check for the first 3 bytes (and not 4) of the bootsector to not be zero (that's our
criterium for a "valid instruction"). Therefore, a bootsector starting with
"00 00 00 xx" (with xx the first byte of a volume identifier) is detected as
invalid (because the BIOS won't be able to run it anyways) and therefore, needs to be
overwritten.
- Check that its last 2 bytes are the valid 0xAA55 signature.
These improvements were suggested by Serge Gautherie and Peter Hater.
CORE-4870 CORE-12672 CORE-13188
- Move a DPRINT1 around.
Modified:
trunk/reactos/base/setup/usetup/bootsup.c
trunk/reactos/base/setup/usetup/interface/usetup.c
Modified: trunk/reactos/base/setup/usetup/bootsup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/setup/usetup/bootsup.…
==============================================================================
--- trunk/reactos/base/setup/usetup/bootsup.c [iso-8859-1] (original)
+++ trunk/reactos/base/setup/usetup/bootsup.c [iso-8859-1] Tue May 9 15:31:53 2017
@@ -630,12 +630,14 @@
IsThereAValidBootSector(PWSTR RootPath)
{
/*
- * Check the first DWORD (4 bytes) of the bootsector for a potential
- * "valid" instruction (the BIOS starts execution of the bootsector
- * at its beginning). Currently the criterium is that this DWORD must
- * be non-zero.
+ * We first demand that the bootsector has a valid signature at its end.
+ * We then check the first 3 bytes (as a ULONG) of the bootsector for a
+ * potential "valid" instruction (the BIOS starts execution of the
bootsector
+ * at its beginning). Currently this criterium is that this ULONG must be
+ * non-zero. If both these tests pass, then the bootsector is valid; otherwise
+ * it is invalid and certainly needs to be overwritten.
*/
-
+ BOOLEAN IsValid = FALSE;
NTSTATUS Status;
UNICODE_STRING Name;
OBJECT_ATTRIBUTES ObjectAttributes;
@@ -666,10 +668,9 @@
0,
FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
- {
- RtlFreeHeap(ProcessHeap, 0, BootSector);
- return FALSE; // Status;
- }
+ goto Quit;
+
+ RtlZeroMemory(BootSector, SECTORSIZE);
FileOffset.QuadPart = 0ULL;
Status = NtReadFile(FileHandle,
@@ -682,16 +683,20 @@
&FileOffset,
NULL);
NtClose(FileHandle);
-
- Instruction = *(PULONG)BootSector;
-
+ if (!NT_SUCCESS(Status))
+ goto Quit;
+
+ /* Check the instruction; we use a ULONG to read three bytes */
+ Instruction = (*(PULONG)BootSector) & 0x00FFFFFF;
+ IsValid = (Instruction != 0x00000000);
+
+ /* Check the bootsector signature */
+ IsValid &= (*(PUSHORT)(BootSector + 0x1fe) == 0xaa55);
+
+Quit:
/* Free the boot sector */
RtlFreeHeap(ProcessHeap, 0, BootSector);
-
- if (!NT_SUCCESS(Status))
- return FALSE; // Status;
-
- return (Instruction != 0x00000000);
+ return IsValid; // Status;
}
NTSTATUS
Modified: trunk/reactos/base/setup/usetup/interface/usetup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/setup/usetup/interfac…
==============================================================================
--- trunk/reactos/base/setup/usetup/interface/usetup.c [iso-8859-1] (original)
+++ trunk/reactos/base/setup/usetup/interface/usetup.c [iso-8859-1] Tue May 9 15:31:53
2017
@@ -4442,9 +4442,6 @@
wcscpy(SourceMbrPathBuffer, SourceRootPath.Buffer);
wcscat(SourceMbrPathBuffer, L"\\loader\\dosmbr.bin");
- DPRINT1("Install MBR bootcode: %S ==> %S\n",
- SourceMbrPathBuffer, DestinationDevicePathBuffer);
-
if (IsThereAValidBootSector(DestinationDevicePathBuffer))
{
/* Save current MBR */
@@ -4460,6 +4457,8 @@
}
}
+ DPRINT1("Install MBR bootcode: %S ==> %S\n",
+ SourceMbrPathBuffer, DestinationDevicePathBuffer);
Status = InstallMbrBootCodeToDisk(SourceMbrPathBuffer,
DestinationDevicePathBuffer);
if (!NT_SUCCESS(Status))