#define NDEBUG
#include <debug.h>
+// HACK!
+#include <strsafe.h>
+
/* GLOBALS ******************************************************************/
HANDLE ProcessHeap;
-UNICODE_STRING SourceRootPath;
-UNICODE_STRING SourceRootDir;
-UNICODE_STRING SourcePath;
+static UNICODE_STRING SourceRootPath;
+static UNICODE_STRING SourceRootDir;
+/* static */ UNICODE_STRING SourcePath;
BOOLEAN IsUnattendedSetup = FALSE;
LONG UnattendDestinationDiskNumber;
LONG UnattendDestinationPartitionNumber;
static UNICODE_STRING DestinationArcPath;
static UNICODE_STRING DestinationRootPath;
-static WCHAR DestinationDriveLetter; // FIXME: Is it really useful??
+// FIXME: Is it really useful?? Just used for SetDefaultPagefile...
+static WCHAR DestinationDriveLetter;
static HINF SetupInf;
}
-VOID
+static VOID
CheckUnattendedSetup(VOID)
{
WCHAR UnattendInfPath[MAX_PATH];
INT IntValue;
PWCHAR Value;
- CombinePaths(UnattendInfPath, ARRAYSIZE(UnattendInfPath), 2, SourcePath.Buffer, L"\\unattend.inf");
+ CombinePaths(UnattendInfPath, ARRAYSIZE(UnattendInfPath), 2, SourcePath.Buffer, L"unattend.inf");
if (DoesFileExist(NULL, UnattendInfPath) == FALSE)
{
if (INF_GetData(&Context, NULL, &Value))
{
LONG Id = wcstol(Value, NULL, 16);
- swprintf(LocaleID,L"%08lx", Id);
+ swprintf(LocaleID, L"%08lx", Id);
}
}
}
-VOID
+static VOID
UpdateKBLayout(VOID)
{
PGENERIC_LIST_ENTRY ListEntry;
/*
* Displays the LanguagePage.
*
- * Next pages: IntroPage, QuitPage
+ * Next pages: WelcomePage, QuitPage
*
* SIDEEFFECTS
* Init SelectedLanguageId
if (LanguageList == NULL)
{
PopupError("Setup failed to initialize available translations", NULL, NULL, POPUP_WAIT_NONE);
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
}
if (GenericListHasSingleEntry(LanguageList))
{
LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
InitGenericListUi(&ListUi, LanguageList);
/* Load the font */
SetConsoleCodePage();
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b))
{
}
}
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
Status = GetSourcePaths(&SourcePath,
&SourceRootPath,
&SourceRootDir);
-
if (!NT_SUCCESS(Status))
{
CONSOLE_PrintTextXY(6, 15, "GetSourcePaths() failed (Status 0x%08lx)", Status);
MUIDisplayError(ERROR_NO_SOURCE_DRIVE, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
-#if 0
- else
- {
- CONSOLE_PrintTextXY(6, 15, "SourcePath: '%wZ'", &SourcePath);
- CONSOLE_PrintTextXY(6, 16, "SourceRootPath: '%wZ'", &SourceRootPath);
- CONSOLE_PrintTextXY(6, 17, "SourceRootDir: '%wZ'", &SourceRootDir);
- }
-#endif
+ DPRINT1("SourcePath: '%wZ'", &SourcePath);
+ DPRINT1("SourceRootPath: '%wZ'", &SourceRootPath);
+ DPRINT1("SourceRootDir: '%wZ'", &SourceRootDir);
/* Load txtsetup.sif from install media. */
- CombinePaths(FileNameBuffer, ARRAYSIZE(FileNameBuffer), 2, SourcePath.Buffer, L"\\txtsetup.sif");
+ CombinePaths(FileNameBuffer, ARRAYSIZE(FileNameBuffer), 2, SourcePath.Buffer, L"txtsetup.sif");
SetupInf = SetupOpenInfFileW(FileNameBuffer,
NULL,
INF_STYLE_WIN4,
/*
- * Displays the IntroPage.
+ * Displays the WelcomePage.
*
* Next pages:
* InstallIntroPage (default)
* Number of the next page.
*/
static PAGE_NUMBER
-IntroPage(PINPUT_RECORD Ir)
+WelcomePage(PINPUT_RECORD Ir)
{
- MUIDisplayPage(START_PAGE);
+ MUIDisplayPage(WELCOME_PAGE);
while (TRUE)
{
}
}
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
* Displays the License page.
*
* Next page:
- * IntroPage (default)
+ * WelcomePage (default)
*
* RETURNS
* Number of the next page.
if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */
{
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
}
static PAGE_NUMBER
InstallIntroPage(PINPUT_RECORD Ir)
{
- MUIDisplayPage(INSTALL_INTRO_PAGE);
-
if (RepairUpdateFlag)
{
//return SELECT_PARTITION_PAGE;
}
if (IsUnattendedSetup)
- {
return SELECT_PARTITION_PAGE;
- }
+
+ MUIDisplayPage(INSTALL_INTRO_PAGE);
while (TRUE)
{
static PAGE_NUMBER
ScsiControllerPage(PINPUT_RECORD Ir)
{
- SetTextXY(6, 8, "Setup detected the following mass storage devices:");
+ // MUIDisplayPage(SCSI_CONTROLLER_PAGE);
+
+ CONSOLE_SetTextXY(6, 8, "Setup detected the following mass storage devices:");
/* FIXME: print loaded mass storage driver descriptions */
#if 0
- SetTextXY(8, 10, "TEST device");
+ CONSOLE_SetTextXY(8, 10, "TEST device");
#endif
-
- SetStatusText(" ENTER = Continue F3 = Quit");
+ CONSOLE_SetStatusText(" ENTER = Continue F3 = Quit");
while (TRUE)
{
- ConInKey(Ir);
+ CONSOLE_ConInKey(Ir);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
return SCSI_CONTROLLER_PAGE;
}
+
+static PAGE_NUMBER
+OemDriverPage(PINPUT_RECORD Ir)
+{
+ // MUIDisplayPage(OEM_DRIVER_PAGE);
+
+ CONSOLE_SetTextXY(6, 8, "This is the OEM driver page!");
+
+ /* FIXME: Implement!! */
+
+ CONSOLE_SetStatusText(" ENTER = Continue F3 = Quit");
+
+ while (TRUE)
+ {
+ CONSOLE_ConInKey(Ir);
+
+ if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
+ {
+ if (ConfirmQuit(Ir) == TRUE)
+ return QUIT_PAGE;
+
+ break;
+ }
+ else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
+ {
+ return DEVICE_SETTINGS_PAGE;
+ }
+ }
+
+ return OEM_DRIVER_PAGE;
+}
#endif
DeviceSettingsPage(PINPUT_RECORD Ir)
{
static ULONG Line = 16;
- MUIDisplayPage(DEVICE_SETTINGS_PAGE);
/* Initialize the computer settings list */
if (ComputerList == NULL)
}
}
- MUIDisplayPage(DEVICE_SETTINGS_PAGE);
+ if (RepairUpdateFlag)
+ return SELECT_PARTITION_PAGE;
+ // if (IsUnattendedSetup)
+ // return SELECT_PARTITION_PAGE;
- CONSOLE_SetTextXY(25, 11, GetListEntryText(GetCurrentListEntry((ComputerList))));
- CONSOLE_SetTextXY(25, 12, GetListEntryText(GetCurrentListEntry((DisplayList))));
- CONSOLE_SetTextXY(25, 13, GetListEntryText(GetCurrentListEntry((KeyboardList))));
- CONSOLE_SetTextXY(25, 14, GetListEntryText(GetCurrentListEntry((LayoutList))));
+ MUIDisplayPage(DEVICE_SETTINGS_PAGE);
- CONSOLE_InvertTextXY(24, Line, 48, 1);
+ CONSOLE_SetTextXY(25, 11, GetListEntryText(GetCurrentListEntry(ComputerList)));
+ CONSOLE_SetTextXY(25, 12, GetListEntryText(GetCurrentListEntry(DisplayList)));
+ CONSOLE_SetTextXY(25, 13, GetListEntryText(GetCurrentListEntry(KeyboardList)));
+ CONSOLE_SetTextXY(25, 14, GetListEntryText(GetCurrentListEntry(LayoutList)));
- if (RepairUpdateFlag)
- {
- return SELECT_PARTITION_PAGE;
- }
+ CONSOLE_InvertTextXY(24, Line, 48, 1);
while (TRUE)
{
* QuitPage
*
* SIDEEFFECTS
- * Init DestinationDriveLetter (only if unattended or not free space is selected)
* Set InstallShortcut (only if not unattended + free space is selected)
*
* RETURNS
PARTLIST_UI ListUi;
ULONG Error;
- MUIDisplayPage(SELECT_PARTITION_PAGE);
-
if (PartitionList == NULL)
{
PartitionList = CreatePartitionList();
FormatState = Start;
}
+ MUIDisplayPage(SELECT_PARTITION_PAGE);
+
InitPartitionListUi(&ListUi, PartitionList,
2,
23,
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
- DestinationDriveLetter = (WCHAR)PartitionList->CurrentPartition->DriveLetter;
-
return SELECT_FILE_SYSTEM_PAGE;
}
}
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
- DestinationDriveLetter = (WCHAR)PartitionList->CurrentPartition->DriveLetter;
-
return SELECT_FILE_SYSTEM_PAGE;
}
}
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
- DestinationDriveLetter = (WCHAR)PartitionList->CurrentPartition->DriveLetter;
-
return SELECT_FILE_SYSTEM_PAGE;
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'P') /* P */
if (DiskEntry->DriverName.Length > 0)
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDINFOPARTCREATE),
+ MUIGetString(STRING_HDINFOPARTCREATE_1),
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- &DiskEntry->DriverName);
+ &DiskEntry->DriverName,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
else
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDDINFOUNK1),
+ MUIGetString(STRING_HDINFOPARTCREATE_2),
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
- DiskEntry->Id);
+ DiskEntry->Id,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
CONSOLE_SetTextXY(6, 12, MUIGetString(STRING_HDDSIZE));
if (DiskEntry->DriverName.Length > 0)
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDINFOPARTCREATE),
+ MUIGetString(STRING_HDINFOPARTCREATE_1),
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- &DiskEntry->DriverName);
+ &DiskEntry->DriverName,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
else
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDDINFOUNK1),
+ MUIGetString(STRING_HDINFOPARTCREATE_2),
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
- DiskEntry->Id);
+ DiskEntry->Id,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
CONSOLE_SetTextXY(6, 12, MUIGetString(STRING_HDDSIZE));
if (DiskEntry->DriverName.Length > 0)
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDINFOPARTCREATE),
+ MUIGetString(STRING_HDINFOPARTCREATE_1),
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- &DiskEntry->DriverName);
+ &DiskEntry->DriverName,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
else
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDDINFOUNK1),
+ MUIGetString(STRING_HDINFOPARTCREATE_2),
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
- DiskEntry->Id);
+ DiskEntry->Id,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
CONSOLE_SetTextXY(6, 12, MUIGetString(STRING_HDDSIZE));
if (DiskEntry->DriverName.Length > 0)
{
CONSOLE_PrintTextXY(6, 12,
- MUIGetString(STRING_HDINFOPARTDELETE),
+ MUIGetString(STRING_HDINFOPARTDELETE_1),
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- &DiskEntry->DriverName);
+ &DiskEntry->DriverName,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
else
{
CONSOLE_PrintTextXY(6, 12,
- MUIGetString(STRING_HDDINFOUNK3),
+ MUIGetString(STRING_HDINFOPARTDELETE_2),
DiskSize,
Unit,
DiskEntry->DiskNumber,
DiskEntry->Port,
DiskEntry->Bus,
- DiskEntry->Id);
+ DiskEntry->Id,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
while (TRUE)
if (PartitionList->SystemPartition == NULL)
{
/* FIXME: show an error dialog */
+ //
+ // Error dialog should say that we cannot find a suitable
+ // system partition and create one on the system. At this point,
+ // it may be nice to ask the user whether he wants to continue,
+ // or use an external drive as the system drive/partition
+ // (e.g. floppy, USB drive, etc...)
+ //
return QUIT_PAGE;
}
PartTypeString);
#endif
- CONSOLE_PrintTextXY(8, 10, MUIGetString(STRING_HDINFOPARTZEROED),
+ CONSOLE_PrintTextXY(8, 10, MUIGetString(STRING_HDINFOPARTZEROED_1),
DiskEntry->DiskNumber,
DiskSize,
DiskUnit,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- &DiskEntry->DriverName);
+ &DiskEntry->DriverName,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
CONSOLE_SetTextXY(6, 12, MUIGetString(STRING_PARTFORMAT));
PartUnit);
}
- CONSOLE_PrintTextXY(6, 12, MUIGetString(STRING_HDINFOPARTEXISTS),
+ CONSOLE_PrintTextXY(6, 12, MUIGetString(STRING_HDINFOPARTEXISTS_1),
DiskEntry->DiskNumber,
DiskSize,
DiskUnit,
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- &DiskEntry->DriverName);
+ &DiskEntry->DriverName,
+ DiskEntry->NoMbr ? "GPT" : "MBR");
}
MUIDisplayPage(SELECT_FILE_SYSTEM_PAGE);
}
}
- DrawFileSystemList(FileSystemList);
-
if (RepairUpdateFlag)
{
return CHECK_FILE_SYSTEM_PAGE;
return CHECK_FILE_SYSTEM_PAGE;
}
+ DrawFileSystemList(FileSystemList);
+
while (TRUE)
{
CONSOLE_ConInKey(Ir);
}
/* Set PartitionRootPath */
- swprintf(PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- DiskEntry->DiskNumber,
- PartEntry->PartitionNumber);
- RtlInitUnicodeString(&PartitionRootPath,
- PathBuffer);
+ StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ DiskEntry->DiskNumber,
+ PartEntry->PartitionNumber);
+ RtlInitUnicodeString(&PartitionRootPath, PathBuffer);
DPRINT("PartitionRootPath: %wZ\n", &PartitionRootPath);
/* Format the partition */
}
/* Set PartitionRootPath */
- swprintf(PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- DiskEntry->DiskNumber,
- PartEntry->PartitionNumber);
+ StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ DiskEntry->DiskNumber,
+ PartEntry->PartitionNumber);
RtlInitUnicodeString(&PartitionRootPath, PathBuffer);
DPRINT("PartitionRootPath: %wZ\n", &PartitionRootPath);
}
-static
-VOID
-BuildInstallPaths(PWCHAR InstallDir,
+static VOID
+BuildInstallPaths(PWSTR InstallDir,
PDISKENTRY DiskEntry,
PPARTENTRY PartEntry)
{
/* Create 'DestinationRootPath' string */
RtlFreeUnicodeString(&DestinationRootPath);
- swprintf(PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- DiskEntry->DiskNumber,
- PartEntry->PartitionNumber);
+ StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu\\",
+ DiskEntry->DiskNumber,
+ PartEntry->PartitionNumber);
RtlCreateUnicodeString(&DestinationRootPath, PathBuffer);
DPRINT("DestinationRootPath: %wZ\n", &DestinationRootPath);
/* Create 'DestinationArcPath' */
RtlFreeUnicodeString(&DestinationArcPath);
- swprintf(PathBuffer,
- L"multi(0)disk(0)rdisk(%lu)partition(%lu)",
- DiskEntry->BiosDiskNumber,
- PartEntry->PartitionNumber);
+ StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"multi(0)disk(0)rdisk(%lu)partition(%lu)\\",
+ DiskEntry->BiosDiskNumber,
+ PartEntry->PartitionNumber);
ConcatPaths(PathBuffer, ARRAYSIZE(PathBuffer), 1, InstallDir);
RtlCreateUnicodeString(&DestinationArcPath, PathBuffer);
+
+ /* Initialize DestinationDriveLetter */
+ DestinationDriveLetter = (WCHAR)PartEntry->DriveLetter;
}
PWCHAR DirKeyValue;
PWCHAR TargetFileName;
+ /*
+ * This code enumerates the list of files in reactos.dff / reactos.inf
+ * that need to be extracted from reactos.cab and be installed in their
+ * respective directories.
+ */
+
/* Search for the SectionName section */
if (!SetupFindFirstLineW(InfFile, SectionName, NULL, &FilesContext))
{
- char Buffer[128];
+ CHAR Buffer[128];
sprintf(Buffer, MUIGetString(STRING_TXTSETUPFAILED), SectionName);
PopupError(Buffer, MUIGetString(STRING_REBOOTCOMPUTER), Ir, POPUP_WAIT_ENTER);
return FALSE;
}
/*
- * Enumerate the files in the section
- * and add them to the file queue.
+ * Enumerate the files in the section and add them to the file queue.
*/
do
{
PWCHAR FileKeyValue;
PWCHAR DirKeyValue;
PWCHAR TargetFileName;
- ULONG Length;
- WCHAR CompleteOrigDirName[512];
+ WCHAR CompleteOrigDirName[512]; // FIXME: MAX_PATH is not enough?
if (SourceCabinet)
return AddSectionToCopyQueueCab(InfFile, L"SourceFiles", SourceCabinet, DestinationPath, Ir);
+ /*
+ * This code enumerates the list of files in txtsetup.sif
+ * that need to be installed in their respective directories.
+ */
+
/* Search for the SectionName section */
if (!SetupFindFirstLineW(InfFile, SectionName, NULL, &FilesContext))
{
- char Buffer[128];
+ CHAR Buffer[128];
sprintf(Buffer, MUIGetString(STRING_TXTSETUPFAILED), SectionName);
PopupError(Buffer, MUIGetString(STRING_REBOOTCOMPUTER), Ir, POPUP_WAIT_ENTER);
return FALSE;
}
/*
- * Enumerate the files in the section
- * and add them to the file queue.
+ * Enumerate the files in the section and add them to the file queue.
*/
do
{
if ((DirKeyValue[0] == UNICODE_NULL) || (DirKeyValue[0] == L'\\' && DirKeyValue[1] == UNICODE_NULL))
{
/* Installation path */
- wcscpy(CompleteOrigDirName, SourceRootDir.Buffer);
+ DPRINT("InstallationPath: '%S'\n", DirKeyValue);
+
+ StringCchCopyW(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName),
+ SourceRootDir.Buffer);
+
+ DPRINT("InstallationPath(2): '%S'\n", CompleteOrigDirName);
}
else if (DirKeyValue[0] == L'\\')
{
/* Absolute path */
- wcscpy(CompleteOrigDirName, DirKeyValue);
+ DPRINT("AbsolutePath: '%S'\n", DirKeyValue);
+
+ StringCchCopyW(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName),
+ DirKeyValue);
+
+ DPRINT("AbsolutePath(2): '%S'\n", CompleteOrigDirName);
}
else // if (DirKeyValue[0] != L'\\')
{
/* Path relative to the installation path */
+ DPRINT("RelativePath: '%S'\n", DirKeyValue);
+
CombinePaths(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName), 2,
SourceRootDir.Buffer, DirKeyValue);
- }
- /* Remove trailing backslash */
- Length = wcslen(CompleteOrigDirName);
- if ((Length > 0) && (CompleteOrigDirName[Length - 1] == L'\\'))
- {
- CompleteOrigDirName[Length - 1] = UNICODE_NULL;
+ DPRINT("RelativePath(2): '%S'\n", CompleteOrigDirName);
}
if (!SetupQueueCopy(SetupFileQueue,
PWCHAR SourceCabinet,
PINPUT_RECORD Ir)
{
- WCHAR PathBuffer[MAX_PATH];
+ NTSTATUS Status;
INFCONTEXT DirContext;
PWCHAR AdditionalSectionName = NULL;
PWCHAR DirKeyValue;
- ULONG Length;
- NTSTATUS Status;
+ WCHAR PathBuffer[MAX_PATH];
/* Add common files */
if (!AddSectionToCopyQueue(InfFile, L"SourceDisksFiles", SourceCabinet, &DestinationPath, Ir))
/*
* FIXME:
- * - Install directories like '\reactos\test' are not handled yet.
- * - Copying files to DestinationRootPath should be done from within
- * the SystemPartitionFiles section.
- * At the moment we check whether we specify paths like '\foo' or '\\' for that.
- * For installing to DestinationPath specify just '\' .
+ * Copying files to DestinationRootPath should be done from within
+ * the SystemPartitionFiles section.
+ * At the moment we check whether we specify paths like '\foo' or '\\' for that.
+ * For installing to DestinationPath specify just '\' .
*/
/* Get destination path */
- wcscpy(PathBuffer, DestinationPath.Buffer);
+ StringCchCopyW(PathBuffer, ARRAYSIZE(PathBuffer), DestinationPath.Buffer);
- /* Remove trailing backslash */
- Length = wcslen(PathBuffer);
- if ((Length > 0) && (PathBuffer[Length - 1] == L'\\'))
- {
- PathBuffer[Length - 1] = UNICODE_NULL;
- }
+ DPRINT("FullPath(1): '%S'\n", PathBuffer);
/* Create the install directory */
Status = SetupCreateDirectory(PathBuffer);
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
{
- DPRINT1("Creating directory '%S' failed: Status = 0x%08lx", PathBuffer, Status);
+ DPRINT1("Creating directory '%S' failed: Status = 0x%08lx\n", PathBuffer, Status);
MUIDisplayError(ERROR_CREATE_INSTALL_DIR, Ir, POPUP_WAIT_ENTER);
return FALSE;
}
/* Installation path */
DPRINT("InstallationPath: '%S'\n", DirKeyValue);
- wcscpy(PathBuffer, DestinationPath.Buffer);
+ StringCchCopyW(PathBuffer, ARRAYSIZE(PathBuffer),
+ DestinationPath.Buffer);
- DPRINT("FullPath: '%S'\n", PathBuffer);
+ DPRINT("InstallationPath(2): '%S'\n", PathBuffer);
}
else if (DirKeyValue[0] == L'\\')
{
/* Absolute path */
- DPRINT("Absolute Path: '%S'\n", DirKeyValue);
+ DPRINT("AbsolutePath: '%S'\n", DirKeyValue);
CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
DestinationRootPath.Buffer, DirKeyValue);
- /* Remove trailing backslash */
- Length = wcslen(PathBuffer);
- if ((Length > 0) && (PathBuffer[Length - 1] == L'\\'))
- {
- PathBuffer[Length - 1] = UNICODE_NULL;
- }
-
- DPRINT("FullPath: '%S'\n", PathBuffer);
+ DPRINT("AbsolutePath(2): '%S'\n", PathBuffer);
Status = SetupCreateDirectory(PathBuffer);
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
DestinationPath.Buffer, DirKeyValue);
- /* Remove trailing backslash */
- Length = wcslen(PathBuffer);
- if ((Length > 0) && (PathBuffer[Length - 1] == L'\\'))
- {
- PathBuffer[Length - 1] = UNICODE_NULL;
- }
-
- DPRINT("FullPath: '%S'\n", PathBuffer);
+ DPRINT("RelativePath(2): '%S'\n", PathBuffer);
Status = SetupCreateDirectory(PathBuffer);
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
if (RepairUpdateFlag)
{
+ // FIXME!
+ DPRINT1("FIXME: Updating / repairing the registry is NOT implemented yet!\n");
return SUCCESS_PAGE;
}
+ /************************ HACK!!!!!!!!!!! *********************************/
if (!SetInstallPathValue(&DestinationPath))
{
DPRINT1("SetInstallPathValue() failed\n");
MUIDisplayError(ERROR_INITIALIZE_REGISTRY, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
+ /************************ HACK!!!!!!!!!!! *********************************/
/* Create the default hives */
Status = NtInitializeRegistry(CM_BOOT_FLAG_SETUP);
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
RtlFreeUnicodeString(&SystemRootPath);
- swprintf(PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- PartitionList->SystemPartition->DiskEntry->DiskNumber,
- PartitionList->SystemPartition->PartitionNumber);
+ StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu\\",
+ PartitionList->SystemPartition->DiskEntry->DiskNumber,
+ PartitionList->SystemPartition->PartitionNumber);
RtlCreateUnicodeString(&SystemRootPath, PathBuffer);
DPRINT1("SystemRootPath: %wZ\n", &SystemRootPath);
static PAGE_NUMBER
BootLoaderHarddiskVbrPage(PINPUT_RECORD Ir)
{
- UCHAR PartitionType;
NTSTATUS Status;
- PartitionType = PartitionList->SystemPartition->PartitionType;
-
Status = InstallVBRToPartition(&SystemRootPath,
&SourceRootPath,
&DestinationArcPath,
- PartitionType);
+ PartitionList->SystemPartition->PartitionType);
if (!NT_SUCCESS(Status))
{
MUIDisplayError(ERROR_WRITE_BOOT, Ir, POPUP_WAIT_ENTER);
*
* SIDEEFFECTS
* Calls InstallVBRToPartition()
- * CallsInstallMbrBootCodeToDisk()
+ * Calls InstallMbrBootCodeToDisk()
*
* RETURNS
* Number of the next page.
static PAGE_NUMBER
BootLoaderHarddiskMbrPage(PINPUT_RECORD Ir)
{
- UCHAR PartitionType;
NTSTATUS Status;
WCHAR DestinationDevicePathBuffer[MAX_PATH];
WCHAR SourceMbrPathBuffer[MAX_PATH];
WCHAR DstPath[MAX_PATH];
/* Step 1: Write the VBR */
- PartitionType = PartitionList->SystemPartition->PartitionType;
-
Status = InstallVBRToPartition(&SystemRootPath,
&SourceRootPath,
&DestinationArcPath,
- PartitionType);
+ PartitionList->SystemPartition->PartitionType);
if (!NT_SUCCESS(Status))
{
MUIDisplayError(ERROR_WRITE_BOOT, Ir, POPUP_WAIT_ENTER);
}
/* Step 2: Write the MBR */
- swprintf(DestinationDevicePathBuffer,
- L"\\Device\\Harddisk%d\\Partition0",
- PartitionList->SystemPartition->DiskEntry->DiskNumber);
+ StringCchPrintfW(DestinationDevicePathBuffer, ARRAYSIZE(DestinationDevicePathBuffer),
+ L"\\Device\\Harddisk%d\\Partition0",
+ PartitionList->SystemPartition->DiskEntry->DiskNumber);
CombinePaths(SourceMbrPathBuffer, ARRAYSIZE(SourceMbrPathBuffer), 2, SourceRootPath.Buffer, L"\\loader\\dosmbr.bin");
if (IsThereAValidBootSector(DestinationDevicePathBuffer))
{
/* Save current MBR */
- CombinePaths(DstPath, ARRAYSIZE(DstPath), 2, SystemRootPath.Buffer, L"\\mbr.old");
+ CombinePaths(DstPath, ARRAYSIZE(DstPath), 2, SystemRootPath.Buffer, L"mbr.old");
DPRINT1("Save MBR: %S ==> %S\n", DestinationDevicePathBuffer, DstPath);
Status = SaveBootSector(DestinationDevicePathBuffer, DstPath, sizeof(PARTITION_SECTOR));
/*
* The start routine and page management
*/
-VOID
+NTSTATUS
RunUSetup(VOID)
{
+ NTSTATUS Status;
INPUT_RECORD Ir;
PAGE_NUMBER Page;
- LARGE_INTEGER Time;
- NTSTATUS Status;
BOOLEAN Old;
- NtQuerySystemTime(&Time);
+ InfSetHeap(ProcessHeap);
+
+#if 0
+ /* Tell the Cm this is a setup boot, and it has to behave accordingly */
+ Status = NtInitializeRegistry(CM_BOOT_FLAG_SETUP);
+ if (!NT_SUCCESS(Status))
+ DPRINT1("NtInitializeRegistry() failed (Status 0x%08lx)\n", Status);
+#endif
/* Create the PnP thread in suspended state */
Status = RtlCreateUserThread(NtCurrentProcess(),
PrintString(MUIGetString(STRING_CONSOLEFAIL2));
PrintString(MUIGetString(STRING_CONSOLEFAIL3));
- /* Raise a hard error (crash the system/BSOD) */
- NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED,
- 0,0,0,0,0);
+ /* We failed to initialize the video, just quit the installer */
+ return STATUS_APP_INIT_FAILURE;
}
/* Initialize global unicode strings */
/* Hide the cursor */
CONSOLE_SetCursorType(TRUE, FALSE);
- Page = START_PAGE;
+ /* Global Initialization page */
+ CONSOLE_ClearScreen();
+ CONSOLE_Flush();
+ Page = SetupStartPage(&Ir);
+
while (Page != REBOOT_PAGE && Page != RECOVERY_PAGE)
{
CONSOLE_ClearScreen();
CONSOLE_Flush();
- //CONSOLE_SetUnderlinedTextXY(4, 3, " ReactOS " KERNEL_VERSION_STR " Setup ");
- //CONSOLE_Flush();
+ // CONSOLE_SetUnderlinedTextXY(4, 3, " ReactOS " KERNEL_VERSION_STR " Setup ");
+ // CONSOLE_Flush();
switch (Page)
{
- /* Start page */
- case START_PAGE:
- Page = SetupStartPage(&Ir);
- break;
-
/* Language page */
case LANGUAGE_PAGE:
Page = LanguagePage(&Ir);
break;
+ /* Welcome page */
+ case WELCOME_PAGE:
+ Page = WelcomePage(&Ir);
+ break;
+
/* License page */
case LICENSE_PAGE:
Page = LicensePage(&Ir);
break;
- /* Intro page */
- case INTRO_PAGE:
- Page = IntroPage(&Ir);
- break;
-
/* Install pages */
case INSTALL_INTRO_PAGE:
Page = InstallIntroPage(&Ir);
FreeConsole();
- /* Avoid bugcheck */
- Time.QuadPart += 50000000;
- NtDelayExecution(FALSE, &Time);
-
/* Reboot */
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &Old);
NtShutdownSystem(ShutdownReboot);
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, Old, FALSE, &Old);
- NtTerminateProcess(NtCurrentProcess(), 0);
+
+ return STATUS_SUCCESS;
}
VOID NTAPI
NtProcessStartup(PPEB Peb)
{
+ NTSTATUS Status;
+ LARGE_INTEGER Time;
+
RtlNormalizeProcessParams(Peb->ProcessParameters);
ProcessHeap = Peb->ProcessHeap;
- InfSetHeap(ProcessHeap);
- RunUSetup();
+
+ NtQuerySystemTime(&Time);
+
+ Status = RunUSetup();
+
+ if (NT_SUCCESS(Status))
+ {
+ /*
+ * Avoid a bugcheck if RunUSetup() finishes too quickly by implementing
+ * a protective waiting.
+ * This wait is needed because, since we are started as SMSS.EXE,
+ * the NT kernel explicitly waits 5 seconds for the initial process
+ * SMSS.EXE to initialize (as a protective measure), and otherwise
+ * bugchecks with the code SESSION5_INITIALIZATION_FAILED.
+ */
+ Time.QuadPart += 50000000;
+ NtDelayExecution(FALSE, &Time);
+ }
+ else
+ {
+ /* The installer failed to start: raise a hard error (crash the system/BSOD) */
+ Status = NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED,
+ 0, 0, NULL, 0, NULL);
+ }
+
+ NtTerminateProcess(NtCurrentProcess(), Status);
}
/* EOF */