* PROGRAMMER: Eric Kohl
*/
-#include <ddk/ntddk.h>
-#include <ntdll/rtl.h>
-
-#include "usetup.h"
-#include "inicache.h"
-#include "bootsup.h"
+#include <usetup.h>
+#define NDEBUG
+#include <debug.h>
#define SECTORSIZE 512
L"DefaultOS",
L"ReactOS");
-#if 0
/* Timeout=10 */
IniCacheInsertKey(IniSection,
NULL,
INSERT_LAST,
L"TimeOut",
L"10");
-#endif
/* Create "Display" section */
IniSection = IniCacheAppendSection(IniCache,
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,
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);
UNICODE_STRING Name;
PINICACHE IniCache;
PINICACHESECTION IniSection;
+ PINICACHESECTION OsIniSection;
WCHAR SectionName[80];
WCHAR OsName[80];
+ WCHAR SystemPath[200];
+ WCHAR SectionName2[200];
PWCHAR KeyData;
- ULONG i;
+ ULONG i,j;
NTSTATUS Status;
RtlInitUnicodeString(&Name,
IniSection = IniCacheGetSection(IniCache,
L"Operating Systems");
if (IniSection == NULL)
+ {
+ IniCacheDestroy(IniCache);
return(STATUS_UNSUCCESSFUL);
+ }
- /* Find an unused section name */
+ /* Find an existing usable or an unused section name */
i = 1;
wcscpy(SectionName, L"ReactOS");
wcscpy(OsName, L"\"ReactOS\"");
if (!NT_SUCCESS(Status))
break;
+ /* Get operation system section */
+ if (KeyData[0] == '"')
+ {
+ wcscpy(SectionName2, &KeyData[1]);
+ j = wcslen(SectionName2);
+ if (j > 0)
+ {
+ SectionName2[j-1] = 0;
+ }
+ }
+ else
+ {
+ wcscpy(SectionName2, KeyData);
+ }
+
+ OsIniSection = IniCacheGetSection(IniCache,
+ SectionName2);
+ if (OsIniSection != NULL)
+ {
+ BOOLEAN UseExistingEntry = TRUE;
+
+ /* Check BootType */
+ Status = IniCacheGetKey(OsIniSection,
+ L"BootType",
+ &KeyData);
+ if (NT_SUCCESS(Status))
+ {
+ if (KeyData == NULL
+ || (_wcsicmp(KeyData, L"ReactOS") != 0
+ && _wcsicmp(KeyData, L"\"ReactOS\"") != 0))
+ {
+ /* This is not a ReactOS entry */
+ UseExistingEntry = FALSE;
+ }
+ }
+ else
+ {
+ UseExistingEntry = FALSE;
+ }
+
+ if (UseExistingEntry)
+ {
+ /* BootType is ReactOS. Now check SystemPath */
+ Status = IniCacheGetKey(OsIniSection,
+ L"SystemPath",
+ &KeyData);
+ if (NT_SUCCESS(Status))
+ {
+ swprintf(SystemPath, L"\"%S\"", ArcPath);
+ if (KeyData == NULL
+ || (_wcsicmp(KeyData, ArcPath) != 0
+ && _wcsicmp(KeyData, SystemPath) != 0))
+ {
+ /* This entry is a ReactOS entry, but the SystemRoot does not
+ match the one we are looking for */
+ UseExistingEntry = FALSE;
+ }
+ }
+ else
+ {
+ UseExistingEntry = FALSE;
+ }
+ }
+
+ if (UseExistingEntry)
+ {
+ IniCacheDestroy(IniCache);
+ return(STATUS_SUCCESS);
+ }
+ }
+
swprintf(SectionName, L"ReactOS_%lu", i);
swprintf(OsName, L"\"ReactOS %lu\"", i);
i++;
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, BootSector);
NULL);
Status = NtCreateFile(&FileHandle,
- FILE_WRITE_ACCESS,
+ GENERIC_WRITE,
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_SUPERSEDE,
- FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY,
+ FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY,
NULL,
0);
if (!NT_SUCCESS(Status))
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL);
Status = NtCreateFile(&FileHandle,
- FILE_WRITE_ACCESS,
+ GENERIC_WRITE,
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OVERWRITE_IF,
- FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY,
+ FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY,
NULL,
0);
if (!NT_SUCCESS(Status))
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL);
Status = NtCreateFile(&FileHandle,
- FILE_WRITE_ACCESS,
+ GENERIC_WRITE,
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_SUPERSEDE,
- FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY,
+ FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY,
NULL,
0);
if (!NT_SUCCESS(Status))
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_WRITE_ACCESS,
+ GENERIC_WRITE,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, NewBootSector);
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);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
/* 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);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL,
&IoStatusBlock,
NewBootSector,
- SECTORSIZE,
+ sizeof(PARTITION_SECTOR),
NULL,
NULL);
NtClose(FileHandle);
}
/* 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);
NULL,
NULL);
- Status = NtCreateFile(&FileHandle,
- FILE_WRITE_ACCESS,
- &ObjectAttributes,
- &IoStatusBlock,
- NULL,
- FILE_ATTRIBUTE_NORMAL,
- 0,
- FILE_OVERWRITE_IF,
- FILE_SYNCHRONOUS_IO_ALERT | 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);
}
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL,
NULL);
- Status = NtCreateFile(&FileHandle,
- FILE_WRITE_ACCESS,
- &ObjectAttributes,
- &IoStatusBlock,
- NULL,
- FILE_ATTRIBUTE_NORMAL,
- 0,
- FILE_OVERWRITE_IF,
- FILE_SYNCHRONOUS_IO_ALERT | 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);
}
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ACCESS,
+ GENERIC_READ,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(ProcessHeap, 0, OrigBootSector);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_WRITE_ACCESS | FILE_WRITE_ATTRIBUTES,
+ GENERIC_WRITE,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT | FILE_SEQUENTIAL_ONLY);
+ FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtOpenFile() failed (Status %lx)\n", Status);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+ GENERIC_READ|GENERIC_WRITE,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (Status == STATUS_NO_SUCH_FILE)
{
DPRINT1("NtOpenFile() failed (Status %lx)\n", Status);
NULL);
Status = NtOpenFile(&FileHandle,
- FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+ GENERIC_READ|GENERIC_WRITE,
&ObjectAttributes,
&IoStatusBlock,
0,
- FILE_SYNCHRONOUS_IO_ALERT);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtOpenFile() failed (Status %lx)\n", Status);
FALSE);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
return(Status);
}
L"operating systems");
if (Section == NULL)
{
-CHECKPOINT1;
IniCacheDestroy(Cache);
return(STATUS_UNSUCCESSFUL);
}
&FileAttribute);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
IniCacheDestroy(Cache);
return(Status);
}
BootIniPath);
if (!NT_SUCCESS(Status))
{
-CHECKPOINT1;
IniCacheDestroy(Cache);
return(Status);
}
return(Status);
}
+
+BOOLEAN
+CheckInstallFatBootcodeToPartition(PUNICODE_STRING SystemRootPath)
+{
+ if (DoesFileExist(SystemRootPath->Buffer, L"ntldr") ||
+ DoesFileExist(SystemRootPath->Buffer, L"boot.ini"))
+ {
+ return TRUE;
+ }
+ else if (DoesFileExist(SystemRootPath->Buffer, L"io.sys") ||
+ DoesFileExist(SystemRootPath->Buffer, L"msdos.sys"))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+NTSTATUS
+InstallFatBootcodeToPartition(PUNICODE_STRING SystemRootPath,
+ PUNICODE_STRING SourceRootPath,
+ PUNICODE_STRING DestinationArcPath,
+ UCHAR PartitionType)
+{
+ WCHAR SrcPath[MAX_PATH];
+ WCHAR DstPath[MAX_PATH];
+ NTSTATUS Status;
+
+ /* FAT or FAT32 partition */
+ DPRINT1("System path: '%wZ'\n", SystemRootPath);
+
+ if (DoesFileExist(SystemRootPath->Buffer, L"ntldr") == TRUE ||
+ DoesFileExist(SystemRootPath->Buffer, L"boot.ini") == TRUE)
+ {
+ /* Search root directory for 'ntldr' and 'boot.ini'. */
+ DPRINT("Found Microsoft Windows NT/2000/XP boot loader\n");
+
+ /* Copy FreeLoader to the boot partition */
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\freeldr.sys");
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.sys");
+
+ DPRINT("Copy: %S ==> %S\n", SrcPath, DstPath);
+ Status = SetupCopyFile(SrcPath, DstPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Create or update freeldr.ini */
+ if (DoesFileExist(SystemRootPath->Buffer, L"freeldr.ini") == FALSE)
+ {
+ /* Create new 'freeldr.ini' */
+ DPRINT1("Create new 'freeldr.ini'\n");
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.ini");
+
+ Status = CreateFreeLoaderIniForReactos(DstPath,
+ DestinationArcPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("CreateFreeLoaderIniForReactos() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Install new bootcode */
+ if (PartitionType == PARTITION_FAT32 ||
+ PartitionType == PARTITION_FAT32_XINT13)
+ {
+ /* Install FAT32 bootcode */
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\fat32.bin");
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\bootsect.ros");
+
+ DPRINT1("Install FAT32 bootcode: %S ==> %S\n", SrcPath, DstPath);
+ Status = InstallFat32BootCodeToFile(SrcPath,
+ DstPath,
+ SystemRootPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InstallFat32BootCodeToFile() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ else
+ {
+ /* Install FAT16 bootcode */
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\fat.bin");
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\bootsect.ros");
+
+ DPRINT1("Install FAT bootcode: %S ==> %S\n", SrcPath, DstPath);
+ Status = InstallFat16BootCodeToFile(SrcPath,
+ DstPath,
+ SystemRootPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InstallFat16BootCodeToFile() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+
+ /* Update 'boot.ini' */
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\boot.ini");
+
+ DPRINT1("Update 'boot.ini': %S\n", DstPath);
+ Status = UpdateBootIni(DstPath,
+ L"C:\\bootsect.ros",
+ L"\"ReactOS\"");
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("UpdateBootIni() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ else
+ {
+ /* Update existing 'freeldr.ini' */
+ DPRINT1("Update existing 'freeldr.ini'\n");
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.ini");
+
+ Status = UpdateFreeLoaderIni(DstPath,
+ DestinationArcPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ }
+ else if (DoesFileExist(SystemRootPath->Buffer, L"io.sys") == TRUE ||
+ DoesFileExist(SystemRootPath->Buffer, L"msdos.sys") == TRUE)
+ {
+ /* Search for root directory for 'io.sys' and 'msdos.sys'. */
+ DPRINT1("Found Microsoft DOS or Windows 9x boot loader\n");
+
+ /* Copy FreeLoader to the boot partition */
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\freeldr.sys");
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.sys");
+
+ DPRINT("Copy: %S ==> %S\n", SrcPath, DstPath);
+ Status = SetupCopyFile(SrcPath, DstPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Create or update 'freeldr.ini' */
+ if (DoesFileExist(SystemRootPath->Buffer, L"freeldr.ini") == FALSE)
+ {
+ /* Create new 'freeldr.ini' */
+ DPRINT1("Create new 'freeldr.ini'\n");
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.ini");
+
+ Status = CreateFreeLoaderIniForDos(DstPath,
+ DestinationArcPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("CreateFreeLoaderIniForDos() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Save current bootsector as 'BOOTSECT.DOS' */
+ wcscpy(SrcPath, SystemRootPath->Buffer);
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\bootsect.dos");
+
+ DPRINT1("Save bootsector: %S ==> %S\n", SrcPath, DstPath);
+ Status = SaveCurrentBootSector(SrcPath,
+ DstPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SaveCurrentBootSector() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Install new bootsector */
+ if (PartitionType == PARTITION_FAT32 ||
+ PartitionType == PARTITION_FAT32_XINT13)
+ {
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\fat32.bin");
+
+ DPRINT1("Install FAT32 bootcode: %S ==> %S\n", SrcPath, SystemRootPath->Buffer);
+ Status = InstallFat32BootCodeToDisk(SrcPath,
+ SystemRootPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InstallFat32BootCodeToDisk() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ else
+ {
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\fat.bin");
+
+ DPRINT1("Install FAT bootcode: %S ==> %S\n", SrcPath, SystemRootPath->Buffer);
+ Status = InstallFat16BootCodeToDisk(SrcPath,
+ SystemRootPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ }
+ else
+ {
+ /* Update existing 'freeldr.ini' */
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.ini");
+
+ Status = UpdateFreeLoaderIni(DstPath,
+ DestinationArcPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ }
+ else
+ {
+ /* No or unknown boot loader */
+ DPRINT1("No or unknown boot loader found\n");
+
+ /* Copy FreeLoader to the boot partition */
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\freeldr.sys");
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.sys");
+
+ DPRINT1("Copy: %S ==> %S\n", SrcPath, DstPath);
+ Status = SetupCopyFile(SrcPath, DstPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Create or update 'freeldr.ini' */
+ if (DoesFileExist(SystemRootPath->Buffer, L"freeldr.ini") == FALSE)
+ {
+ /* Create new freeldr.ini */
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.ini");
+
+ DPRINT1("Copy: %S ==> %S\n", SrcPath, DstPath);
+ Status = CreateFreeLoaderIniForReactos(DstPath,
+ DestinationArcPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("CreateFreeLoaderIniForReactos() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Save current bootsector as 'BOOTSECT.OLD' */
+ wcscpy(SrcPath, SystemRootPath->Buffer);
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\bootsect.old");
+
+ DPRINT1("Save bootsector: %S ==> %S\n", SrcPath, DstPath);
+ Status = SaveCurrentBootSector(SrcPath,
+ DstPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SaveCurrentBootSector() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Install new bootsector */
+ if (PartitionType == PARTITION_FAT32 ||
+ PartitionType == PARTITION_FAT32_XINT13)
+ {
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\fat32.bin");
+
+ DPRINT("Install FAT32 bootcode: %S ==> %S\n", SrcPath, SystemRootPath->Buffer);
+ Status = InstallFat32BootCodeToDisk(SrcPath,
+ SystemRootPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InstallFat32BootCodeToDisk() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ else
+ {
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\fat.bin");
+
+ DPRINT("Install FAT bootcode: %S ==> %S\n", SrcPath, SystemRootPath->Buffer);
+ Status = InstallFat16BootCodeToDisk(SrcPath,
+ SystemRootPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ }
+ else
+ {
+ /* Update existing 'freeldr.ini' */
+ wcscpy(DstPath, SystemRootPath->Buffer);
+ wcscat(DstPath, L"\\freeldr.ini");
+
+ Status = UpdateFreeLoaderIni(DstPath,
+ DestinationArcPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("UpdateFreeLoaderIni() failed (Status %lx)\n", Status);
+ return Status;
+ }
+ }
+ }
+
+ return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+InstallFatBootcodeToFloppy(PUNICODE_STRING SourceRootPath,
+ PUNICODE_STRING DestinationArcPath)
+{
+ WCHAR SrcPath[MAX_PATH];
+ WCHAR DstPath[MAX_PATH];
+ NTSTATUS Status;
+
+ /* Copy FreeLoader to the boot partition */
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\freeldr.sys");
+
+ wcscpy(DstPath, L"\\Device\\Floppy0\\freeldr.sys");
+
+ DPRINT("Copy: %S ==> %S\n", SrcPath, DstPath);
+ Status = SetupCopyFile(SrcPath, DstPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SetupCopyFile() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Create new 'freeldr.ini' */
+ wcscpy(DstPath, L"\\Device\\Floppy0\\freeldr.ini");
+
+ DPRINT("Create new 'freeldr.ini'\n");
+ Status = CreateFreeLoaderIniForReactos(DstPath,
+ DestinationArcPath->Buffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("CreateFreeLoaderIniForReactos() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ /* Install FAT12/16 boosector */
+ wcscpy(SrcPath, SourceRootPath->Buffer);
+ wcscat(SrcPath, L"\\loader\\fat.bin");
+
+ wcscpy(DstPath, L"\\Device\\Floppy0");
+
+ DPRINT("Install FAT bootcode: %S ==> %S\n", SrcPath, DstPath);
+ Status = InstallFat16BootCodeToDisk(SrcPath,
+ DstPath);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InstallFat16BootCodeToDisk() failed (Status %lx)\n", Status);
+ return Status;
+ }
+
+ return STATUS_SUCCESS;
+}
+
/* EOF */