Synchronize with trunk revision 59636 (just before Alex's CreateProcess revamp).
[reactos.git] / base / setup / usetup / bootsup.c
index 64f10bc..0c05cbb 100644 (file)
@@ -103,7 +103,11 @@ CreateCommonFreeLoaderSections(PINICACHE IniCache)
                           NULL,
                           INSERT_LAST,
                           L"DefaultOS",
+#ifndef _WINKD_
                           L"ReactOS_KdSerial");
+#else
+                          L"ReactOS_Debug");
+#endif
     }
     else
 #endif
@@ -482,6 +486,12 @@ CreateFreeLoaderIniForReactos(
                           L"/DEBUG /DEBUGPORT=COM1 /BAUDRATE=115200 /SOS /KDSERIAL");
 #endif
 
+    /* ReactOS_Screen */
+    CreateFreeLoaderEntry(IniCache, IniSection,
+                          L"ReactOS_Screen", L"\"ReactOS (Screen)\"",
+                          L"Windows2003", ArcPath,
+                          L"/DEBUG /DEBUGPORT=SCREEN /SOS");
+
     /* ReactOS_LogFile */
     CreateFreeLoaderEntry(IniCache, IniSection,
                           L"ReactOS_LogFile", L"\"ReactOS (Log file)\"",
@@ -673,7 +683,7 @@ SaveCurrentBootSector(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -710,7 +720,7 @@ SaveCurrentBootSector(
                                NULL);
 
     Status = NtCreateFile(&FileHandle,
-                          GENERIC_WRITE,
+                          GENERIC_WRITE | SYNCHRONIZE,
                           &ObjectAttributes,
                           &IoStatusBlock,
                           NULL,
@@ -773,7 +783,7 @@ InstallFat16BootCodeToFile(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -818,7 +828,7 @@ InstallFat16BootCodeToFile(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -866,7 +876,7 @@ InstallFat16BootCodeToFile(
                                NULL);
 
     Status = NtCreateFile(&FileHandle,
-                          GENERIC_WRITE,
+                          GENERIC_WRITE | SYNCHRONIZE,
                           &ObjectAttributes,
                           &IoStatusBlock,
                           NULL,
@@ -933,7 +943,7 @@ InstallFat32BootCodeToFile(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -978,7 +988,7 @@ InstallFat32BootCodeToFile(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1029,7 +1039,7 @@ InstallFat32BootCodeToFile(
                                NULL);
 
     Status = NtCreateFile(&FileHandle,
-                          GENERIC_WRITE,
+                          GENERIC_WRITE | SYNCHRONIZE,
                           &ObjectAttributes,
                           &IoStatusBlock,
                           NULL,
@@ -1071,7 +1081,7 @@ InstallFat32BootCodeToFile(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_WRITE,
+                        GENERIC_WRITE | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1088,7 +1098,7 @@ InstallFat32BootCodeToFile(
                          NULL,
                          NULL,
                          &IoStatusBlock,
-                         (NewBootSector + SECTORSIZE),
+                         ((PUCHAR)NewBootSector + SECTORSIZE),
                          SECTORSIZE,
                          &FileOffset,
                          NULL);
@@ -1135,7 +1145,7 @@ InstallMbrBootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1183,7 +1193,7 @@ InstallMbrBootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1230,7 +1240,7 @@ InstallMbrBootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_WRITE,
+                        GENERIC_WRITE | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1259,6 +1269,161 @@ InstallMbrBootCodeToDisk(
     return Status;
 }
 
+NTSTATUS
+InstallFat12BootCodeToFloppy(PWSTR SrcPath,
+                             PWSTR RootPath)
+{
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    IO_STATUS_BLOCK IoStatusBlock;
+    UNICODE_STRING Name;
+    HANDLE FileHandle;
+    NTSTATUS Status;
+    PFAT_BOOTSECTOR OrigBootSector;
+    PFAT_BOOTSECTOR NewBootSector;
+    
+    /* Allocate buffer for original bootsector */
+    OrigBootSector = RtlAllocateHeap(ProcessHeap, 0, SECTORSIZE);
+    if (OrigBootSector == NULL)
+        return STATUS_INSUFFICIENT_RESOURCES;
+    
+    /* Read current boot sector into buffer */
+    RtlInitUnicodeString(&Name, RootPath);
+    
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &Name,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+    
+    Status = NtOpenFile(&FileHandle,
+                        GENERIC_READ | SYNCHRONIZE,
+                        &ObjectAttributes,
+                        &IoStatusBlock,
+                        0,
+                        FILE_SYNCHRONOUS_IO_NONALERT);
+    if (!NT_SUCCESS(Status))
+    {
+        RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
+        return Status;
+    }
+    
+    Status = NtReadFile(FileHandle,
+                        NULL,
+                        NULL,
+                        NULL,
+                        &IoStatusBlock,
+                        OrigBootSector,
+                        SECTORSIZE,
+                        NULL,
+                        NULL);
+    NtClose(FileHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
+        return Status;
+    }
+    
+    
+    /* Allocate buffer for new bootsector */
+    NewBootSector = RtlAllocateHeap(ProcessHeap,
+                                    0,
+                                    SECTORSIZE);
+    if (NewBootSector == NULL)
+    {
+        RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+    
+    /* Read new bootsector from SrcPath */
+    RtlInitUnicodeString(&Name, SrcPath);
+    
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &Name,
+                               OBJ_CASE_INSENSITIVE,
+                               NULL,
+                               NULL);
+    
+    Status = NtOpenFile(&FileHandle,
+                        GENERIC_READ | SYNCHRONIZE,
+                        &ObjectAttributes,
+                        &IoStatusBlock,
+                        0,
+                        FILE_SYNCHRONOUS_IO_NONALERT);
+    if (!NT_SUCCESS(Status))
+    {
+        RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
+        RtlFreeHeap(ProcessHeap, 0, NewBootSector);
+        return Status;
+    }
+    
+    Status = NtReadFile(FileHandle,
+                        NULL,
+                        NULL,
+                        NULL,
+                        &IoStatusBlock,
+                        NewBootSector,
+                        SECTORSIZE,
+                        NULL,
+                        NULL);
+    NtClose(FileHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
+        RtlFreeHeap(ProcessHeap, 0, NewBootSector);
+        return Status;
+    }
+    
+    /* Adjust bootsector (copy a part of the FAT16 BPB) */
+    memcpy(&NewBootSector->OemName,
+           &OrigBootSector->OemName,
+           FIELD_OFFSET(FAT_BOOTSECTOR, BootCodeAndData) -
+           FIELD_OFFSET(FAT_BOOTSECTOR, OemName));
+    
+    /* Free the original boot sector */
+    RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
+    
+    /* Write new bootsector to RootPath */
+    RtlInitUnicodeString(&Name, RootPath);
+    
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &Name,
+                               0,
+                               NULL,
+                               NULL);
+    
+    Status = NtOpenFile(&FileHandle,
+                        GENERIC_WRITE | SYNCHRONIZE,
+                        &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;
+    }
+    
+#if 0
+    FilePosition.QuadPart = 0;
+#endif
+    Status = NtWriteFile(FileHandle,
+                         NULL,
+                         NULL,
+                         NULL,
+                         &IoStatusBlock,
+                         NewBootSector,
+                         SECTORSIZE,
+                         NULL,
+                         NULL);
+    NtClose(FileHandle);
+    
+    /* Free the new boot sector */
+    RtlFreeHeap(ProcessHeap, 0, NewBootSector);
+    
+    return Status;
+}
+
 
 NTSTATUS
 InstallFat16BootCodeToDisk(
@@ -1289,7 +1454,7 @@ InstallFat16BootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1337,7 +1502,7 @@ InstallFat16BootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1388,7 +1553,7 @@ InstallFat16BootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_WRITE,
+                        GENERIC_WRITE | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1452,7 +1617,7 @@ InstallFat32BootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1498,7 +1663,7 @@ InstallFat32BootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ,
+                        GENERIC_READ | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1552,7 +1717,7 @@ InstallFat32BootCodeToDisk(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_WRITE,
+                        GENERIC_WRITE | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1651,7 +1816,7 @@ UnprotectBootIni(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ|GENERIC_WRITE,
+                        GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -1725,7 +1890,7 @@ ProtectBootIni(
                                NULL);
 
     Status = NtOpenFile(&FileHandle,
-                        GENERIC_READ|GENERIC_WRITE,
+                        GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,
                         &ObjectAttributes,
                         &IoStatusBlock,
                         0,
@@ -2198,9 +2363,23 @@ InstallFatBootcodeToFloppy(
     PUNICODE_STRING DestinationArcPath)
 {
 #ifdef __REACTOS__
+    UNICODE_STRING FloppyDevice = RTL_CONSTANT_STRING(L"\\Device\\Floppy0");
     WCHAR SrcPath[MAX_PATH];
     WCHAR DstPath[MAX_PATH];
     NTSTATUS Status;
+    
+    /* Format the floppy first */
+    Status = VfatFormat(&FloppyDevice,
+                        FMIFS_FLOPPY,
+                        NULL,
+                        TRUE,
+                        0,
+                        NULL);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("VfatFormat() failed (Status %lx)\n", Status);
+        return Status;
+    }
 
     /* Copy FreeLoader to the boot partition */
     wcscpy(SrcPath, SourceRootPath->Buffer);
@@ -2234,7 +2413,7 @@ InstallFatBootcodeToFloppy(
     wcscpy(DstPath, L"\\Device\\Floppy0");
 
     DPRINT("Install FAT bootcode: %S ==> %S\n", SrcPath, DstPath);
-    Status = InstallFat16BootCodeToDisk(SrcPath, DstPath);
+    Status = InstallFat12BootCodeToFloppy(SrcPath, DstPath);
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status);