Do not overwrite the disk signature, if we install the boot code into the mbr.
[reactos.git] / reactos / subsys / system / usetup / bootsup.c
index 6182e54..22ce216 100644 (file)
  * PROGRAMMER:      Eric Kohl
  */
 
-#include <ddk/ntddk.h>
-#include <ntdll/rtl.h>
-
-#include "usetup.h"
-#include "inicache.h"
-#include "filesup.h"
-#include "bootsup.h"
+#include <usetup.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -56,14 +50,12 @@ CreateCommonFreeLoaderSections(PINICACHE IniCache)
                    L"DefaultOS",
                    L"ReactOS");
 
-#if 0
   /* Timeout=10 */
   IniCacheInsertKey(IniSection,
                    NULL,
                    INSERT_LAST,
                    L"TimeOut",
                    L"10");
-#endif
 
   /* Create "Display" section */
   IniSection = IniCacheAppendSection(IniCache,
@@ -248,12 +240,12 @@ CreateFreeLoaderIniForDos(PWCHAR IniPath,
                    L"SystemPath",
                    ArcPath);
 
-  /* Options=/DEBUGPORT=SCREEN */
+  /* Options=/DEBUGPORT=SCREEN /NOGUIBOOT */
   IniCacheInsertKey(IniSection,
                    NULL,
                    INSERT_LAST,
                    L"Options",
-                   L"/DEBUGPORT=SCREEN");
+                   L"/DEBUGPORT=SCREEN /NOGUIBOOT");
 
   /* Create "DOS" section */
   IniSection = IniCacheAppendSection(IniCache,
@@ -359,12 +351,12 @@ CreateFreeLoaderIniForReactos(PWCHAR IniPath,
                    L"SystemPath",
                    ArcPath);
 
-  /* Options=/DEBUGPORT=SCREEN */
+  /* Options=/DEBUGPORT=SCREEN /NOGUIBOOT */
   IniCacheInsertKey(IniSection,
                    NULL,
                    INSERT_LAST,
                    L"Options",
-                   L"/DEBUGPORT=SCREEN");
+                   L"/DEBUGPORT=SCREEN /NOGUIBOOT");
 
   /* Save the ini file */
   IniCacheSave(IniCache, IniPath);
