* PROJECT: ReactOS text-mode setup
* FILE: base/setup/usetup/usetup.c
* PURPOSE: Text-mode setup
- * PROGRAMMER: Eric Kohl
- * Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
* Hervé Poussineau (hpoussin@reactos.org)
*/
#include "chkdsk.h"
#include "cmdcons.h"
#include "format.h"
-#include "drivesup.h"
-#include "settings.h"
#define NDEBUG
#include <debug.h>
-/* GLOBALS ******************************************************************/
+/* GLOBALS & LOCALS *********************************************************/
HANDLE ProcessHeap;
-UNICODE_STRING SourceRootPath;
-UNICODE_STRING SourceRootDir;
-UNICODE_STRING SourcePath;
+
BOOLEAN IsUnattendedSetup = FALSE;
-LONG UnattendDestinationDiskNumber;
-LONG UnattendDestinationPartitionNumber;
-LONG UnattendMBRInstallType = -1;
-LONG UnattendFormatPartition = 0;
-LONG AutoPartition = 0;
-WCHAR UnattendInstallationDirectory[MAX_PATH];
-PWCHAR SelectedLanguageId;
-WCHAR LocaleID[9];
-WCHAR DefaultLanguage[20];
-WCHAR DefaultKBLayout[20];
-BOOLEAN RepairUpdateFlag = FALSE;
-HANDLE hPnpThread = INVALID_HANDLE_VALUE;
-PPARTLIST PartitionList = NULL;
+static USETUP_DATA USetupData;
-/* LOCALS *******************************************************************/
+/*
+ * NOTE: Technically only used for the COPYCONTEXT InstallPath member
+ * for the filequeue functionality.
+ */
+static UNICODE_STRING InstallPath;
-static PFILE_SYSTEM_LIST FileSystemList = NULL;
+// FIXME: Is it really useful?? Just used for SetDefaultPagefile...
+static WCHAR DestinationDriveLetter;
-static UNICODE_STRING InstallPath;
-/*
- * Path to the system partition, where the boot manager resides.
- * On x86 PCs, this is usually the active partition.
- * On ARC, (u)EFI, ... platforms, this is a dedicated partition.
- *
- * For more information, see:
- * https://en.wikipedia.org/wiki/System_partition_and_boot_partition
- * http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/boot-and-system-volumes.html
- * http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/arc-boot-process.html
- * http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/efi-boot-process.html
- * http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/determining-system-volume.html
- * http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/determining-boot-volume.html
- */
-static UNICODE_STRING SystemRootPath;
+/* OTHER Stuff *****/
-/* Path to the install directory inside the ReactOS boot partition */
-static UNICODE_STRING DestinationPath;
-static UNICODE_STRING DestinationArcPath;
-static UNICODE_STRING DestinationRootPath;
+PWCHAR SelectedLanguageId;
+static WCHAR DefaultLanguage[20]; // Copy of string inside LanguageList
+static WCHAR DefaultKBLayout[20]; // Copy of string inside KeyboardList
-static WCHAR DestinationDriveLetter;
+static BOOLEAN RepairUpdateFlag = FALSE;
+
+static HANDLE hPnpThread = NULL;
+
+static PPARTLIST PartitionList = NULL;
+static PPARTENTRY TempPartition = NULL;
+static PFILE_SYSTEM_LIST FileSystemList = NULL;
+static FORMATMACHINESTATE FormatState = Start;
+
+/*****************************************************/
static HINF SetupInf;
static HSPFILEQ SetupFileQueue = NULL;
+static PNTOS_INSTALLATION CurrentInstallation = NULL;
+static PGENERIC_LIST NtOsInstallsList = NULL;
+
static PGENERIC_LIST ComputerList = NULL;
-static PGENERIC_LIST DisplayList = NULL;
+static PGENERIC_LIST DisplayList = NULL;
static PGENERIC_LIST KeyboardList = NULL;
-static PGENERIC_LIST LayoutList = NULL;
+static PGENERIC_LIST LayoutList = NULL;
static PGENERIC_LIST LanguageList = NULL;
-static LANGID LanguageId = 0;
-
-static ULONG RequiredPartitionDiskSpace = ~0;
/* FUNCTIONS ****************************************************************/
COORD coPos;
DWORD Written;
- /* draw upper left corner */
+ /* Draw upper left corner */
coPos.X = xLeft;
coPos.Y = yTop;
FillConsoleOutputCharacterA(StdOutput,
coPos,
&Written);
- /* draw upper edge */
+ /* Draw upper edge */
coPos.X = xLeft + 1;
coPos.Y = yTop;
FillConsoleOutputCharacterA(StdOutput,
coPos,
&Written);
- /* draw upper right corner */
+ /* Draw upper right corner */
coPos.X = xLeft + Width - 1;
coPos.Y = yTop;
FillConsoleOutputCharacterA(StdOutput,
&Written);
}
- /* draw lower left corner */
+ /* Draw lower left corner */
coPos.X = xLeft;
coPos.Y = yTop + Height - 1;
FillConsoleOutputCharacterA(StdOutput,
coPos,
&Written);
- /* draw lower edge */
+ /* Draw lower edge */
coPos.X = xLeft + 1;
coPos.Y = yTop + Height - 1;
FillConsoleOutputCharacterA(StdOutput,
coPos,
&Written);
- /* draw lower right corner */
+ /* Draw lower right corner */
coPos.X = xLeft + Width - 1;
coPos.Y = yTop + Height - 1;
FillConsoleOutputCharacterA(StdOutput,
if (Length > MaxLength)
MaxLength = Length;
- if (LastLine != FALSE)
+ if (LastLine)
break;
pnext = p + 1;
&Written);
}
- if (LastLine != FALSE)
+ if (LastLine)
break;
coPos.Y++;
}
-VOID
-CheckUnattendedSetup(VOID)
-{
- WCHAR UnattendInfPath[MAX_PATH];
- INFCONTEXT Context;
- HINF UnattendInf;
- UINT ErrorLine;
- INT IntValue;
- PWCHAR Value;
-
- if (DoesFileExist(SourcePath.Buffer, L"unattend.inf") == FALSE)
- {
- DPRINT("Does not exist: %S\\%S\n", SourcePath.Buffer, L"unattend.inf");
- return;
- }
-
- wcscpy(UnattendInfPath, SourcePath.Buffer);
- wcscat(UnattendInfPath, L"\\unattend.inf");
-
- /* Load 'unattend.inf' from install media. */
- UnattendInf = SetupOpenInfFileW(UnattendInfPath,
- NULL,
- INF_STYLE_WIN4,
- LanguageId,
- &ErrorLine);
-
- if (UnattendInf == INVALID_HANDLE_VALUE)
- {
- DPRINT("SetupOpenInfFileW() failed\n");
- return;
- }
-
- /* Open 'Unattend' section */
- if (!SetupFindFirstLineW(UnattendInf, L"Unattend", L"Signature", &Context))
- {
- DPRINT("SetupFindFirstLineW() failed for section 'Unattend'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- /* Get pointer 'Signature' key */
- if (!INF_GetData(&Context, NULL, &Value))
- {
- DPRINT("INF_GetData() failed for key 'Signature'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- /* Check 'Signature' string */
- if (_wcsicmp(Value, L"$ReactOS$") != 0)
- {
- DPRINT("Signature not $ReactOS$\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- /* Check if Unattend setup is enabled */
- if (!SetupFindFirstLineW(UnattendInf, L"Unattend", L"UnattendSetupEnabled", &Context))
- {
- DPRINT("Can't find key 'UnattendSetupEnabled'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- if (!INF_GetData(&Context, NULL, &Value))
- {
- DPRINT("Can't read key 'UnattendSetupEnabled'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- if (_wcsicmp(Value, L"yes") != 0)
- {
- DPRINT("Unattend setup is disabled by 'UnattendSetupEnabled' key!\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- /* Search for 'DestinationDiskNumber' in the 'Unattend' section */
- if (!SetupFindFirstLineW(UnattendInf, L"Unattend", L"DestinationDiskNumber", &Context))
- {
- DPRINT("SetupFindFirstLine() failed for key 'DestinationDiskNumber'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- if (!SetupGetIntField(&Context, 1, &IntValue))
- {
- DPRINT("SetupGetIntField() failed for key 'DestinationDiskNumber'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- UnattendDestinationDiskNumber = (LONG)IntValue;
-
- /* Search for 'DestinationPartitionNumber' in the 'Unattend' section */
- if (!SetupFindFirstLineW(UnattendInf, L"Unattend", L"DestinationPartitionNumber", &Context))
- {
- DPRINT("SetupFindFirstLine() failed for key 'DestinationPartitionNumber'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- if (!SetupGetIntField(&Context, 1, &IntValue))
- {
- DPRINT("SetupGetIntField() failed for key 'DestinationPartitionNumber'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- UnattendDestinationPartitionNumber = IntValue;
-
- /* Search for 'InstallationDirectory' in the 'Unattend' section */
- if (!SetupFindFirstLineW(UnattendInf, L"Unattend", L"InstallationDirectory", &Context))
- {
- DPRINT("SetupFindFirstLine() failed for key 'InstallationDirectory'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- /* Get pointer 'InstallationDirectory' key */
- if (!INF_GetData(&Context, NULL, &Value))
- {
- DPRINT("INF_GetData() failed for key 'InstallationDirectory'\n");
- SetupCloseInfFile(UnattendInf);
- return;
- }
-
- wcscpy(UnattendInstallationDirectory, Value);
-
- IsUnattendedSetup = TRUE;
-
- /* Search for 'MBRInstallType' in the 'Unattend' section */
- if (SetupFindFirstLineW(UnattendInf, L"Unattend", L"MBRInstallType", &Context))
- {
- if (SetupGetIntField(&Context, 1, &IntValue))
- {
- UnattendMBRInstallType = IntValue;
- }
- }
-
- /* Search for 'FormatPartition' in the 'Unattend' section */
- if (SetupFindFirstLineW(UnattendInf, L"Unattend", L"FormatPartition", &Context))
- {
- if (SetupGetIntField(&Context, 1, &IntValue))
- {
- UnattendFormatPartition = IntValue;
- }
- }
-
- if (SetupFindFirstLineW(UnattendInf, L"Unattend", L"AutoPartition", &Context))
- {
- if (SetupGetIntField(&Context, 1, &IntValue))
- {
- AutoPartition = IntValue;
- }
- }
-
- /* search for LocaleID in the 'Unattend' section*/
- if (SetupFindFirstLineW(UnattendInf, L"Unattend", L"LocaleID", &Context))
- {
- if (INF_GetData(&Context, NULL, &Value))
- {
- LONG Id = wcstol(Value, NULL, 16);
- swprintf(LocaleID,L"%08lx", Id);
- }
- }
-
- SetupCloseInfFile(UnattendInf);
-
- DPRINT("Running unattended setup\n");
-}
-
-
-VOID
+static VOID
UpdateKBLayout(VOID)
{
PGENERIC_LIST_ENTRY ListEntry;
- LPCWSTR pszNewLayout;
+ PCWSTR pszNewLayout;
- pszNewLayout = MUIDefaultKeyboardLayout();
+ pszNewLayout = MUIDefaultKeyboardLayout(SelectedLanguageId);
if (LayoutList == NULL)
{
- LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout);
+ LayoutList = CreateKeyboardLayoutList(SetupInf, SelectedLanguageId, DefaultKBLayout);
if (LayoutList == NULL)
{
/* FIXME: Handle error! */
/*
* Displays the LanguagePage.
*
- * Next pages: IntroPage, QuitPage
+ * Next pages: WelcomePage, QuitPage
*
* SIDEEFFECTS
* Init SelectedLanguageId
- * Init LanguageId
+ * Init USetupData.LanguageId
*
* RETURNS
* Number of the next page.
static PAGE_NUMBER
LanguagePage(PINPUT_RECORD Ir)
{
+ GENERIC_LIST_UI ListUi;
PWCHAR NewLanguageId;
BOOL RefreshPage = FALSE;
if (LanguageList == NULL)
{
LanguageList = CreateLanguageList(SetupInf, DefaultLanguage);
-
if (LanguageList == NULL)
{
PopupError("Setup failed to initialize available translations", NULL, NULL, POPUP_WAIT_NONE);
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
}
- /* Load the font */
SelectedLanguageId = DefaultLanguage;
+ USetupData.LanguageId = 0;
+
+ /* Load the font */
SetConsoleCodePage();
UpdateKBLayout();
* the language selection process altogether! */
if (GenericListHasSingleEntry(LanguageList))
{
- LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
- return INTRO_PAGE;
+ USetupData.LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
+ return WELCOME_PAGE;
}
- DrawGenericList(LanguageList,
+ InitGenericListUi(&ListUi, LanguageList);
+ DrawGenericList(&ListUi,
2,
18,
xScreen - 3,
yScreen - 3);
- ScrollToPositionGenericList(LanguageList, GetDefaultLanguageIndex());
+ ScrollToPositionGenericList(&ListUi, GetDefaultLanguageIndex());
MUIDisplayPage(LANGUAGE_PAGE);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- ScrollDownGenericList(LanguageList);
+ ScrollDownGenericList(&ListUi);
RefreshPage = TRUE;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- ScrollUpGenericList(LanguageList);
+ ScrollUpGenericList(&ListUi);
RefreshPage = TRUE;
}
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT)) /* PAGE DOWN */
{
- ScrollPageDownGenericList(LanguageList);
+ ScrollPageDownGenericList(&ListUi);
RefreshPage = TRUE;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)) /* PAGE UP */
{
- ScrollPageUpGenericList(LanguageList);
+ ScrollPageUpGenericList(&ListUi);
RefreshPage = TRUE;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
else
- RedrawGenericList(LanguageList);
+ RedrawGenericList(&ListUi);
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));
- LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
+ USetupData.LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
if (wcscmp(SelectedLanguageId, DefaultLanguage))
{
/* Load the font */
SetConsoleCodePage();
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b))
{
/* a-z */
- GenericListKeyPress(LanguageList, Ir->Event.KeyEvent.uChar.AsciiChar);
+ GenericListKeyPress(&ListUi, Ir->Event.KeyEvent.uChar.AsciiChar);
RefreshPage = TRUE;
}
{
NewLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));
- if (SelectedLanguageId != NewLanguageId)
+ if (wcscmp(SelectedLanguageId, NewLanguageId))
{
/* Clear the language page */
MUIClearPage(LANGUAGE_PAGE);
}
}
- return INTRO_PAGE;
+ return WELCOME_PAGE;
}
*
* SIDEEFFECTS
* Init Sdi
- * Init SourcePath
- * Init SourceRootPath
- * Init SourceRootDir
+ * Init USetupData.SourcePath
+ * Init USetupData.SourceRootPath
+ * Init USetupData.SourceRootDir
* Init SetupInf
- * Init RequiredPartitionDiskSpace
+ * Init USetupData.RequiredPartitionDiskSpace
* Init IsUnattendedSetup
* If unattended, init *List and sets the Codepage
* If unattended, init SelectedLanguageId
- * If unattended, init LanguageId
+ * If unattended, init USetupData.LanguageId
*
* RETURNS
* Number of the next page.
static PAGE_NUMBER
SetupStartPage(PINPUT_RECORD Ir)
{
- //SYSTEM_DEVICE_INFORMATION Sdi;
NTSTATUS Status;
- WCHAR FileNameBuffer[MAX_PATH];
- INFCONTEXT Context;
- PWCHAR Value;
- UINT ErrorLine;
- //ULONG ReturnSize;
+ ULONG Error;
PGENERIC_LIST_ENTRY ListEntry;
- INT IntValue;
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
-#if 0
- /* Check whether a harddisk is available */
- Status = NtQuerySystemInformation(SystemDeviceInformation,
- &Sdi,
- sizeof(SYSTEM_DEVICE_INFORMATION),
- &ReturnSize);
-
- if (!NT_SUCCESS(Status))
- {
- CONSOLE_PrintTextXY(6, 15, "NtQuerySystemInformation() failed (Status 0x%08lx)", Status);
- MUIDisplayError(ERROR_DRIVE_INFORMATION, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
-
- if (Sdi.NumberOfDisks == 0)
- {
- MUIDisplayError(ERROR_NO_HDD, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
-#endif
-
/* Get the source path and source root path */
- Status = GetSourcePaths(&SourcePath,
- &SourceRootPath,
- &SourceRootDir);
-
+ Status = GetSourcePaths(&USetupData.SourcePath,
+ &USetupData.SourceRootPath,
+ &USetupData.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
-
- /* Load txtsetup.sif from install media. */
- wcscpy(FileNameBuffer, SourcePath.Buffer);
- wcscat(FileNameBuffer, L"\\txtsetup.sif");
-
- SetupInf = SetupOpenInfFileW(FileNameBuffer,
- NULL,
- INF_STYLE_WIN4,
- LanguageId,
- &ErrorLine);
+ DPRINT1("SourcePath: '%wZ'\n", &USetupData.SourcePath);
+ DPRINT1("SourceRootPath: '%wZ'\n", &USetupData.SourceRootPath);
+ DPRINT1("SourceRootDir: '%wZ'\n", &USetupData.SourceRootDir);
- if (SetupInf == INVALID_HANDLE_VALUE)
+ /* Load 'txtsetup.sif' from the installation media */
+ Error = LoadSetupInf(&SetupInf, &USetupData);
+ if (Error != ERROR_SUCCESS)
{
- MUIDisplayError(ERROR_LOAD_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
+ MUIDisplayError(Error, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
- /* Open 'Version' section */
- if (!SetupFindFirstLineW(SetupInf, L"Version", L"Signature", &Context))
- {
- MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
-
- /* Get pointer 'Signature' key */
- if (!INF_GetData(&Context, NULL, &Value))
- {
- MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
-
- /* Check 'Signature' string */
- if (_wcsicmp(Value, L"$ReactOS$") != 0)
- {
- MUIDisplayError(ERROR_SIGNATURE_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
-
- /* Open 'DiskSpaceRequirements' section */
- if (!SetupFindFirstLineW(SetupInf, L"DiskSpaceRequirements", L"FreeSysPartDiskSpace", &Context))
- {
- MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
-
- /* Get the 'FreeSysPartDiskSpace' value */
- if (!SetupGetIntField(&Context, 1, &IntValue))
- {
- MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
-
- RequiredPartitionDiskSpace = (ULONG)IntValue;
-
- /* Start PnP thread */
- if (hPnpThread != INVALID_HANDLE_VALUE)
+ /* Start the PnP thread */
+ if (hPnpThread != NULL)
{
NtResumeThread(hPnpThread, NULL);
- hPnpThread = INVALID_HANDLE_VALUE;
+ hPnpThread = NULL;
}
- CheckUnattendedSetup();
+ CheckUnattendedSetup(&USetupData);
if (IsUnattendedSetup)
{
- //TODO
- //read options from inf
+ // TODO: Read options from inf
ComputerList = CreateComputerTypeList(SetupInf);
DisplayList = CreateDisplayDriverList(SetupInf);
KeyboardList = CreateKeyboardDriverList(SetupInf);
- LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout);
+
LanguageList = CreateLanguageList(SetupInf, DefaultLanguage);
/* new part */
- wcscpy(SelectedLanguageId,LocaleID);
- LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
+ SelectedLanguageId = DefaultLanguage;
+ wcscpy(SelectedLanguageId, USetupData.LocaleID);
+ USetupData.LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
+
+ LayoutList = CreateKeyboardLayoutList(SetupInf, SelectedLanguageId, DefaultKBLayout);
/* first we hack LanguageList */
ListEntry = GetFirstListEntry(LanguageList);
-
while (ListEntry != NULL)
{
- if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
+ if (!wcsicmp(USetupData.LocaleID, GetListEntryUserData(ListEntry)))
{
DPRINT("found %S in LanguageList\n",GetListEntryUserData(ListEntry));
SetCurrentListEntry(LanguageList, ListEntry);
/* now LayoutList */
ListEntry = GetFirstListEntry(LayoutList);
-
while (ListEntry != NULL)
{
- if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
+ if (!wcsicmp(USetupData.LocaleID, GetListEntryUserData(ListEntry)))
{
DPRINT("found %S in LayoutList\n",GetListEntryUserData(ListEntry));
SetCurrentListEntry(LayoutList, ListEntry);
/*
- * Displays the IntroPage.
+ * Displays the WelcomePage.
*
* Next pages:
* InstallIntroPage (default)
* RepairIntroPage
+ * RecoveryPage
* LicensePage
* QuitPage
*
* Number of the next page.
*/
static PAGE_NUMBER
-IntroPage(PINPUT_RECORD Ir)
+WelcomePage(PINPUT_RECORD Ir)
{
- MUIDisplayPage(START_PAGE);
+ MUIDisplayPage(WELCOME_PAGE);
while (TRUE)
{
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
}
else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'R') /* R */
{
- return REPAIR_INTRO_PAGE;
+ return RECOVERY_PAGE; // REPAIR_INTRO_PAGE;
}
- else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'L') /* R */
+ else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'L') /* L */
{
return LICENSE_PAGE;
}
}
- 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;
}
}
return REPAIR_INTRO_PAGE;
}
+/*
+ * Displays the UpgradeRepairPage.
+ *
+ * Next pages:
+ * RebootPage (default)
+ * InstallIntroPage
+ * RecoveryPage
+ * WelcomePage
+ *
+ * RETURNS
+ * Number of the next page.
+ */
+static PAGE_NUMBER
+UpgradeRepairPage(PINPUT_RECORD Ir)
+{
+ GENERIC_LIST_UI ListUi;
+
+/*** HACK!! ***/
+ if (PartitionList == NULL)
+ {
+ PartitionList = CreatePartitionList();
+ if (PartitionList == NULL)
+ {
+ /* FIXME: show an error dialog */
+ MUIDisplayError(ERROR_DRIVE_INFORMATION, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
+ else if (IsListEmpty(&PartitionList->DiskListHead))
+ {
+ MUIDisplayError(ERROR_NO_HDD, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
+
+ TempPartition = NULL;
+ FormatState = Start;
+ }
+/**************/
+
+ NtOsInstallsList = CreateNTOSInstallationsList(PartitionList);
+ if (!NtOsInstallsList)
+ DPRINT1("Failed to get a list of NTOS installations; continue installation...\n");
+ if (!NtOsInstallsList || GetNumberOfListEntries(NtOsInstallsList) == 0)
+ {
+ RepairUpdateFlag = FALSE;
+
+ // return INSTALL_INTRO_PAGE;
+ return DEVICE_SETTINGS_PAGE;
+ // return SCSI_CONTROLLER_PAGE;
+ }
+
+ MUIDisplayPage(UPGRADE_REPAIR_PAGE);
+
+ InitGenericListUi(&ListUi, NtOsInstallsList);
+ DrawGenericList(&ListUi,
+ 2, 23,
+ xScreen - 3,
+ yScreen - 3);
+
+ SaveGenericListState(NtOsInstallsList);
+
+ // return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
+ while (TRUE)
+ {
+ CONSOLE_ConInKey(Ir);
+
+ if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00)
+ {
+ switch (Ir->Event.KeyEvent.wVirtualKeyCode)
+ {
+ case VK_DOWN: /* DOWN */
+ ScrollDownGenericList(&ListUi);
+ break;
+ case VK_UP: /* UP */
+ ScrollUpGenericList(&ListUi);
+ break;
+ case VK_NEXT: /* PAGE DOWN */
+ ScrollPageDownGenericList(&ListUi);
+ break;
+ case VK_PRIOR: /* PAGE UP */
+ ScrollPageUpGenericList(&ListUi);
+ break;
+ case VK_F3: /* F3 */
+ {
+ if (ConfirmQuit(Ir))
+ return QUIT_PAGE;
+ else
+ RedrawGenericList(&ListUi);
+ break;
+ }
+ case VK_ESCAPE: /* ESC */
+ {
+ RestoreGenericListState(NtOsInstallsList);
+ // return nextPage; // prevPage;
+
+ // return INSTALL_INTRO_PAGE;
+ return DEVICE_SETTINGS_PAGE;
+ // return SCSI_CONTROLLER_PAGE;
+ }
+ }
+ }
+ else
+ {
+ // switch (toupper(Ir->Event.KeyEvent.uChar.AsciiChar))
+ // if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
+ if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'U') /* U */
+ {
+ /* Retrieve the current installation */
+ CurrentInstallation = (PNTOS_INSTALLATION)GetListEntryUserData(GetCurrentListEntry(NtOsInstallsList));
+ DPRINT1("Selected installation for repair: \"%S\" ; DiskNumber = %d , PartitionNumber = %d\n",
+ CurrentInstallation->InstallationName, CurrentInstallation->DiskNumber, CurrentInstallation->PartitionNumber);
+
+ RepairUpdateFlag = TRUE;
+
+ // return nextPage;
+ /***/return INSTALL_INTRO_PAGE;/***/
+ }
+ else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) &&
+ (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b)) /* a-z */
+ {
+ GenericListKeyPress(&ListUi, Ir->Event.KeyEvent.uChar.AsciiChar);
+ }
+ }
+ }
+
+ return UPGRADE_REPAIR_PAGE;
+}
+
+
/*
* Displays the InstallIntroPage.
*
static PAGE_NUMBER
InstallIntroPage(PINPUT_RECORD Ir)
{
- MUIDisplayPage(INSTALL_INTRO_PAGE);
-
if (RepairUpdateFlag)
{
- //return SELECT_PARTITION_PAGE;
+#if 1 /* Old code that looks good */
+
+ // return SELECT_PARTITION_PAGE;
return DEVICE_SETTINGS_PAGE;
+
+#else /* Possible new code? */
+
+ return DEVICE_SETTINGS_PAGE;
+ // return SCSI_CONTROLLER_PAGE;
+
+#endif
}
if (IsUnattendedSetup)
- {
return SELECT_PARTITION_PAGE;
- }
+
+ MUIDisplayPage(INSTALL_INTRO_PAGE);
while (TRUE)
{
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
- return DEVICE_SETTINGS_PAGE;
- // return SCSI_CONTROLLER_PAGE;
+ return UPGRADE_REPAIR_PAGE;
}
}
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 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
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))
+ 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);
+ CHAR CurrentItemText[256];
/* Initialize the computer settings list */
if (ComputerList == NULL)
/* Initialize the keyboard layout list */
if (LayoutList == NULL)
{
- LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout);
+ LayoutList = CreateKeyboardLayoutList(SetupInf, SelectedLanguageId, DefaultKBLayout);
if (LayoutList == NULL)
{
/* FIXME: report error */
}
}
- 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);
+ sprintf(CurrentItemText, "%S", GetListEntryText(GetCurrentListEntry(ComputerList)));
+ CONSOLE_SetTextXY(25, 11, CurrentItemText);
+ sprintf(CurrentItemText, "%S", GetListEntryText(GetCurrentListEntry(DisplayList)));
+ CONSOLE_SetTextXY(25, 12, CurrentItemText);
+ sprintf(CurrentItemText, "%S", GetListEntryText(GetCurrentListEntry(KeyboardList)));
+ CONSOLE_SetTextXY(25, 13, CurrentItemText);
+ sprintf(CurrentItemText, "%S", GetListEntryText(GetCurrentListEntry(LayoutList)));
+ CONSOLE_SetTextXY(25, 14, CurrentItemText);
- if (RepairUpdateFlag)
- {
- return SELECT_PARTITION_PAGE;
- }
+ CONSOLE_InvertTextXY(24, Line, 48, 1);
while (TRUE)
{
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
* Ir: The PINPUT_RECORD
*/
static PAGE_NUMBER
-HandleGenericList(PGENERIC_LIST GenericList,
+HandleGenericList(PGENERIC_LIST_UI ListUi,
PAGE_NUMBER nextPage,
PINPUT_RECORD Ir)
{
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- ScrollDownGenericList(GenericList);
+ ScrollDownGenericList(ListUi);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- ScrollUpGenericList(GenericList);
+ ScrollUpGenericList(ListUi);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT)) /* PAGE DOWN */
{
- ScrollPageDownGenericList(GenericList);
+ ScrollPageDownGenericList(ListUi);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)) /* PAGE UP */
{
- ScrollPageUpGenericList(GenericList);
+ ScrollPageUpGenericList(ListUi);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
-
- continue;
+ else
+ RedrawGenericList(ListUi);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */
{
- RestoreGenericListState(GenericList);
- return nextPage;
+ RestoreGenericListState(ListUi->List);
+ return nextPage; // Use some "prevPage;" instead?
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b))
{
/* a-z */
- GenericListKeyPress(GenericList, Ir->Event.KeyEvent.uChar.AsciiChar);
+ GenericListKeyPress(ListUi, Ir->Event.KeyEvent.uChar.AsciiChar);
}
}
}
static PAGE_NUMBER
ComputerSettingsPage(PINPUT_RECORD Ir)
{
+ GENERIC_LIST_UI ListUi;
MUIDisplayPage(COMPUTER_SETTINGS_PAGE);
- DrawGenericList(ComputerList,
+ InitGenericListUi(&ListUi, ComputerList);
+ DrawGenericList(&ListUi,
2,
18,
xScreen - 3,
SaveGenericListState(ComputerList);
- return HandleGenericList(ComputerList, DEVICE_SETTINGS_PAGE, Ir);
+ return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
}
-
-
+
+
/*
* Displays the DisplaySettingsPage.
*
static PAGE_NUMBER
DisplaySettingsPage(PINPUT_RECORD Ir)
{
+ GENERIC_LIST_UI ListUi;
MUIDisplayPage(DISPLAY_SETTINGS_PAGE);
- DrawGenericList(DisplayList,
+ InitGenericListUi(&ListUi, DisplayList);
+ DrawGenericList(&ListUi,
2,
18,
xScreen - 3,
SaveGenericListState(DisplayList);
- return HandleGenericList(DisplayList, DEVICE_SETTINGS_PAGE, Ir);
+ return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
}
static PAGE_NUMBER
KeyboardSettingsPage(PINPUT_RECORD Ir)
{
+ GENERIC_LIST_UI ListUi;
MUIDisplayPage(KEYBOARD_SETTINGS_PAGE);
- DrawGenericList(KeyboardList,
+ InitGenericListUi(&ListUi, KeyboardList);
+ DrawGenericList(&ListUi,
2,
18,
xScreen - 3,
SaveGenericListState(KeyboardList);
- return HandleGenericList(KeyboardList, DEVICE_SETTINGS_PAGE, Ir);
+ return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
}
static PAGE_NUMBER
LayoutSettingsPage(PINPUT_RECORD Ir)
{
+ GENERIC_LIST_UI ListUi;
MUIDisplayPage(LAYOUT_SETTINGS_PAGE);
- DrawGenericList(LayoutList,
+ InitGenericListUi(&ListUi, LayoutList);
+ DrawGenericList(&ListUi,
2,
18,
xScreen - 3,
SaveGenericListState(LayoutList);
- return HandleGenericList(LayoutList, DEVICE_SETTINGS_PAGE, Ir);
+ return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
}
ULONGLONG size;
size = PartEntry->SectorCount.QuadPart * PartEntry->DiskEntry->BytesPerSector;
- size = (size + 524288) / 1048576; /* in MBytes */
+ size = (size + (512 * KB)) / MB; /* in MBytes */
- if (size < RequiredPartitionDiskSpace)
+ if (size < USetupData.RequiredPartitionDiskSpace)
{
- /* partition is too small so ask for another partition */
- DPRINT1("Partition is too small (size: %I64u MB), required disk space is %lu MB\n", size, RequiredPartitionDiskSpace);
+ /* Partition is too small so ask for another one */
+ DPRINT1("Partition is too small (size: %I64u MB), required disk space is %lu MB\n", size, USetupData.RequiredPartitionDiskSpace);
return FALSE;
}
else
* QuitPage
*
* SIDEEFFECTS
- * Init DestinationDriveLetter (only if unattended or not free space is selected)
* Set InstallShortcut (only if not unattended + free space is selected)
*
* RETURNS
static PAGE_NUMBER
SelectPartitionPage(PINPUT_RECORD Ir)
{
+ PARTLIST_UI ListUi;
ULONG Error;
- MUIDisplayPage(SELECT_PARTITION_PAGE);
-
if (PartitionList == NULL)
{
- PartitionList = CreatePartitionList(2,
- 23,
- xScreen - 3,
- yScreen - 3);
+ PartitionList = CreatePartitionList();
if (PartitionList == NULL)
{
/* FIXME: show an error dialog */
+ MUIDisplayError(ERROR_DRIVE_INFORMATION, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
else if (IsListEmpty(&PartitionList->DiskListHead))
MUIDisplayError(ERROR_NO_HDD, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
+
+ TempPartition = NULL;
+ FormatState = Start;
}
- DrawPartitionList(PartitionList);
+ if (RepairUpdateFlag)
+ {
+ /* Determine the selected installation disk & partition */
+ if (!SelectPartition(PartitionList,
+ CurrentInstallation->DiskNumber,
+ CurrentInstallation->PartitionNumber))
+ {
+ DPRINT1("RepairUpdateFlag == TRUE, SelectPartition() returned FALSE, assert!\n");
+ ASSERT(FALSE);
+ }
+
+ return SELECT_FILE_SYSTEM_PAGE;
+ }
+
+ MUIDisplayPage(SELECT_PARTITION_PAGE);
+
+ InitPartitionListUi(&ListUi, PartitionList,
+ 2,
+ 23,
+ xScreen - 3,
+ yScreen - 3);
+ DrawPartitionList(&ListUi);
if (IsUnattendedSetup)
{
- if (!SelectPartition(PartitionList, UnattendDestinationDiskNumber, UnattendDestinationPartitionNumber))
+ if (!SelectPartition(PartitionList,
+ USetupData.DestinationDiskNumber,
+ USetupData.DestinationPartitionNumber))
{
- if (AutoPartition)
+ if (USetupData.AutoPartition)
{
if (PartitionList->CurrentPartition->LogicalPartition)
{
TRUE);
}
+// FIXME?? Aren't we going to enter an infinite loop, if this test fails??
if (!IsDiskSizeValid(PartitionList->CurrentPartition))
{
MUIDisplayError(ERROR_INSUFFICIENT_PARTITION_SIZE, Ir, POPUP_WAIT_ANY_KEY,
- RequiredPartitionDiskSpace);
+ USetupData.RequiredPartitionDiskSpace);
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
- DestinationDriveLetter = (WCHAR)PartitionList->CurrentPartition->DriveLetter;
-
return SELECT_FILE_SYSTEM_PAGE;
}
}
else
{
+ DrawPartitionList(&ListUi);
+
+// FIXME?? Aren't we going to enter an infinite loop, if this test fails??
if (!IsDiskSizeValid(PartitionList->CurrentPartition))
{
MUIDisplayError(ERROR_INSUFFICIENT_PARTITION_SIZE, Ir, POPUP_WAIT_ANY_KEY,
- RequiredPartitionDiskSpace);
+ USetupData.RequiredPartitionDiskSpace);
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
- DestinationDriveLetter = (WCHAR)PartitionList->CurrentPartition->DriveLetter;
-
return SELECT_FILE_SYSTEM_PAGE;
}
}
}
else if (PartitionList->CurrentPartition->LogicalPartition)
{
- if (PartitionList->CurrentPartition->IsPartitioned)
- {
- CONSOLE_SetStatusText(MUIGetString(STRING_DELETEPARTITION));
- }
- else
- {
- CONSOLE_SetStatusText(MUIGetString(STRING_INSTALLCREATELOGICAL));
- }
+ if (PartitionList->CurrentPartition->IsPartitioned)
+ {
+ CONSOLE_SetStatusText(MUIGetString(STRING_DELETEPARTITION));
+ }
+ else
+ {
+ CONSOLE_SetStatusText(MUIGetString(STRING_INSTALLCREATELOGICAL));
+ }
}
else
{
- if (PartitionList->CurrentPartition->IsPartitioned)
- {
- if (IsContainerPartition(PartitionList->CurrentPartition->PartitionType))
- {
- CONSOLE_SetStatusText(MUIGetString(STRING_DELETEPARTITION));
- }
- else
- {
- CONSOLE_SetStatusText(MUIGetString(STRING_INSTALLDELETEPARTITION));
- }
- }
- else
- {
- CONSOLE_SetStatusText(MUIGetString(STRING_INSTALLCREATEPARTITION));
- }
+ if (PartitionList->CurrentPartition->IsPartitioned)
+ {
+ if (IsContainerPartition(PartitionList->CurrentPartition->PartitionType))
+ {
+ CONSOLE_SetStatusText(MUIGetString(STRING_DELETEPARTITION));
+ }
+ else
+ {
+ CONSOLE_SetStatusText(MUIGetString(STRING_INSTALLDELETEPARTITION));
+ }
+ }
+ else
+ {
+ CONSOLE_SetStatusText(MUIGetString(STRING_INSTALLCREATEPARTITION));
+ }
}
CONSOLE_ConInKey(Ir);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
{
DestroyPartitionList(PartitionList);
PartitionList = NULL;
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- if (ScrollDownPartitionList(PartitionList))
- DrawPartitionList(PartitionList);
+ ScrollDownPartitionList(&ListUi);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- if (ScrollUpPartitionList(PartitionList))
- DrawPartitionList(PartitionList);
+ ScrollUpPartitionList(&ListUi);
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
if (IsContainerPartition(PartitionList->CurrentPartition->PartitionType))
- continue; //return SELECT_PARTITION_PAGE;
+ continue; // return SELECT_PARTITION_PAGE;
if (PartitionList->CurrentPartition == NULL ||
PartitionList->CurrentPartition->IsPartitioned == FALSE)
if (!IsDiskSizeValid(PartitionList->CurrentPartition))
{
MUIDisplayError(ERROR_INSUFFICIENT_PARTITION_SIZE, Ir, POPUP_WAIT_ANY_KEY,
- RequiredPartitionDiskSpace);
+ USetupData.RequiredPartitionDiskSpace);
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 */
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'L') /* L */
{
- if (PartitionList->CurrentPartition->LogicalPartition != FALSE)
+ if (PartitionList->CurrentPartition->LogicalPartition)
{
Error = LogicalPartitionCreationChecks(PartitionList);
if (Error != NOT_AN_ERROR)
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */
{
+ WCHAR PathBuffer[MAX_PATH];
+ UNICODE_STRING CurrentPartition;
+
if (PartitionList->CurrentPartition->IsPartitioned == FALSE)
{
MUIDisplayError(ERROR_DELETE_SPACE, Ir, POPUP_WAIT_ANY_KEY);
return SELECT_PARTITION_PAGE;
}
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu\\",
+ PartitionList->CurrentDisk->DiskNumber,
+ PartitionList->CurrentPartition->PartitionNumber);
+ RtlInitUnicodeString(&CurrentPartition, PathBuffer);
+
+ /*
+ * Check whether the user attempts to delete the partition on which
+ * the installation source is present. If so, fail with an error.
+ */
+ // &USetupData.SourceRootPath
+ if (RtlPrefixUnicodeString(&CurrentPartition, &USetupData.SourcePath, TRUE))
+ {
+ PopupError("You cannot delete the partition containing the installation source!",
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
+ return SELECT_PARTITION_PAGE;
+ }
+
if (PartitionList->CurrentPartition->BootIndicator ||
PartitionList->CurrentPartition == PartitionList->SystemPartition)
{
SHORT Right,
SHORT Bottom,
ULONG MaxSize,
- PCHAR InputBuffer,
+ PWSTR InputBuffer,
PBOOLEAN Quit,
PBOOLEAN Cancel)
{
COORD coPos;
DWORD Written;
CHAR Buffer[128];
- WCHAR PartitionSizeBuffer[100];
- ULONG Length, Pos;
+ INT Length, Pos;
WCHAR ch;
SHORT iLeft;
SHORT iTop;
coPos,
&Written);
- swprintf(PartitionSizeBuffer, L"%lu", MaxSize);
- Length = wcslen(PartitionSizeBuffer);
+ swprintf(InputBuffer, L"%lu", MaxSize);
+ Length = wcslen(InputBuffer);
Pos = Length;
CONSOLE_SetInputTextXY(iLeft,
iTop,
PARTITION_SIZE_INPUT_FIELD_LENGTH,
- PartitionSizeBuffer);
+ InputBuffer);
CONSOLE_SetCursorXY(iLeft + Length, iTop);
CONSOLE_SetCursorType(TRUE, TRUE);
if (Quit != NULL)
*Quit = TRUE;
- PartitionSizeBuffer[0] = UNICODE_NULL;
+ InputBuffer[0] = UNICODE_NULL;
CONSOLE_SetCursorType(TRUE, FALSE);
break;
}
if (Cancel != NULL)
*Cancel = TRUE;
- PartitionSizeBuffer[0] = UNICODE_NULL;
+ InputBuffer[0] = UNICODE_NULL;
CONSOLE_SetCursorType(TRUE, FALSE);
break;
}
{
if (Pos < Length)
{
- memmove(&PartitionSizeBuffer[Pos],
- &PartitionSizeBuffer[Pos + 1],
+ memmove(&InputBuffer[Pos],
+ &InputBuffer[Pos + 1],
(Length - Pos - 1) * sizeof(WCHAR));
- PartitionSizeBuffer[Length - 1] = UNICODE_NULL;
+ InputBuffer[Length - 1] = UNICODE_NULL;
Length--;
CONSOLE_SetInputTextXY(iLeft,
iTop,
PARTITION_SIZE_INPUT_FIELD_LENGTH,
- PartitionSizeBuffer);
+ InputBuffer);
CONSOLE_SetCursorXY(iLeft + Pos, iTop);
}
}
if (Pos > 0)
{
if (Pos < Length)
- memmove(&PartitionSizeBuffer[Pos - 1],
- &PartitionSizeBuffer[Pos],
+ memmove(&InputBuffer[Pos - 1],
+ &InputBuffer[Pos],
(Length - Pos) * sizeof(WCHAR));
- PartitionSizeBuffer[Length - 1] = UNICODE_NULL;
+ InputBuffer[Length - 1] = UNICODE_NULL;
Pos--;
Length--;
CONSOLE_SetInputTextXY(iLeft,
iTop,
PARTITION_SIZE_INPUT_FIELD_LENGTH,
- PartitionSizeBuffer);
+ InputBuffer);
CONSOLE_SetCursorXY(iLeft + Pos, iTop);
}
}
if ((ch >= L'0') && (ch <= L'9'))
{
if (Pos < Length)
- memmove(&PartitionSizeBuffer[Pos + 1],
- &PartitionSizeBuffer[Pos],
+ memmove(&InputBuffer[Pos + 1],
+ &InputBuffer[Pos],
(Length - Pos) * sizeof(WCHAR));
- PartitionSizeBuffer[Length + 1] = UNICODE_NULL;
- PartitionSizeBuffer[Pos] = ch;
+ InputBuffer[Length + 1] = UNICODE_NULL;
+ InputBuffer[Pos] = ch;
Pos++;
Length++;
CONSOLE_SetInputTextXY(iLeft,
iTop,
PARTITION_SIZE_INPUT_FIELD_LENGTH,
- PartitionSizeBuffer);
+ InputBuffer);
CONSOLE_SetCursorXY(iLeft + Pos, iTop);
}
}
}
}
-
- /* Convert UNICODE --> ANSI the poor man's way */
- sprintf(InputBuffer, "%S", PartitionSizeBuffer);
}
PPARTENTRY PartEntry;
BOOLEAN Quit;
BOOLEAN Cancel;
- CHAR InputBuffer[50];
+ WCHAR InputBuffer[50];
ULONG MaxSize;
ULONGLONG PartSize;
ULONGLONG DiskSize;
DiskSize = DiskEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
#if 0
- if (DiskSize >= 10737418240) /* 10 GB */
+ if (DiskSize >= 10 * GB) /* 10 GB */
{
- DiskSize = DiskSize / 1073741824;
+ DiskSize = DiskSize / GB;
Unit = MUIGetString(STRING_GB);
}
else
#endif
{
- DiskSize = DiskSize / 1048576;
+ DiskSize = DiskSize / MB;
if (DiskSize == 0)
DiskSize = 1;
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 0
CONSOLE_PrintTextXY(8, 10, "Maximum size of the new partition is %I64u MB",
- PartitionList->CurrentPartition->SectorCount * DiskEntry->BytesPerSector / 1048576);
+ PartitionList->CurrentPartition->SectorCount * DiskEntry->BytesPerSector / MB);
#endif
CONSOLE_SetStatusText(MUIGetString(STRING_CREATEPARTITION));
PartEntry = PartitionList->CurrentPartition;
while (TRUE)
{
- MaxSize = (PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector) / 1048576; /* in MBytes (rounded) */
+ MaxSize = (PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector) / MB; /* in MBytes (rounded) */
if (MaxSize > PARTITION_MAXSIZE)
MaxSize = PARTITION_MAXSIZE;
ShowPartitionSizeInputBox(12, 14, xScreen - 12, 17, /* left, top, right, bottom */
MaxSize, InputBuffer, &Quit, &Cancel);
- if (Quit != FALSE)
+ if (Quit)
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
}
- else if (Cancel != FALSE)
+ else if (Cancel)
{
return SELECT_PARTITION_PAGE;
}
else
{
- PartSize = atoi(InputBuffer);
+ PartSize = _wcstoui64(InputBuffer, NULL, 10);
if (PartSize < 1)
{
else
{
/* Calculate the sector count from the size in MB */
- SectorCount = PartSize * 1048576 / DiskEntry->BytesPerSector;
+ SectorCount = PartSize * MB / DiskEntry->BytesPerSector;
/* But never get larger than the unpartitioned disk space */
if (SectorCount > PartEntry->SectorCount.QuadPart)
PPARTENTRY PartEntry;
BOOLEAN Quit;
BOOLEAN Cancel;
- CHAR InputBuffer[50];
+ WCHAR InputBuffer[50];
ULONG MaxSize;
ULONGLONG PartSize;
ULONGLONG DiskSize;
DiskSize = DiskEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
#if 0
- if (DiskSize >= 10737418240) /* 10 GB */
+ if (DiskSize >= 10 * GB) /* 10 GB */
{
- DiskSize = DiskSize / 1073741824;
+ DiskSize = DiskSize / GB;
Unit = MUIGetString(STRING_GB);
}
else
#endif
{
- DiskSize = DiskSize / 1048576;
+ DiskSize = DiskSize / MB;
if (DiskSize == 0)
DiskSize = 1;
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 0
CONSOLE_PrintTextXY(8, 10, "Maximum size of the new partition is %I64u MB",
- PartitionList->CurrentPartition->SectorCount * DiskEntry->BytesPerSector / 1048576);
+ PartitionList->CurrentPartition->SectorCount * DiskEntry->BytesPerSector / MB);
#endif
CONSOLE_SetStatusText(MUIGetString(STRING_CREATEPARTITION));
PartEntry = PartitionList->CurrentPartition;
while (TRUE)
{
- MaxSize = (PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector) / 1048576; /* in MBytes (rounded) */
+ MaxSize = (PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector) / MB; /* in MBytes (rounded) */
if (MaxSize > PARTITION_MAXSIZE)
MaxSize = PARTITION_MAXSIZE;
ShowPartitionSizeInputBox(12, 14, xScreen - 12, 17, /* left, top, right, bottom */
MaxSize, InputBuffer, &Quit, &Cancel);
- if (Quit != FALSE)
+ if (Quit)
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
}
- else if (Cancel != FALSE)
+ else if (Cancel)
{
return SELECT_PARTITION_PAGE;
}
else
{
- PartSize = atoi(InputBuffer);
+ PartSize = _wcstoui64(InputBuffer, NULL, 10);
if (PartSize < 1)
{
else
{
/* Calculate the sector count from the size in MB */
- SectorCount = PartSize * 1048576 / DiskEntry->BytesPerSector;
+ SectorCount = PartSize * MB / DiskEntry->BytesPerSector;
/* But never get larger than the unpartitioned disk space */
if (SectorCount > PartEntry->SectorCount.QuadPart)
PPARTENTRY PartEntry;
BOOLEAN Quit;
BOOLEAN Cancel;
- CHAR InputBuffer[50];
+ WCHAR InputBuffer[50];
ULONG MaxSize;
ULONGLONG PartSize;
ULONGLONG DiskSize;
DiskSize = DiskEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
#if 0
- if (DiskSize >= 10737418240) /* 10 GB */
+ if (DiskSize >= 10 * GB) /* 10 GB */
{
- DiskSize = DiskSize / 1073741824;
+ DiskSize = DiskSize / GB;
Unit = MUIGetString(STRING_GB);
}
else
#endif
{
- DiskSize = DiskSize / 1048576;
+ DiskSize = DiskSize / MB;
if (DiskSize == 0)
DiskSize = 1;
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 0
CONSOLE_PrintTextXY(8, 10, "Maximum size of the new partition is %I64u MB",
- PartitionList->CurrentPartition->SectorCount * DiskEntry->BytesPerSector / 1048576);
+ PartitionList->CurrentPartition->SectorCount * DiskEntry->BytesPerSector / MB);
#endif
CONSOLE_SetStatusText(MUIGetString(STRING_CREATEPARTITION));
PartEntry = PartitionList->CurrentPartition;
while (TRUE)
{
- MaxSize = (PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector) / 1048576; /* in MBytes (rounded) */
+ MaxSize = (PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector) / MB; /* in MBytes (rounded) */
if (MaxSize > PARTITION_MAXSIZE)
MaxSize = PARTITION_MAXSIZE;
ShowPartitionSizeInputBox(12, 14, xScreen - 12, 17, /* left, top, right, bottom */
MaxSize, InputBuffer, &Quit, &Cancel);
- if (Quit != FALSE)
+ if (Quit)
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
}
- else if (Cancel != FALSE)
+ else if (Cancel)
{
return SELECT_PARTITION_PAGE;
}
else
{
- PartSize = atoi(InputBuffer);
+ PartSize = _wcstoui64(InputBuffer, NULL, 10);
if (PartSize < 1)
{
else
{
/* Calculate the sector count from the size in MB */
- SectorCount = PartSize * 1048576 / DiskEntry->BytesPerSector;
+ SectorCount = PartSize * MB / DiskEntry->BytesPerSector;
/* But never get larger than the unpartitioned disk space */
if (SectorCount > PartEntry->SectorCount.QuadPart)
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) == TRUE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
PartSize = PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
#if 0
- if (PartSize >= 10737418240) /* 10 GB */
+ if (PartSize >= 10 * GB) /* 10 GB */
{
- PartSize = PartSize / 1073741824;
+ PartSize = PartSize / GB;
Unit = MUIGetString(STRING_GB);
}
else
#endif
- if (PartSize >= 10485760) /* 10 MB */
+ if (PartSize >= 10 * MB) /* 10 MB */
{
- PartSize = PartSize / 1048576;
+ PartSize = PartSize / MB;
Unit = MUIGetString(STRING_MB);
}
else
{
- PartSize = PartSize / 1024;
+ PartSize = PartSize / KB;
Unit = MUIGetString(STRING_KB);
}
DiskSize = DiskEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
#if 0
- if (DiskSize >= 10737418240) /* 10 GB */
+ if (DiskSize >= 10 * GB) /* 10 GB */
{
- DiskSize = DiskSize / 1073741824;
+ DiskSize = DiskSize / GB;
Unit = MUIGetString(STRING_GB);
}
else
#endif
{
- DiskSize = DiskSize / 1048576;
+ DiskSize = DiskSize / MB;
if (DiskSize == 0)
DiskSize = 1;
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 ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
*
* Next pages:
* CheckFileSystemPage (At once if RepairUpdate is selected)
- * CheckFileSystemPage (At once if Unattended and not UnattendFormatPartition)
- * FormatPartitionPage (At once if Unattended and UnattendFormatPartition)
+ * CheckFileSystemPage (At once if Unattended and not USetupData.FormatPartition)
+ * FormatPartitionPage (At once if Unattended and USetupData.FormatPartition)
* SelectPartitionPage (If the user aborts)
* FormatPartitionPage (Default)
* QuitPage
return QUIT_PAGE;
}
- /*** HACK! ***/
- if (FileSystemList == NULL)
- {
- FileSystemList = CreateFileSystemList(6, 26, PartitionList->CurrentPartition->New, L"FAT");
- if (FileSystemList == NULL)
- {
- /* FIXME: show an error dialog */
- return QUIT_PAGE;
- }
-
- /* FIXME: Add file systems to list */
- }
-
/* Find or set the active system partition */
- CheckActiveSystemPartition(PartitionList, FileSystemList);
-
- if (PartitionList->SystemDisk == NULL ||
- PartitionList->SystemPartition == NULL)
+ CheckActiveSystemPartition(PartitionList);
+ 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;
}
- PreviousFormatState = PartitionList->FormatState;
- switch (PartitionList->FormatState)
+ PreviousFormatState = FormatState;
+ switch (FormatState)
{
case Start:
+ {
if (PartitionList->CurrentPartition != PartitionList->SystemPartition)
{
- PartitionList->TempDisk = PartitionList->SystemDisk;
- PartitionList->TempPartition = PartitionList->SystemPartition;
- PartitionList->TempPartition->NeedsCheck = TRUE;
+ TempPartition = PartitionList->SystemPartition;
+ TempPartition->NeedsCheck = TRUE;
- PartitionList->FormatState = FormatSystemPartition;
+ FormatState = FormatSystemPartition;
DPRINT1("FormatState: Start --> FormatSystemPartition\n");
}
else
{
- PartitionList->TempDisk = PartitionList->CurrentDisk;
- PartitionList->TempPartition = PartitionList->CurrentPartition;
- PartitionList->TempPartition->NeedsCheck = TRUE;
+ TempPartition = PartitionList->CurrentPartition;
+ TempPartition->NeedsCheck = TRUE;
- PartitionList->FormatState = FormatInstallPartition;
+ FormatState = FormatInstallPartition;
DPRINT1("FormatState: Start --> FormatInstallPartition\n");
}
break;
+ }
case FormatSystemPartition:
- PartitionList->TempDisk = PartitionList->CurrentDisk;
- PartitionList->TempPartition = PartitionList->CurrentPartition;
- PartitionList->TempPartition->NeedsCheck = TRUE;
+ {
+ TempPartition = PartitionList->CurrentPartition;
+ TempPartition->NeedsCheck = TRUE;
- PartitionList->FormatState = FormatInstallPartition;
+ FormatState = FormatInstallPartition;
DPRINT1("FormatState: FormatSystemPartition --> FormatInstallPartition\n");
break;
+ }
case FormatInstallPartition:
+ {
if (GetNextUnformattedPartition(PartitionList,
- &PartitionList->TempDisk,
- &PartitionList->TempPartition))
+ NULL,
+ &TempPartition))
{
- PartitionList->FormatState = FormatOtherPartition;
- PartitionList->TempPartition->NeedsCheck = TRUE;
+ FormatState = FormatOtherPartition;
+ TempPartition->NeedsCheck = TRUE;
DPRINT1("FormatState: FormatInstallPartition --> FormatOtherPartition\n");
}
else
{
- PartitionList->FormatState = FormatDone;
+ FormatState = FormatDone;
DPRINT1("FormatState: FormatInstallPartition --> FormatDone\n");
return CHECK_FILE_SYSTEM_PAGE;
}
break;
+ }
case FormatOtherPartition:
+ {
if (GetNextUnformattedPartition(PartitionList,
- &PartitionList->TempDisk,
- &PartitionList->TempPartition))
+ NULL,
+ &TempPartition))
{
- PartitionList->FormatState = FormatOtherPartition;
- PartitionList->TempPartition->NeedsCheck = TRUE;
+ FormatState = FormatOtherPartition;
+ TempPartition->NeedsCheck = TRUE;
DPRINT1("FormatState: FormatOtherPartition --> FormatOtherPartition\n");
}
else
{
- PartitionList->FormatState = FormatDone;
+ FormatState = FormatDone;
DPRINT1("FormatState: FormatOtherPartition --> FormatDone\n");
return CHECK_FILE_SYSTEM_PAGE;
}
break;
+ }
default:
- DPRINT1("FormatState: Invalid value %ld\n", PartitionList->FormatState);
+ {
+ DPRINT1("FormatState: Invalid value %ld\n", FormatState);
/* FIXME: show an error dialog */
return QUIT_PAGE;
+ }
}
- DiskEntry = PartitionList->TempDisk;
- PartEntry = PartitionList->TempPartition;
+ PartEntry = TempPartition;
+ DiskEntry = PartEntry->DiskEntry;
- /* adjust disk size */
+ /* Adjust disk size */
DiskSize = DiskEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
- if (DiskSize >= 10737418240) /* 10 GB */
+ if (DiskSize >= 10 * GB) /* 10 GB */
{
- DiskSize = DiskSize / 1073741824;
+ DiskSize = DiskSize / GB;
DiskUnit = MUIGetString(STRING_GB);
}
else
{
- DiskSize = DiskSize / 1048576;
+ DiskSize = DiskSize / MB;
DiskUnit = MUIGetString(STRING_MB);
}
- /* adjust partition size */
+ /* Adjust partition size */
PartSize = PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector;
- if (PartSize >= 10737418240) /* 10 GB */
+ if (PartSize >= 10 * GB) /* 10 GB */
{
- PartSize = PartSize / 1073741824;
+ PartSize = PartSize / GB;
PartUnit = MUIGetString(STRING_GB);
}
else
{
- PartSize = PartSize / 1048576;
+ PartSize = PartSize / MB;
PartUnit = MUIGetString(STRING_MB);
}
- /* adjust partition type */
+ /* Adjust partition type */
GetPartTypeStringFromPartitionType(PartEntry->PartitionType,
PartTypeString,
ARRAYSIZE(PartTypeString));
- if (PartEntry->AutoCreate != FALSE)
+ MUIDisplayPage(SELECT_FILE_SYSTEM_PAGE);
+
+ if (PartEntry->AutoCreate)
{
CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_NEWPARTITION));
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));
-
PartEntry->AutoCreate = FALSE;
}
- else if (PartEntry->New != FALSE)
+ else if (PartEntry->New)
{
- switch (PartitionList->FormatState)
+ switch (FormatState)
{
case FormatSystemPartition:
CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_NONFORMATTEDSYSTEMPART));
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);
-
if (FileSystemList == NULL)
{
+ /* Create the file system list, and by default select the "FAT" file system */
FileSystemList = CreateFileSystemList(6, 26, PartEntry->New, L"FAT");
if (FileSystemList == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
-
- /* FIXME: Add file systems to list */
}
- DrawFileSystemList(FileSystemList);
-
if (RepairUpdateFlag)
{
return CHECK_FILE_SYSTEM_PAGE;
if (IsUnattendedSetup)
{
- if (UnattendFormatPartition)
+ if (USetupData.FormatPartition)
{
- PartEntry->FileSystem = GetFileSystemByName(FileSystemList, L"FAT");
+ /*
+ * We use whatever currently selected file system we have
+ * (by default, this is "FAT", as per the initialization
+ * performed above). Note that it may be interesting to specify
+ * which file system to use in unattended installations, in the
+ * txtsetup.sif file.
+ */
return FORMAT_PARTITION_PAGE;
}
return CHECK_FILE_SYSTEM_PAGE;
}
+ DrawFileSystemList(FileSystemList);
+
while (TRUE)
{
CONSOLE_ConInKey(Ir);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */
{
- PartitionList->FormatState = Start;
+ FormatState = Start;
return SELECT_PARTITION_PAGE;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
- if (!FileSystemList->Selected->FormatFunc)
- {
- return SELECT_FILE_SYSTEM_PAGE;
- }
+ if (!FileSystemList->Selected->FileSystem)
+ return SELECT_FILE_SYSTEM_PAGE;
else
- {
- PartEntry->FileSystem = FileSystemList->Selected;
return FORMAT_PARTITION_PAGE;
- }
}
}
- PartitionList->FormatState = PreviousFormatState;
+ FormatState = PreviousFormatState;
return SELECT_FILE_SYSTEM_PAGE;
}
*
* SIDEEFFECTS
* Sets PartitionList->CurrentPartition->FormatState
- * Sets DestinationRootPath
+ * Sets USetupData.DestinationRootPath
*
* RETURNS
* Number of the next page.
*/
-static ULONG
+static PAGE_NUMBER
FormatPartitionPage(PINPUT_RECORD Ir)
{
UNICODE_STRING PartitionRootPath;
WCHAR PathBuffer[MAX_PATH];
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
+ PFILE_SYSTEM_ITEM SelectedFileSystem;
NTSTATUS Status;
#ifndef NDEBUG
MUIDisplayPage(FORMAT_PARTITION_PAGE);
- if (PartitionList == NULL ||
- PartitionList->TempDisk == NULL ||
- PartitionList->TempPartition == NULL)
+ if (PartitionList == NULL || TempPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
- DiskEntry = PartitionList->TempDisk;
- PartEntry = PartitionList->TempPartition;
+ PartEntry = TempPartition;
+ DiskEntry = PartEntry->DiskEntry;
+
+ SelectedFileSystem = FileSystemList->Selected;
while (TRUE)
{
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
{
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
- if (wcscmp(PartEntry->FileSystem->FileSystemName, L"FAT") == 0)
- {
- if (PartEntry->SectorCount.QuadPart < 8192)
- {
- /* FAT12 CHS partition (disk is smaller than 4.1MB) */
- PartEntry->PartitionType = PARTITION_FAT_12;
- }
- else if (PartEntry->StartSector.QuadPart < 1450560)
- {
- /* Partition starts below the 8.4GB boundary ==> CHS partition */
-
- if (PartEntry->SectorCount.QuadPart < 65536)
- {
- /* FAT16 CHS partition (partition size < 32MB) */
- PartEntry->PartitionType = PARTITION_FAT_16;
- }
- else if (PartEntry->SectorCount.QuadPart < 1048576)
- {
- /* FAT16 CHS partition (partition size < 512MB) */
- PartEntry->PartitionType = PARTITION_HUGE;
- }
- else
- {
- /* FAT32 CHS partition (partition size >= 512MB) */
- PartEntry->PartitionType = PARTITION_FAT32;
- }
- }
- else
- {
- /* Partition starts above the 8.4GB boundary ==> LBA partition */
-
- if (PartEntry->SectorCount.QuadPart < 1048576)
- {
- /* FAT16 LBA partition (partition size < 512MB) */
- PartEntry->PartitionType = PARTITION_XINT13;
- }
- else
- {
- /* FAT32 LBA partition (partition size >= 512MB) */
- PartEntry->PartitionType = PARTITION_FAT32_XINT13;
- }
- }
-
- DiskEntry->Dirty = TRUE;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].PartitionType = PartEntry->PartitionType;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].RewritePartition = TRUE;
- }
-#if 0
- else if (wcscmp(PartEntry->FileSystem->FileSystemName, L"EXT2") == 0)
- {
- PartEntry->PartitionType = PARTITION_EXT2;
-
- DiskEntry->Dirty = TRUE;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].PartitionType = PartEntry->PartitionType;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].RewritePartition = TRUE;
- }
- else if (wcscmp(PartEntry->FileSystem->FileSystemName, L"NTFS") == 0)
- {
- PartEntry->PartitionType = PARTITION_IFS;
-
- DiskEntry->Dirty = TRUE;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].PartitionType = PartEntry->PartitionType;
- DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].RewritePartition = TRUE;
- }
-#endif
- else if (!PartEntry->FileSystem->FormatFunc)
+ if (!PreparePartitionForFormatting(PartEntry, SelectedFileSystem->FileSystem))
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
#endif
- if (WritePartitionsToDisk(PartitionList) == FALSE)
+ /* Commit the partition changes to the disk */
+ if (!WritePartitionsToDisk(PartitionList))
{
DPRINT("WritePartitionsToDisk() failed\n");
MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER);
}
/* Set PartitionRootPath */
- swprintf(PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- DiskEntry->DiskNumber,
- PartEntry->PartitionNumber);
- RtlInitUnicodeString(&PartitionRootPath,
- PathBuffer);
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ DiskEntry->DiskNumber,
+ PartEntry->PartitionNumber);
+ RtlInitUnicodeString(&PartitionRootPath, PathBuffer);
DPRINT("PartitionRootPath: %wZ\n", &PartitionRootPath);
- if (PartEntry->FileSystem->FormatFunc)
+ /* Format the partition */
+ if (SelectedFileSystem->FileSystem)
{
Status = FormatPartition(&PartitionRootPath,
- PartEntry->FileSystem);
+ SelectedFileSystem);
if (!NT_SUCCESS(Status))
{
DPRINT1("FormatPartition() failed with status 0x%08lx\n", Status);
return QUIT_PAGE;
}
+ PartEntry->FormatState = Formatted;
+ // PartEntry->FileSystem = FileSystem;
PartEntry->New = FALSE;
}
* RETURNS
* Number of the next page.
*/
-static ULONG
+static PAGE_NUMBER
CheckFileSystemPage(PINPUT_RECORD Ir)
{
- PFILE_SYSTEM_ITEM CurrentFileSystem;
+ PFILE_SYSTEM CurrentFileSystem;
UNICODE_STRING PartitionRootPath;
WCHAR PathBuffer[MAX_PATH];
CHAR Buffer[MAX_PATH];
}
/* Set PartitionRootPath */
- swprintf(PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- DiskEntry->DiskNumber,
- PartEntry->PartitionNumber);
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ DiskEntry->DiskNumber,
+ PartEntry->PartitionNumber);
RtlInitUnicodeString(&PartitionRootPath, PathBuffer);
DPRINT("PartitionRootPath: %wZ\n", &PartitionRootPath);
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
- CurrentFileSystem = GetFileSystem(FileSystemList, PartEntry);
+ CurrentFileSystem = PartEntry->FileSystem;
DPRINT1("CheckFileSystemPage -- PartitionType: 0x%02X ; FileSystemName: %S\n",
PartEntry->PartitionType, (CurrentFileSystem ? CurrentFileSystem->FileSystemName : L"n/a"));
}
-static
-VOID
-BuildInstallPaths(PWCHAR InstallDir,
+static VOID
+BuildInstallPaths(PWSTR InstallDir,
PDISKENTRY DiskEntry,
PPARTENTRY PartEntry)
{
WCHAR PathBuffer[MAX_PATH];
+/** Equivalent of 'NTOS_INSTALLATION::PathComponent' **/
/* Create 'InstallPath' string */
RtlFreeUnicodeString(&InstallPath);
RtlCreateUnicodeString(&InstallPath, InstallDir);
- /* Create 'DestinationRootPath' string */
- RtlFreeUnicodeString(&DestinationRootPath);
- swprintf(PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- DiskEntry->DiskNumber,
- PartEntry->PartitionNumber);
- RtlCreateUnicodeString(&DestinationRootPath, PathBuffer);
- DPRINT("DestinationRootPath: %wZ\n", &DestinationRootPath);
-
- /* Create 'DestinationPath' string */
- RtlFreeUnicodeString(&DestinationPath);
- wcscpy(PathBuffer, DestinationRootPath.Buffer);
-
- if (InstallDir[0] != L'\\')
- wcscat(PathBuffer, L"\\");
-
- wcscat(PathBuffer, InstallDir);
- RtlCreateUnicodeString(&DestinationPath, PathBuffer);
-
- /* Create 'DestinationArcPath' */
- RtlFreeUnicodeString(&DestinationArcPath);
- swprintf(PathBuffer,
- L"multi(0)disk(0)rdisk(%lu)partition(%lu)",
- DiskEntry->BiosDiskNumber,
- PartEntry->PartitionNumber);
-
- if (InstallDir[0] != L'\\')
- wcscat(PathBuffer, L"\\");
-
- wcscat(PathBuffer, InstallDir);
- RtlCreateUnicodeString(&DestinationArcPath, PathBuffer);
+ /* Create 'USetupData.DestinationRootPath' string */
+ RtlFreeUnicodeString(&USetupData.DestinationRootPath);
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu\\",
+ DiskEntry->DiskNumber,
+ PartEntry->PartitionNumber);
+ RtlCreateUnicodeString(&USetupData.DestinationRootPath, PathBuffer);
+ DPRINT("DestinationRootPath: %wZ\n", &USetupData.DestinationRootPath);
+
+/** Equivalent of 'NTOS_INSTALLATION::SystemNtPath' **/
+ /* Create 'USetupData.DestinationPath' string */
+ RtlFreeUnicodeString(&USetupData.DestinationPath);
+ CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
+ USetupData.DestinationRootPath.Buffer, InstallDir);
+ RtlCreateUnicodeString(&USetupData.DestinationPath, PathBuffer);
+
+/** Equivalent of 'NTOS_INSTALLATION::SystemArcPath' **/
+ /* Create 'USetupData.DestinationArcPath' */
+ RtlFreeUnicodeString(&USetupData.DestinationArcPath);
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"multi(0)disk(0)rdisk(%lu)partition(%lu)\\",
+ DiskEntry->BiosDiskNumber,
+ PartEntry->PartitionNumber);
+ ConcatPaths(PathBuffer, ARRAYSIZE(PathBuffer), 1, InstallDir);
+ RtlCreateUnicodeString(&USetupData.DestinationArcPath, PathBuffer);
+
+ /* Initialize DestinationDriveLetter */
+ DestinationDriveLetter = (WCHAR)PartEntry->DriveLetter;
}
* Displays the InstallDirectoryPage.
*
* Next pages:
- * PrepareCopyPage (As the direct result of InstallDirectoryPage1)
+ * PrepareCopyPage
* QuitPage
*
* RETURNS
{
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
- WCHAR InstallDir[51];
+ WCHAR InstallDir[MAX_PATH];
WCHAR c;
ULONG Length, Pos;
- /* We do not need the filesystem list any more */
+ /* We do not need the filesystem list anymore */
if (FileSystemList != NULL)
{
DestroyFileSystemList(FileSystemList);
DiskEntry = PartitionList->CurrentDisk;
PartEntry = PartitionList->CurrentPartition;
- if (IsUnattendedSetup)
- {
- if (!IsValidPath(UnattendInstallationDirectory))
- {
- /* FIXME: Log the error? */
- return QUIT_PAGE;
- }
+ // if (IsUnattendedSetup)
+ if (RepairUpdateFlag)
+ wcscpy(InstallDir, CurrentInstallation->PathComponent); // SystemNtPath
+ else if (USetupData.InstallationDirectory[0])
+ wcscpy(InstallDir, USetupData.InstallationDirectory);
+ else
+ wcscpy(InstallDir, L"\\ReactOS");
- BuildInstallPaths(UnattendInstallationDirectory,
+ /*
+ * Check the validity of the predefined 'InstallDir'. If we are either
+ * in unattended setup or in update/repair mode, and the installation path
+ * is valid, just perform the installation. Otherwise (either in the case
+ * of an invalid path, or we are in regular setup), display the UI and allow
+ * the user to specify a new installation path.
+ */
+ if ((RepairUpdateFlag || IsUnattendedSetup) && IsValidPath(InstallDir))
+ {
+ BuildInstallPaths(InstallDir,
DiskEntry,
PartEntry);
+ /*
+ * Check whether the user attempts to install ReactOS within the
+ * installation source directory, or in a subdirectory thereof.
+ * If so, fail with an error.
+ */
+ if (RtlPrefixUnicodeString(&USetupData.SourcePath, &USetupData.DestinationPath, TRUE))
+ {
+ PopupError("You cannot install ReactOS within the installation source directory!",
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
+ return INSTALL_DIRECTORY_PAGE;
+ }
+
return PREPARE_COPY_PAGE;
}
- wcscpy(InstallDir, L"\\ReactOS");
-
Length = wcslen(InstallDir);
Pos = Length;
+
+ MUIDisplayPage(INSTALL_DIRECTORY_PAGE);
CONSOLE_SetInputTextXY(8, 11, 51, InstallDir);
CONSOLE_SetCursorXY(8 + Pos, 11);
CONSOLE_SetCursorType(TRUE, TRUE);
- MUIDisplayPage(INSTALL_DIRECTORY_PAGE);
while (TRUE)
{
{
CONSOLE_SetCursorType(TRUE, FALSE);
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
CONSOLE_SetCursorType(TRUE, TRUE);
DiskEntry,
PartEntry);
+ /*
+ * Check whether the user attempts to install ReactOS within the
+ * installation source directory, or in a subdirectory thereof.
+ * If so, fail with an error.
+ */
+ if (RtlPrefixUnicodeString(&USetupData.SourcePath, &USetupData.DestinationPath, TRUE))
+ {
+ PopupError("You cannot install ReactOS within the installation source directory!",
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
+ return INSTALL_DIRECTORY_PAGE;
+ }
+
return PREPARE_COPY_PAGE;
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x08) /* BACKSPACE */
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
{
{
/* FIXME: Handle error! */
DPRINT1("SetupFindFirstLine() failed\n");
+ INF_FreeData(FileKeyName);
+ INF_FreeData(FileKeyValue);
+ INF_FreeData(TargetFileName);
break;
}
+ INF_FreeData(FileKeyValue);
+
if (!INF_GetData(&DirContext, NULL, &DirKeyValue))
{
/* FIXME: Handle error! */
DPRINT1("INF_GetData() failed\n");
+ INF_FreeData(FileKeyName);
+ INF_FreeData(TargetFileName);
break;
}
if (!SetupQueueCopy(SetupFileQueue,
SourceCabinet,
- SourceRootPath.Buffer,
- SourceRootDir.Buffer,
+ USetupData.SourceRootPath.Buffer,
+ USetupData.SourceRootDir.Buffer,
FileKeyName,
DirKeyValue,
TargetFileName))
/* FIXME: Handle error! */
DPRINT1("SetupQueueCopy() failed\n");
}
+
+ INF_FreeData(FileKeyName);
+ INF_FreeData(TargetFileName);
+ INF_FreeData(DirKeyValue);
} while (SetupFindNextLine(&FilesContext, &FilesContext));
return TRUE;
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
{
- /* Get source file name and target directory id */
- if (!INF_GetData(&FilesContext, &FileKeyName, &FileKeyValue))
+ /* Get source file name */
+ if (!INF_GetDataField(&FilesContext, 0, &FileKeyName))
{
/* FIXME: Handle error! */
DPRINT1("INF_GetData() failed\n");
{
/* FIXME: Handle error! */
DPRINT1("INF_GetData() failed\n");
+ INF_FreeData(FileKeyName);
break;
}
{
/* FIXME: Handle error! */
DPRINT1("SetupFindFirstLine() failed\n");
+ INF_FreeData(FileKeyName);
+ INF_FreeData(FileKeyValue);
+ INF_FreeData(TargetFileName);
break;
}
+ INF_FreeData(FileKeyValue);
+
if (!INF_GetData(&DirContext, NULL, &DirKeyValue))
{
/* FIXME: Handle error! */
DPRINT1("INF_GetData() failed\n");
+ INF_FreeData(FileKeyName);
+ INF_FreeData(TargetFileName);
break;
}
- if ((DirKeyValue[0] == 0) || (DirKeyValue[0] == L'\\' && DirKeyValue[1] == 0))
+ if ((DirKeyValue[0] == UNICODE_NULL) || (DirKeyValue[0] == L'\\' && DirKeyValue[1] == UNICODE_NULL))
{
/* Installation path */
- wcscpy(CompleteOrigDirName, SourceRootDir.Buffer);
+ DPRINT("InstallationPath: '%S'\n", DirKeyValue);
+
+ RtlStringCchCopyW(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName),
+ USetupData.SourceRootDir.Buffer);
+
+ DPRINT("InstallationPath(2): '%S'\n", CompleteOrigDirName);
}
else if (DirKeyValue[0] == L'\\')
{
/* Absolute path */
- wcscpy(CompleteOrigDirName, DirKeyValue);
+ DPRINT("AbsolutePath: '%S'\n", DirKeyValue);
+
+ RtlStringCchCopyW(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName),
+ DirKeyValue);
+
+ DPRINT("AbsolutePath(2): '%S'\n", CompleteOrigDirName);
}
else // if (DirKeyValue[0] != L'\\')
{
/* Path relative to the installation path */
- wcscpy(CompleteOrigDirName, SourceRootDir.Buffer);
- wcscat(CompleteOrigDirName, L"\\");
- wcscat(CompleteOrigDirName, DirKeyValue);
- }
+ DPRINT("RelativePath: '%S'\n", DirKeyValue);
- /* Remove trailing backslash */
- Length = wcslen(CompleteOrigDirName);
- if ((Length > 0) && (CompleteOrigDirName[Length - 1] == L'\\'))
- {
- CompleteOrigDirName[Length - 1] = 0;
+ CombinePaths(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName), 2,
+ USetupData.SourceRootDir.Buffer, DirKeyValue);
+
+ DPRINT("RelativePath(2): '%S'\n", CompleteOrigDirName);
}
if (!SetupQueueCopy(SetupFileQueue,
SourceCabinet,
- SourceRootPath.Buffer,
+ USetupData.SourceRootPath.Buffer,
CompleteOrigDirName,
FileKeyName,
DirKeyValue,
/* FIXME: Handle error! */
DPRINT1("SetupQueueCopy() failed\n");
}
+
+ INF_FreeData(FileKeyName);
+ INF_FreeData(TargetFileName);
+ INF_FreeData(DirKeyValue);
} while (SetupFindNextLine(&FilesContext, &FilesContext));
return TRUE;
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))
+ if (!AddSectionToCopyQueue(InfFile, L"SourceDisksFiles", SourceCabinet, &USetupData.DestinationPath, Ir))
return FALSE;
/* Add specific files depending of computer type */
if (AdditionalSectionName)
{
- if (!AddSectionToCopyQueue(InfFile, AdditionalSectionName, SourceCabinet, &DestinationPath, Ir))
+ if (!AddSectionToCopyQueue(InfFile, AdditionalSectionName, SourceCabinet, &USetupData.DestinationPath, Ir))
return FALSE;
}
}
/*
* 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 USetupData.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 USetupData.DestinationPath specify just '\' .
*/
/* Get destination path */
- wcscpy(PathBuffer, DestinationPath.Buffer);
+ RtlStringCchCopyW(PathBuffer, ARRAYSIZE(PathBuffer), USetupData.DestinationPath.Buffer);
- /* Remove trailing backslash */
- Length = wcslen(PathBuffer);
- if ((Length > 0) && (PathBuffer[Length - 1] == L'\\'))
- {
- PathBuffer[Length - 1] = 0;
- }
+ 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;
}
break;
}
- if ((DirKeyValue[0] == 0) || (DirKeyValue[0] == L'\\' && DirKeyValue[1] == 0))
+ if ((DirKeyValue[0] == UNICODE_NULL) || (DirKeyValue[0] == L'\\' && DirKeyValue[1] == UNICODE_NULL))
{
/* Installation path */
DPRINT("InstallationPath: '%S'\n", DirKeyValue);
- wcscpy(PathBuffer, DestinationPath.Buffer);
+ RtlStringCchCopyW(PathBuffer, ARRAYSIZE(PathBuffer),
+ USetupData.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);
- wcscpy(PathBuffer, DestinationRootPath.Buffer);
- wcscat(PathBuffer, DirKeyValue);
+ CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
+ USetupData.DestinationRootPath.Buffer, DirKeyValue);
- /* Remove trailing backslash */
- Length = wcslen(PathBuffer);
- if ((Length > 0) && (PathBuffer[Length - 1] == L'\\'))
- {
- PathBuffer[Length - 1] = 0;
- }
-
- DPRINT("FullPath: '%S'\n", PathBuffer);
+ DPRINT("AbsolutePath(2): '%S'\n", PathBuffer);
Status = SetupCreateDirectory(PathBuffer);
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
{
+ INF_FreeData(DirKeyValue);
DPRINT("Creating directory '%S' failed: Status = 0x%08lx", PathBuffer, Status);
MUIDisplayError(ERROR_CREATE_DIR, Ir, POPUP_WAIT_ENTER);
return FALSE;
/* Path relative to the installation path */
DPRINT("RelativePath: '%S'\n", DirKeyValue);
- wcscpy(PathBuffer, DestinationPath.Buffer);
- wcscat(PathBuffer, L"\\");
- wcscat(PathBuffer, DirKeyValue);
-
- /* Remove trailing backslash */
- Length = wcslen(PathBuffer);
- if ((Length > 0) && (PathBuffer[Length - 1] == L'\\'))
- {
- PathBuffer[Length - 1] = 0;
- }
+ CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
+ USetupData.DestinationPath.Buffer, DirKeyValue);
- DPRINT("FullPath: '%S'\n", PathBuffer);
+ DPRINT("RelativePath(2): '%S'\n", PathBuffer);
Status = SetupCreateDirectory(PathBuffer);
if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
{
+ INF_FreeData(DirKeyValue);
DPRINT("Creating directory '%S' failed: Status = 0x%08lx", PathBuffer, Status);
MUIDisplayError(ERROR_CREATE_DIR, Ir, POPUP_WAIT_ENTER);
return FALSE;
}
}
+
+ INF_FreeData(DirKeyValue);
} while (SetupFindNextLine(&DirContext, &DirContext));
return TRUE;
if (!INF_GetData(&CabinetsContext, NULL, &KeyValue))
break;
- wcscpy(PathBuffer, SourcePath.Buffer);
- wcscat(PathBuffer, L"\\");
- wcscat(PathBuffer, KeyValue);
+ CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
+ USetupData.SourcePath.Buffer, KeyValue);
CabinetInitialize();
CabinetSetEventHandlers(NULL, NULL, NULL);
return QUIT_PAGE;
}
- InfHandle = INF_OpenBufferedFileA((CHAR*) InfFileData,
+ InfHandle = INF_OpenBufferedFileA((PSTR)InfFileData,
InfFileSize,
- (const CHAR*) NULL,
+ NULL,
INF_STYLE_WIN4,
- LanguageId,
+ USetupData.LanguageId,
&ErrorLine);
if (InfHandle == INVALID_HANDLE_VALUE)
* RETURNS
* Number of the next page.
*/
-static
-PAGE_NUMBER
+static PAGE_NUMBER
FileCopyPage(PINPUT_RECORD Ir)
{
COPYCONTEXT CopyContext;
MUIDisplayPage(FILE_COPY_PAGE);
/* Create context for the copy process */
- CopyContext.DestinationRootPath = DestinationRootPath.Buffer;
+ CopyContext.DestinationRootPath = USetupData.DestinationRootPath.Buffer;
CopyContext.InstallPath = InstallPath.Buffer;
CopyContext.TotalOperations = 0;
CopyContext.CompletedOperations = 0;
DestroyProgressBar(CopyContext.MemoryBars[1]);
DestroyProgressBar(CopyContext.MemoryBars[2]);
+ /* Create the $winnt$.inf file */
+ InstallSetupInfFile(&USetupData);
+
/* Go display the next page */
return REGISTRY_PAGE;
}
* QuitPage
*
* SIDEEFFECTS
- * Calls SetInstallPathValue
- * Calls NtInitializeRegistry
+ * Calls RegInitializeRegistry
* Calls ImportRegistryFile
* Calls SetDefaultPagefile
* Calls SetMountedDeviceValues
static PAGE_NUMBER
RegistryPage(PINPUT_RECORD Ir)
{
+ NTSTATUS Status;
INFCONTEXT InfContext;
PWSTR Action;
PWSTR File;
PWSTR Section;
+ BOOLEAN Success;
+ BOOLEAN ShouldRepairRegistry = FALSE;
BOOLEAN Delete;
- NTSTATUS Status;
MUIDisplayPage(REGISTRY_PAGE);
if (RepairUpdateFlag)
{
- return SUCCESS_PAGE;
- }
+ DPRINT1("TODO: Updating / repairing the registry is not completely implemented yet!\n");
- if (!SetInstallPathValue(&DestinationPath))
- {
- DPRINT1("SetInstallPathValue() failed\n");
- MUIDisplayError(ERROR_INITIALIZE_REGISTRY, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
+ /* Verify the registry hives and check whether we need to update or repair any of them */
+ Status = VerifyRegistryHives(&USetupData.DestinationPath, &ShouldRepairRegistry);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("VerifyRegistryHives failed, Status 0x%08lx\n", Status);
+ ShouldRepairRegistry = FALSE;
+ }
+ if (!ShouldRepairRegistry)
+ DPRINT1("No need to repair the registry\n");
}
- /* Create the default hives */
- Status = NtInitializeRegistry(CM_BOOT_FLAG_SETUP);
+DoUpdate:
+ /* Update the registry */
+ CONSOLE_SetStatusText(MUIGetString(STRING_REGHIVEUPDATE));
+
+ /* Initialize the registry and setup the registry hives */
+ Status = RegInitializeRegistry(&USetupData.DestinationPath);
if (!NT_SUCCESS(Status))
{
- DPRINT1("NtInitializeRegistry() failed (Status %lx)\n", Status);
- MUIDisplayError(ERROR_CREATE_HIVE, Ir, POPUP_WAIT_ENTER);
+ DPRINT1("RegInitializeRegistry() failed\n");
+ /********** HACK!!!!!!!!!!! **********/
+ if (Status == STATUS_NOT_IMPLEMENTED)
+ {
+ /* The hack was called, display its corresponding error */
+ MUIDisplayError(ERROR_INITIALIZE_REGISTRY, Ir, POPUP_WAIT_ENTER);
+ }
+ else
+ /*************************************/
+ {
+ /* Something else failed */
+ MUIDisplayError(ERROR_CREATE_HIVE, Ir, POPUP_WAIT_ENTER);
+ }
return QUIT_PAGE;
}
- /* Update registry */
- CONSOLE_SetStatusText(MUIGetString(STRING_REGHIVEUPDATE));
+ if (!RepairUpdateFlag || ShouldRepairRegistry)
+ {
+ /*
+ * We fully setup the hives, in case we are doing a fresh installation
+ * (RepairUpdateFlag == FALSE), or in case we are doing an update
+ * (RepairUpdateFlag == TRUE) BUT we have some registry hives to
+ * "repair" (aka. recreate: ShouldRepairRegistry == TRUE).
+ */
- if (!SetupFindFirstLineW(SetupInf, L"HiveInfs.Install", NULL, &InfContext))
+ Success = SetupFindFirstLineW(SetupInf, L"HiveInfs.Fresh", NULL, &InfContext); // Windows-compatible
+ if (!Success)
+ Success = SetupFindFirstLineW(SetupInf, L"HiveInfs.Install", NULL, &InfContext); // ReactOS-specific
+
+ if (!Success)
+ {
+ DPRINT1("SetupFindFirstLine() failed\n");
+ MUIDisplayError(ERROR_FIND_REGISTRY, Ir, POPUP_WAIT_ENTER);
+ goto Cleanup;
+ }
+ }
+ else // if (RepairUpdateFlag && !ShouldRepairRegistry)
{
- DPRINT1("SetupFindFirstLine() failed\n");
- MUIDisplayError(ERROR_FIND_REGISTRY, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
+ /*
+ * In case we are doing an update (RepairUpdateFlag == TRUE) and
+ * NO registry hives need a repair (ShouldRepairRegistry == FALSE),
+ * we only update the hives.
+ */
+
+ Success = SetupFindFirstLineW(SetupInf, L"HiveInfs.Upgrade", NULL, &InfContext);
+ if (!Success)
+ {
+ /* Nothing to do for update! */
+ DPRINT1("No update needed for the registry!\n");
+ goto Cleanup;
+ }
}
do
DPRINT("Action: %S File: %S Section %S\n", Action, File, Section);
if (Action == NULL)
+ {
+ INF_FreeData(Action);
+ INF_FreeData(File);
+ INF_FreeData(Section);
break; // Hackfix
+ }
if (!_wcsicmp(Action, L"AddReg"))
- {
Delete = FALSE;
- }
else if (!_wcsicmp(Action, L"DelReg"))
- {
Delete = TRUE;
- }
else
{
+ DPRINT1("Unrecognized registry INF action '%S'\n", Action);
+ INF_FreeData(Action);
+ INF_FreeData(File);
+ INF_FreeData(Section);
continue;
}
+ INF_FreeData(Action);
+
CONSOLE_SetStatusText(MUIGetString(STRING_IMPORTFILE), File);
- if (!ImportRegistryFile(File, Section, LanguageId, Delete))
+ if (!ImportRegistryFile(USetupData.SourcePath.Buffer, File, Section, USetupData.LanguageId, Delete))
{
DPRINT1("Importing %S failed\n", File);
-
+ INF_FreeData(File);
+ INF_FreeData(Section);
MUIDisplayError(ERROR_IMPORT_HIVE, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
+ goto Cleanup;
}
} while (SetupFindNextLine(&InfContext, &InfContext));
- /* Update display registry settings */
- CONSOLE_SetStatusText(MUIGetString(STRING_DISPLAYETTINGSUPDATE));
- if (!ProcessDisplayRegistry(SetupInf, DisplayList))
+ if (!RepairUpdateFlag || ShouldRepairRegistry)
{
- MUIDisplayError(ERROR_UPDATE_DISPLAY_SETTINGS, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
+ /* See the explanation for this test above */
- /* Set the locale */
- CONSOLE_SetStatusText(MUIGetString(STRING_LOCALESETTINGSUPDATE));
- if (!ProcessLocaleRegistry(LanguageList))
- {
- MUIDisplayError(ERROR_UPDATE_LOCALESETTINGS, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
+ /* Update display registry settings */
+ CONSOLE_SetStatusText(MUIGetString(STRING_DISPLAYSETTINGSUPDATE));
+ if (!ProcessDisplayRegistry(SetupInf, DisplayList))
+ {
+ MUIDisplayError(ERROR_UPDATE_DISPLAY_SETTINGS, Ir, POPUP_WAIT_ENTER);
+ goto Cleanup;
+ }
- /* Add keyboard layouts */
- CONSOLE_SetStatusText(MUIGetString(STRING_ADDKBLAYOUTS));
- if (!AddKeyboardLayouts())
- {
- MUIDisplayError(ERROR_ADDING_KBLAYOUTS, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
+ /* Set the locale */
+ CONSOLE_SetStatusText(MUIGetString(STRING_LOCALESETTINGSUPDATE));
+ if (!ProcessLocaleRegistry(LanguageList))
+ {
+ MUIDisplayError(ERROR_UPDATE_LOCALESETTINGS, Ir, POPUP_WAIT_ENTER);
+ goto Cleanup;
+ }
+
+ /* Add keyboard layouts */
+ CONSOLE_SetStatusText(MUIGetString(STRING_ADDKBLAYOUTS));
+ if (!AddKeyboardLayouts(SelectedLanguageId))
+ {
+ MUIDisplayError(ERROR_ADDING_KBLAYOUTS, Ir, POPUP_WAIT_ENTER);
+ goto Cleanup;
+ }
+
+ /* Set GeoID */
+ if (!SetGeoID(MUIGetGeoID(SelectedLanguageId)))
+ {
+ MUIDisplayError(ERROR_UPDATE_GEOID, Ir, POPUP_WAIT_ENTER);
+ goto Cleanup;
+ }
+
+ if (!IsUnattendedSetup)
+ {
+ /* Update keyboard layout settings */
+ CONSOLE_SetStatusText(MUIGetString(STRING_KEYBOARDSETTINGSUPDATE));
+ if (!ProcessKeyboardLayoutRegistry(LayoutList, SelectedLanguageId))
+ {
+ MUIDisplayError(ERROR_UPDATE_KBSETTINGS, Ir, POPUP_WAIT_ENTER);
+ goto Cleanup;
+ }
+ }
+
+ /* Add codepage information to registry */
+ CONSOLE_SetStatusText(MUIGetString(STRING_CODEPAGEINFOUPDATE));
+ if (!AddCodePage(SelectedLanguageId))
+ {
+ MUIDisplayError(ERROR_ADDING_CODEPAGE, Ir, POPUP_WAIT_ENTER);
+ goto Cleanup;
+ }
+
+ /* Set the default pagefile entry */
+ SetDefaultPagefile(DestinationDriveLetter);
+
+ /* Update the mounted devices list */
+ // FIXME: This should technically be done by mountmgr (if AutoMount is enabled)!
+ SetMountedDeviceValues(PartitionList);
}
- /* Set GeoID */
+Cleanup:
+ //
+ // TODO: Unload all the registry stuff, perform cleanup,
+ // and copy the created hive files into .sav files.
+ //
+ RegCleanupRegistry(&USetupData.DestinationPath);
- if (!SetGeoID(MUIGetGeoID()))
+ /*
+ * Check whether we were in update/repair mode but we were actually
+ * repairing the registry hives. If so, we have finished repairing them,
+ * and we now reset the flag and run the proper registry update.
+ * Otherwise we have finished the registry update!
+ */
+ if (RepairUpdateFlag && ShouldRepairRegistry)
{
- MUIDisplayError(ERROR_UPDATE_GEOID, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
+ ShouldRepairRegistry = FALSE;
+ goto DoUpdate;
}
- if (!IsUnattendedSetup)
+ if (NT_SUCCESS(Status))
{
- /* Update keyboard layout settings */
- CONSOLE_SetStatusText(MUIGetString(STRING_KEYBOARDSETTINGSUPDATE));
- if (!ProcessKeyboardLayoutRegistry(LayoutList))
- {
- MUIDisplayError(ERROR_UPDATE_KBSETTINGS, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
+ CONSOLE_SetStatusText(MUIGetString(STRING_DONE));
+ return BOOT_LOADER_PAGE;
}
-
- /* Add codepage information to registry */
- CONSOLE_SetStatusText(MUIGetString(STRING_CODEPAGEINFOUPDATE));
- if (!AddCodePage())
+ else
{
- MUIDisplayError(ERROR_ADDING_CODEPAGE, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
-
- /* Set the default pagefile entry */
- SetDefaultPagefile(DestinationDriveLetter);
-
- /* Update the mounted devices list */
- SetMountedDeviceValues(PartitionList);
-
- CONSOLE_SetStatusText(MUIGetString(STRING_DONE));
-
- return BOOT_LOADER_PAGE;
}
* QuitPage
*
* SIDEEFFECTS
- * Calls SetInstallPathValue
- * Calls NtInitializeRegistry
+ * Calls RegInitializeRegistry
* Calls ImportRegistryFile
* Calls SetDefaultPagefile
* Calls SetMountedDeviceValues
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
- RtlFreeUnicodeString(&SystemRootPath);
- swprintf(PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- PartitionList->SystemDisk->DiskNumber,
- PartitionList->SystemPartition->PartitionNumber);
- RtlCreateUnicodeString(&SystemRootPath, PathBuffer);
- DPRINT1("SystemRootPath: %wZ\n", &SystemRootPath);
+ RtlFreeUnicodeString(&USetupData.SystemRootPath);
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu\\",
+ PartitionList->SystemPartition->DiskEntry->DiskNumber,
+ PartitionList->SystemPartition->PartitionNumber);
+ RtlCreateUnicodeString(&USetupData.SystemRootPath, PathBuffer);
+ DPRINT1("SystemRootPath: %wZ\n", &USetupData.SystemRootPath);
PartitionType = PartitionList->SystemPartition->PartitionType;
+ /* For unattended setup, skip MBR installation or install on floppy if needed */
if (IsUnattendedSetup)
{
- if (UnattendMBRInstallType == 0) /* skip MBR installation */
- {
- return SUCCESS_PAGE;
- }
- else if (UnattendMBRInstallType == 1) /* install on floppy */
+ if ((USetupData.MBRInstallType == 0) ||
+ (USetupData.MBRInstallType == 1))
{
- return BOOT_LOADER_FLOPPY_PAGE;
+ goto Quit;
}
}
+ /*
+ * We may install an MBR or VBR, but before that, check whether
+ * we need to actually install the VBR on floppy.
+ */
if (PartitionType == PARTITION_ENTRY_UNUSED)
{
DPRINT("Error: system partition invalid (unused)\n");
}
else if ((PartitionType == PARTITION_FAT_12) ||
(PartitionType == PARTITION_FAT_16) ||
- (PartitionType == PARTITION_HUGE) ||
+ (PartitionType == PARTITION_HUGE) ||
(PartitionType == PARTITION_XINT13) ||
- (PartitionType == PARTITION_FAT32) ||
+ (PartitionType == PARTITION_FAT32) ||
(PartitionType == PARTITION_FAT32_XINT13))
{
DPRINT("Found FAT partition\n");
InstallOnFloppy = TRUE;
}
- if (InstallOnFloppy != FALSE)
+ /* We should install on floppy */
+ if (InstallOnFloppy)
{
- return BOOT_LOADER_FLOPPY_PAGE;
+ USetupData.MBRInstallType = 1;
+ goto Quit;
}
- /* Unattended install on hdd? */
- if (IsUnattendedSetup && UnattendMBRInstallType == 2)
+ /* Is it an unattended install on hdd? */
+ if (IsUnattendedSetup)
{
- return BOOT_LOADER_HARDDISK_MBR_PAGE;
+ if ((USetupData.MBRInstallType == 2) ||
+ (USetupData.MBRInstallType == 3))
+ {
+ goto Quit;
+ }
}
MUIDisplayPage(BOOT_LOADER_PAGE);
CONSOLE_NormalTextXY(8, Line, 60, 1);
Line++;
- if (Line<12)
- Line=15;
+ if (Line < 12)
+ Line = 15;
- if (Line>15)
- Line=12;
+ if (Line > 15)
+ Line = 12;
CONSOLE_InvertTextXY(8, Line, 60, 1);
}
CONSOLE_NormalTextXY(8, Line, 60, 1);
Line--;
- if (Line<12)
- Line=15;
+ if (Line < 12)
+ Line = 15;
- if (Line>15)
- Line=12;
+ if (Line > 15)
+ Line = 12;
CONSOLE_InvertTextXY(8, Line, 60, 1);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
{
if (Line == 12)
{
- return BOOT_LOADER_HARDDISK_MBR_PAGE;
+ /* Install on both MBR and VBR */
+ USetupData.MBRInstallType = 2;
+ break;
}
else if (Line == 13)
{
- return BOOT_LOADER_HARDDISK_VBR_PAGE;
+ /* Install on VBR only */
+ USetupData.MBRInstallType = 3;
+ break;
}
else if (Line == 14)
{
- return BOOT_LOADER_FLOPPY_PAGE;
+ /* Install on floppy */
+ USetupData.MBRInstallType = 1;
+ break;
}
else if (Line == 15)
{
- return SUCCESS_PAGE;
+ /* Skip MBR installation */
+ USetupData.MBRInstallType = 0;
+ break;
}
return BOOT_LOADER_PAGE;
}
}
+Quit:
+ switch (USetupData.MBRInstallType)
+ {
+ /* Skip MBR installation */
+ case 0:
+ return SUCCESS_PAGE;
+
+ /* Install on floppy */
+ case 1:
+ return BOOT_LOADER_FLOPPY_PAGE;
+
+ /* Install on both MBR and VBR */
+ case 2:
+ return BOOT_LOADER_HARDDISK_MBR_PAGE;
+
+ /* Install on VBR only */
+ case 3:
+ return BOOT_LOADER_HARDDISK_VBR_PAGE;
+ }
+
return BOOT_LOADER_PAGE;
}
MUIDisplayPage(BOOT_LOADER_FLOPPY_PAGE);
-// SetStatusText(" Please wait...");
+// CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
while (TRUE)
{
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
return QUIT_PAGE;
break;
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
- if (DoesFileExist(L"\\Device\\Floppy0", L"\\") == FALSE)
- {
- MUIDisplayError(ERROR_NO_FLOPPY, Ir, POPUP_WAIT_ENTER);
- return BOOT_LOADER_FLOPPY_PAGE;
- }
-
- Status = InstallFatBootcodeToFloppy(&SourceRootPath, &DestinationArcPath);
+ Status = InstallFatBootcodeToFloppy(&USetupData.SourceRootPath,
+ &USetupData.DestinationArcPath);
if (!NT_SUCCESS(Status))
{
- /* Print error message */
+ if (Status == STATUS_DEVICE_NOT_READY)
+ MUIDisplayError(ERROR_NO_FLOPPY, Ir, POPUP_WAIT_ENTER);
+
+ /* TODO: Print error message */
return BOOT_LOADER_FLOPPY_PAGE;
}
static PAGE_NUMBER
BootLoaderHarddiskVbrPage(PINPUT_RECORD Ir)
{
- UCHAR PartitionType;
NTSTATUS Status;
- PartitionType = PartitionList->SystemPartition->PartitionType;
-
- Status = InstallVBRToPartition(&SystemRootPath,
- &SourceRootPath,
- &DestinationArcPath,
- PartitionType);
+ Status = InstallVBRToPartition(&USetupData.SystemRootPath,
+ &USetupData.SourceRootPath,
+ &USetupData.DestinationArcPath,
+ 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);
+ Status = InstallVBRToPartition(&USetupData.SystemRootPath,
+ &USetupData.SourceRootPath,
+ &USetupData.DestinationArcPath,
+ 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->SystemDisk->DiskNumber);
+ RtlStringCchPrintfW(DestinationDevicePathBuffer, ARRAYSIZE(DestinationDevicePathBuffer),
+ L"\\Device\\Harddisk%d\\Partition0",
+ PartitionList->SystemPartition->DiskEntry->DiskNumber);
+ Status = InstallMbrBootCodeToDisk(&USetupData.SystemRootPath,
+ &USetupData.SourceRootPath,
+ DestinationDevicePathBuffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InstallMbrBootCodeToDisk() failed (Status %lx)\n", Status);
+ MUIDisplayError(ERROR_INSTALL_BOOTCODE, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
+
+ return SUCCESS_PAGE;
+}
+
+
+/**
+ * @name ProgressTimeOutStringHandler
+ *
+ * Handles the generation (displaying) of the timeout
+ * countdown to the screen dynamically.
+ *
+ * @param Bar
+ * A pointer to a progress bar.
+ *
+ * @param AlwaysUpdate
+ * Constantly update the progress bar (boolean type).
+ *
+ * @param Buffer
+ * A pointer to a string buffer.
+ *
+ * @param cchBufferSize
+ * The buffer's size in number of characters.
+ *
+ * @return
+ * TRUE or FALSE on function termination.
+ *
+ */
+static
+BOOLEAN NTAPI
+ProgressTimeOutStringHandler(
+ IN PPROGRESSBAR Bar,
+ IN BOOLEAN AlwaysUpdate,
+ OUT PSTR Buffer,
+ IN SIZE_T cchBufferSize)
+{
+ ULONG OldProgress = Bar->Progress;
- wcscpy(SourceMbrPathBuffer, SourceRootPath.Buffer);
- wcscat(SourceMbrPathBuffer, L"\\loader\\dosmbr.bin");
+ if (Bar->StepCount == 0)
+ {
+ Bar->Progress = 0;
+ }
+ else
+ {
+ Bar->Progress = Bar->StepCount - Bar->CurrentStep;
+ }
- if (IsThereAValidBootSector(DestinationDevicePathBuffer))
+ /* Build the progress string if it has changed */
+ if (Bar->ProgressFormatText &&
+ (AlwaysUpdate || (Bar->Progress != OldProgress)))
{
- /* Save current MBR */
- wcscpy(DstPath, SystemRootPath.Buffer);
- wcscat(DstPath, L"\\mbr.old");
+ RtlStringCchPrintfA(Buffer, cchBufferSize,
+ Bar->ProgressFormatText, Bar->Progress / max(1, Bar->Width) + 1);
- DPRINT1("Save MBR: %S ==> %S\n", DestinationDevicePathBuffer, DstPath);
- Status = SaveBootSector(DestinationDevicePathBuffer, DstPath, sizeof(PARTITION_SECTOR));
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("SaveBootSector() failed (Status %lx)\n", Status);
- // Don't care if we succeeded or not saving the old MBR, just go ahead.
- }
+ return TRUE;
}
- DPRINT1("Install MBR bootcode: %S ==> %S\n",
- SourceMbrPathBuffer, DestinationDevicePathBuffer);
- Status = InstallMbrBootCodeToDisk(SourceMbrPathBuffer,
- DestinationDevicePathBuffer);
- if (!NT_SUCCESS(Status))
+ return FALSE;
+}
+
+/**
+ * @name ProgressCountdown
+ *
+ * Displays and draws a red-coloured progress bar with a countdown.
+ * When the timeout is reached, the flush page is displayed for reboot.
+ *
+ * @param Ir
+ * A pointer to an input keyboard record.
+ *
+ * @param TimeOut
+ * Initial countdown value in seconds.
+ *
+ * @return
+ * Nothing.
+ *
+ */
+static VOID
+ProgressCountdown(
+ IN PINPUT_RECORD Ir,
+ IN LONG TimeOut)
+{
+ NTSTATUS Status;
+ ULONG StartTime, BarWidth, TimerDiv;
+ LONG TimeElapsed;
+ LONG TimerValue, OldTimerValue;
+ LARGE_INTEGER Timeout;
+ PPROGRESSBAR ProgressBar;
+ BOOLEAN RefreshProgress = TRUE;
+
+ /* Bail out if the timeout is already zero */
+ if (TimeOut <= 0)
+ return;
+
+ /* Create the timeout progress bar and set it up */
+ ProgressBar = CreateProgressBarEx(13,
+ 26,
+ xScreen - 13,
+ yScreen - 20,
+ 10,
+ 24,
+ TRUE,
+ FOREGROUND_RED | BACKGROUND_BLUE,
+ 0,
+ NULL,
+ MUIGetString(STRING_REBOOTPROGRESSBAR),
+ ProgressTimeOutStringHandler);
+
+ BarWidth = max(1, ProgressBar->Width);
+ TimerValue = TimeOut * BarWidth;
+ ProgressSetStepCount(ProgressBar, TimerValue);
+
+ StartTime = NtGetTickCount();
+ CONSOLE_Flush();
+
+ TimerDiv = 1000 / BarWidth;
+ TimerDiv = max(1, TimerDiv);
+ OldTimerValue = TimerValue;
+ while (TRUE)
{
- DPRINT1("InstallMbrBootCodeToDisk() failed (Status %lx)\n",
- Status);
- MUIDisplayError(ERROR_INSTALL_BOOTCODE, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
+ /* Decrease the timer */
+
+ /*
+ * Compute how much time the previous operations took.
+ * This allows us in particular to take account for any time
+ * elapsed if something slowed down.
+ */
+ TimeElapsed = NtGetTickCount() - StartTime;
+ if (TimeElapsed >= TimerDiv)
+ {
+ /* Increase StartTime by steps of 1 / ProgressBar->Width seconds */
+ TimeElapsed /= TimerDiv;
+ StartTime += (TimerDiv * TimeElapsed);
+
+ if (TimeElapsed <= TimerValue)
+ TimerValue -= TimeElapsed;
+ else
+ TimerValue = 0;
+
+ RefreshProgress = TRUE;
+ }
+
+ if (RefreshProgress)
+ {
+ ProgressSetStep(ProgressBar, OldTimerValue - TimerValue);
+ RefreshProgress = FALSE;
+ }
+
+ /* Stop when the timer reaches zero */
+ if (TimerValue <= 0)
+ break;
+
+ /* Check for user key presses */
+
+ /*
+ * If the timer is used, use a passive wait of maximum 1 second
+ * while monitoring for incoming console input events, so that
+ * we are still able to display the timing count.
+ */
+
+ /* Wait a maximum of 1 second for input events */
+ TimeElapsed = NtGetTickCount() - StartTime;
+ if (TimeElapsed < TimerDiv)
+ {
+ /* Convert the time to NT Format */
+ Timeout.QuadPart = (TimerDiv - TimeElapsed) * -10000LL;
+ Status = NtWaitForSingleObject(StdInput, FALSE, &Timeout);
+ }
+ else
+ {
+ Status = STATUS_TIMEOUT;
+ }
+
+ /* Check whether the input event has been signaled, or a timeout happened */
+ if (Status == STATUS_TIMEOUT)
+ {
+ continue;
+ }
+ if (Status != STATUS_WAIT_0)
+ {
+ /* An error happened, bail out */
+ DPRINT1("NtWaitForSingleObject() failed, Status 0x%08lx\n", Status);
+ break;
+ }
+
+ /* Check for an ENTER key press */
+ while (CONSOLE_ConInKeyPeek(Ir))
+ {
+ if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
+ {
+ /* Found it, stop waiting */
+ goto Exit;
+ }
+ }
}
- return SUCCESS_PAGE;
+Exit:
+ /* Destroy the progress bar and quit */
+ DestroyProgressBar(ProgressBar);
}
{
MUIDisplayPage(QUIT_PAGE);
- /* Destroy partition list */
+ /* Destroy the NTOS installations list */
+ if (NtOsInstallsList != NULL)
+ {
+ DestroyGenericList(NtOsInstallsList, TRUE);
+ NtOsInstallsList = NULL;
+ }
+
+ /* Destroy the partition list */
if (PartitionList != NULL)
{
DestroyPartitionList(PartitionList);
PartitionList = NULL;
}
+ TempPartition = NULL;
+ FormatState = Start;
- /* Destroy filesystem list */
+ /* Destroy the filesystem list */
if (FileSystemList != NULL)
{
DestroyFileSystemList(FileSystemList);
FileSystemList = NULL;
}
- /* Destroy computer settings list */
+ /* Destroy the computer settings list */
if (ComputerList != NULL)
{
DestroyGenericList(ComputerList, TRUE);
ComputerList = NULL;
}
- /* Destroy display settings list */
+ /* Destroy the display settings list */
if (DisplayList != NULL)
{
DestroyGenericList(DisplayList, TRUE);
DisplayList = NULL;
}
- /* Destroy keyboard settings list */
+ /* Destroy the keyboard settings list */
if (KeyboardList != NULL)
{
DestroyGenericList(KeyboardList, TRUE);
KeyboardList = NULL;
}
- /* Destroy keyboard layout list */
+ /* Destroy the keyboard layout list */
if (LayoutList != NULL)
{
DestroyGenericList(LayoutList, TRUE);
LayoutList = NULL;
}
+ /* Destroy the languages list */
if (LanguageList != NULL)
{
DestroyGenericList(LanguageList, FALSE);
CONSOLE_SetStatusText(MUIGetString(STRING_REBOOTCOMPUTER2));
- while (TRUE)
- {
- CONSOLE_ConInKey(Ir);
-
- if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
- {
- return FLUSH_PAGE;
- }
- }
+ /* Wait for maximum 15 seconds or an ENTER key before quitting */
+ ProgressCountdown(Ir, 15);
+ return FLUSH_PAGE;
}
MUIDisplayPage(SUCCESS_PAGE);
if (IsUnattendedSetup)
- {
return FLUSH_PAGE;
- }
-
- while (TRUE)
- {
- CONSOLE_ConInKey(Ir);
- if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
- {
- return FLUSH_PAGE;
- }
- }
+ /* Wait for maximum 15 seconds or an ENTER key before quitting */
+ ProgressCountdown(Ir, 15);
+ return FLUSH_PAGE;
}
/*
* 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);
+
+ /* 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);
+ /* Create the PnP thread in suspended state */
Status = RtlCreateUserThread(NtCurrentProcess(),
NULL,
TRUE,
&hPnpThread,
NULL);
if (!NT_SUCCESS(Status))
- hPnpThread = INVALID_HANDLE_VALUE;
+ hPnpThread = NULL;
if (!CONSOLE_Init())
{
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 */
- RtlInitUnicodeString(&SourcePath, NULL);
- RtlInitUnicodeString(&SourceRootPath, NULL);
- RtlInitUnicodeString(&SourceRootDir, NULL);
+ RtlInitUnicodeString(&USetupData.SourcePath, NULL);
+ RtlInitUnicodeString(&USetupData.SourceRootPath, NULL);
+ RtlInitUnicodeString(&USetupData.SourceRootDir, NULL);
RtlInitUnicodeString(&InstallPath, NULL);
- RtlInitUnicodeString(&DestinationPath, NULL);
- RtlInitUnicodeString(&DestinationArcPath, NULL);
- RtlInitUnicodeString(&DestinationRootPath, NULL);
- RtlInitUnicodeString(&SystemRootPath, NULL);
+ RtlInitUnicodeString(&USetupData.DestinationPath, NULL);
+ RtlInitUnicodeString(&USetupData.DestinationArcPath, NULL);
+ RtlInitUnicodeString(&USetupData.DestinationRootPath, NULL);
+ RtlInitUnicodeString(&USetupData.SystemRootPath, NULL);
/* 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);
case SCSI_CONTROLLER_PAGE:
Page = ScsiControllerPage(&Ir);
break;
-#endif
-#if 0
case OEM_DRIVER_PAGE:
Page = OemDriverPage(&Ir);
break;
break;
case FORMAT_PARTITION_PAGE:
- Page = (PAGE_NUMBER) FormatPartitionPage(&Ir);
+ Page = FormatPartitionPage(&Ir);
break;
case CHECK_FILE_SYSTEM_PAGE:
- Page = (PAGE_NUMBER) CheckFileSystemPage(&Ir);
+ Page = CheckFileSystemPage(&Ir);
break;
case INSTALL_DIRECTORY_PAGE:
Page = RepairIntroPage(&Ir);
break;
+ case UPGRADE_REPAIR_PAGE:
+ Page = UpgradeRepairPage(&Ir);
+ break;
+
case SUCCESS_PAGE:
Page = SuccessPage(&Ir);
break;
}
}
+ SetupCloseInfFile(SetupInf);
+
if (Page == RECOVERY_PAGE)
RecoveryConsole();
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 */