@@ -557,7 +549,7 @@ SaveCurrentBootSector(PWSTR RootPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -595,7 +587,7 @@ SaveCurrentBootSector(PWSTR RootPath,
                             NULL);
 
   Status = NtCreateFile(&FileHandle,
-                       FILE_WRITE_ACCESS,
+                       GENERIC_WRITE,
                        &ObjectAttributes,
                        &IoStatusBlock,
                        NULL,
@@ -660,7 +652,7 @@ InstallFat16BootCodeToFile(PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -709,7 +701,7 @@ InstallFat16BootCodeToFile(PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -755,7 +747,7 @@ InstallFat16BootCodeToFile(PWSTR SrcPath,
                             NULL);
 
   Status = NtCreateFile(&FileHandle,
-                       FILE_WRITE_ACCESS,
+                       GENERIC_WRITE,
                        &ObjectAttributes,
                        &IoStatusBlock,
                        NULL,
@@ -824,7 +816,7 @@ InstallFat32BootCodeToFile(PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -873,7 +865,7 @@ CHECKPOINT1;
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -925,7 +917,7 @@ CHECKPOINT1;
                             NULL);
 
   Status = NtCreateFile(&FileHandle,
-                       FILE_WRITE_ACCESS,
+                       GENERIC_WRITE,
                        &ObjectAttributes,
                        &IoStatusBlock,
                        NULL,
@@ -968,7 +960,7 @@ CHECKPOINT1;
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_WRITE_ACCESS,
+                     GENERIC_WRITE,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1010,13 +1002,13 @@ InstallMbrBootCodeToDisk (PWSTR SrcPath,
   UNICODE_STRING Name;
   HANDLE FileHandle;
   NTSTATUS Status;
-  PUCHAR OrigBootSector;
-  PUCHAR NewBootSector;
+  PPARTITION_SECTOR OrigBootSector;
+  PPARTITION_SECTOR NewBootSector;
 
   /* Allocate buffer for original bootsector */
-  OrigBootSector = (PUCHAR)RtlAllocateHeap(ProcessHeap,
-                                          0,
-                                          SECTORSIZE);
+  OrigBootSector = (PPARTITION_SECTOR)RtlAllocateHeap(ProcessHeap,
+                                                     0,
+                                                      sizeof(PARTITION_SECTOR));
   if (OrigBootSector == NULL)
     return(STATUS_INSUFFICIENT_RESOURCES);
 
@@ -1031,7 +1023,7 @@ InstallMbrBootCodeToDisk (PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1060,9 +1052,9 @@ InstallMbrBootCodeToDisk (PWSTR SrcPath,
 
 
   /* Allocate buffer for new bootsector */
-  NewBootSector = (PUCHAR)RtlAllocateHeap(ProcessHeap,
-                                         0,
-                                         SECTORSIZE);
+  NewBootSector = (PPARTITION_SECTOR)RtlAllocateHeap(ProcessHeap,
+                                                    0,
+                                                     sizeof(PARTITION_SECTOR));
   if (NewBootSector == NULL)
   {
     RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
@@ -1080,7 +1072,7 @@ InstallMbrBootCodeToDisk (PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1098,7 +1090,7 @@ InstallMbrBootCodeToDisk (PWSTR SrcPath,
                      NULL,
                      &IoStatusBlock,
                      NewBootSector,
-                     SECTORSIZE,
+                     sizeof(PARTITION_SECTOR),
                      NULL,
                      NULL);
   NtClose(FileHandle);
@@ -1110,9 +1102,9 @@ InstallMbrBootCodeToDisk (PWSTR SrcPath,
   }
 
   /* Copy partition table from old MBR to new */
-  RtlCopyMemory ((NewBootSector + 446),
-                (OrigBootSector + 446),
-                4*16 /* Length of partition table */);
+  RtlCopyMemory (&NewBootSector->Signature,
+                &OrigBootSector->Signature,
+                sizeof(PARTITION_SECTOR) - offsetof(PARTITION_SECTOR, Signature) /* Length of partition table */);
 
   /* Free the original boot sector */
   RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
@@ -1127,19 +1119,15 @@ InstallMbrBootCodeToDisk (PWSTR SrcPath,
                             NULL,
                             NULL);
 
-  Status = NtCreateFile(&FileHandle,
-                       FILE_WRITE_ACCESS,
-                       &ObjectAttributes,
-                       &IoStatusBlock,
-                       NULL,
-                       FILE_ATTRIBUTE_NORMAL,
-                       0,
-                       FILE_OVERWRITE_IF,
-                       FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY,
-                       NULL,
-                       0);
+  Status = NtOpenFile(&FileHandle,
+                     GENERIC_WRITE,
+                     &ObjectAttributes,
+                     &IoStatusBlock,
+                     0,
+                     FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY);
   if (!NT_SUCCESS(Status))
   {
+    DPRINT1("NtOpenFile() failed (Status %lx)\n", Status);
     RtlFreeHeap(ProcessHeap, 0, NewBootSector);
     return(Status);
   }
@@ -1192,7 +1180,7 @@ InstallFat16BootCodeToDisk(PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1241,7 +1229,7 @@ InstallFat16BootCodeToDisk(PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1288,19 +1276,15 @@ InstallFat16BootCodeToDisk(PWSTR SrcPath,
                             NULL,
                             NULL);
 
-  Status = NtCreateFile(&FileHandle,
-                       FILE_WRITE_ACCESS,
-                       &ObjectAttributes,
-                       &IoStatusBlock,
-                       NULL,
-                       FILE_ATTRIBUTE_NORMAL,
-                       0,
-                       FILE_OVERWRITE_IF,
-                       FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY,
-                       NULL,
-                       0);
+  Status = NtOpenFile(&FileHandle,
+                     GENERIC_WRITE,
+                     &ObjectAttributes,
+                     &IoStatusBlock,
+                     0,
+                     FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY);
   if (!NT_SUCCESS(Status))
   {
+    DPRINT1("NtOpenFile() failed (Status %lx)\n", Status);
     RtlFreeHeap(ProcessHeap, 0, NewBootSector);
     return(Status);
   }
@@ -1358,7 +1342,7 @@ InstallFat32BootCodeToDisk(PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1407,7 +1391,7 @@ InstallFat32BootCodeToDisk(PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ACCESS,
+                     GENERIC_READ,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1458,7 +1442,7 @@ InstallFat32BootCodeToDisk(PWSTR SrcPath,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_WRITE_ACCESS | FILE_WRITE_ATTRIBUTES,
+                     GENERIC_WRITE,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1556,7 +1540,7 @@ UnprotectBootIni(PWSTR FileName,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+                     GENERIC_READ|GENERIC_WRITE,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -1627,7 +1611,7 @@ ProtectBootIni(PWSTR FileName,
                             NULL);
 
   Status = NtOpenFile(&FileHandle,
-                     FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+                     GENERIC_READ|GENERIC_WRITE,
                      &ObjectAttributes,
                      &IoStatusBlock,
                      0,
@@ -2073,7 +2057,7 @@ InstallFatBootcodeToFloppy(PUNICODE_STRING SourceRootPath,
   wcscpy(SrcPath, SourceRootPath->Buffer);
   wcscat(SrcPath, L"\\loader\\freeldr.sys");
 
-  wcscat(DstPath, L"\\Device\\Floppy0\\freeldr.sys");
+  wcscpy(DstPath, L"\\Device\\Floppy0\\freeldr.sys");
 
   DPRINT("Copy: %S ==> %S\n", SrcPath, DstPath);
   Status = SetupCopyFile(SrcPath, DstPath);
@@ -2084,7 +2068,7 @@ InstallFatBootcodeToFloppy(PUNICODE_STRING SourceRootPath,
     }
 
   /* Create new 'freeldr.ini' */
-  wcscat(DstPath, L"\\Device\\Floppy0\\freeldr.ini");
+  wcscpy(DstPath, L"\\Device\\Floppy0\\freeldr.ini");
 
   DPRINT("Create new 'freeldr.ini'\n");
   Status = CreateFreeLoaderIniForReactos(DstPath,
@@ -2099,7 +2083,7 @@ InstallFatBootcodeToFloppy(PUNICODE_STRING SourceRootPath,
   wcscpy(SrcPath, SourceRootPath->Buffer);
   wcscat(SrcPath, L"\\loader\\fat.bin");
 
-  wcscat(DstPath, L"\\Device\\Floppy0");
+  wcscpy(DstPath, L"\\Device\\Floppy0");
 
   DPRINT("Install FAT bootcode: %S ==> %S\n", SrcPath, DstPath);
   Status = InstallFat16BootCodeToDisk(SrcPath,