* PROJECT: ReactOS text-mode setup
* FILE: base/setup/usetup/usetup.c
* PURPOSE: Text-mode setup
- * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
- * Hervé Poussineau (hpoussin@reactos.org)
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * Hervé Poussineau (hpoussin@reactos.org)
*/
#include <usetup.h>
#include "bootsup.h"
#include "chkdsk.h"
#include "cmdcons.h"
+#include "devinst.h"
#include "format.h"
-#include "drivesup.h"
-#include "settings.h"
#define NDEBUG
#include <debug.h>
-// HACK!
-#include <strsafe.h>
-
-/* GLOBALS ******************************************************************/
+/* GLOBALS & LOCALS *********************************************************/
HANDLE ProcessHeap;
-
-static UNICODE_STRING SourceRootPath;
-static UNICODE_STRING SourceRootDir;
-/* static */ 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];
-static BOOLEAN RepairUpdateFlag = FALSE;
-static HANDLE hPnpThread = INVALID_HANDLE_VALUE;
-static PPARTLIST PartitionList = NULL;
-static PPARTENTRY TempPartition = NULL;
-static FORMATMACHINESTATE FormatState = Start;
+static USETUP_DATA USetupData;
+/* Partition where to perform the installation */
+static PPARTENTRY InstallPartition = NULL;
+// static PPARTENTRY SystemPartition = NULL; // The system partition we will actually use (can be different from PartitionList->SystemPartition in case we install on removable disk)
-/* LOCALS *******************************************************************/
+// FIXME: Is it really useful?? Just used for SetDefaultPagefile...
+static WCHAR DestinationDriveLetter;
-static PFILE_SYSTEM_LIST FileSystemList = NULL;
-static UNICODE_STRING InstallPath;
+/* OTHER Stuff *****/
-/*
- * 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;
+PCWSTR SelectedLanguageId;
+static WCHAR DefaultLanguage[20]; // Copy of string inside LanguageList
+static WCHAR DefaultKBLayout[20]; // Copy of string inside KeyboardList
-/* Path to the install directory inside the ReactOS boot partition */
-static UNICODE_STRING DestinationPath;
-static UNICODE_STRING DestinationArcPath;
-static UNICODE_STRING DestinationRootPath;
+static BOOLEAN RepairUpdateFlag = FALSE;
-// FIXME: Is it really useful?? Just used for SetDefaultPagefile...
-static WCHAR DestinationDriveLetter;
+/* Global partition list on the system */
+static PPARTLIST PartitionList = NULL;
+
+/* Currently selected partition entry in the list */
+static PPARTENTRY CurrentPartition = NULL;
-static HINF SetupInf;
+/* List of supported file systems for the partition to be formatted */
+static PFILE_SYSTEM_LIST FileSystemList = NULL;
-static HSPFILEQ SetupFileQueue = NULL;
+/* Machine state for the formatter */
+static PPARTENTRY TempPartition = NULL;
+static FORMATMACHINESTATE FormatState = Start;
-static PGENERIC_LIST ComputerList = NULL;
-static PGENERIC_LIST DisplayList = NULL;
-static PGENERIC_LIST KeyboardList = NULL;
-static PGENERIC_LIST LayoutList = NULL;
-static PGENERIC_LIST LanguageList = NULL;
+/*****************************************************/
-static LANGID LanguageId = 0;
+static PNTOS_INSTALLATION CurrentInstallation = NULL;
+static PGENERIC_LIST NtOsInstallsList = NULL;
-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++;
static VOID
-CheckUnattendedSetup(VOID)
+UpdateKBLayout(VOID)
{
- WCHAR UnattendInfPath[MAX_PATH];
- INFCONTEXT Context;
- HINF UnattendInf;
- UINT ErrorLine;
- INT IntValue;
- PWCHAR Value;
-
- CombinePaths(UnattendInfPath, ARRAYSIZE(UnattendInfPath), 2, SourcePath.Buffer, L"unattend.inf");
-
- if (DoesFileExist(NULL, UnattendInfPath) == FALSE)
- {
- DPRINT("Does not exist: %S\n", UnattendInfPath);
- return;
- }
-
- /* 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 = (LONG)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;
- DPRINT("Running unattended setup\n");
+ PGENERIC_LIST_ENTRY ListEntry;
+ PCWSTR pszNewLayout;
- /* Search for 'MBRInstallType' in the 'Unattend' section */
- if (SetupFindFirstLineW(UnattendInf, L"Unattend", L"MBRInstallType", &Context))
- {
- if (SetupGetIntField(&Context, 1, &IntValue))
- {
- UnattendMBRInstallType = IntValue;
- }
- }
+ pszNewLayout = MUIDefaultKeyboardLayout(SelectedLanguageId);
- /* Search for 'FormatPartition' in the 'Unattend' section */
- if (SetupFindFirstLineW(UnattendInf, L"Unattend", L"FormatPartition", &Context))
+ if (USetupData.LayoutList == NULL)
{
- if (SetupGetIntField(&Context, 1, &IntValue))
+ USetupData.LayoutList = CreateKeyboardLayoutList(USetupData.SetupInf, SelectedLanguageId, DefaultKBLayout);
+ if (USetupData.LayoutList == NULL)
{
- UnattendFormatPartition = IntValue;
+ /* FIXME: Handle error! */
+ return;
}
}
- if (SetupFindFirstLineW(UnattendInf, L"Unattend", L"AutoPartition", &Context))
+ /* Search for default layout (if provided) */
+ if (pszNewLayout != NULL)
{
- if (SetupGetIntField(&Context, 1, &IntValue))
+ for (ListEntry = GetFirstListEntry(USetupData.LayoutList); ListEntry;
+ ListEntry = GetNextListEntry(ListEntry))
{
- AutoPartition = IntValue;
+ if (!wcscmp(pszNewLayout, ((PGENENTRY)GetListEntryData(ListEntry))->Id))
+ {
+ SetCurrentListEntry(USetupData.LayoutList, ListEntry);
+ break;
+ }
}
}
-
- /* 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);
}
-static VOID
-UpdateKBLayout(VOID)
+static NTSTATUS
+NTAPI
+GetSettingDescription(
+ IN PGENERIC_LIST_ENTRY Entry,
+ OUT PSTR Buffer,
+ IN SIZE_T cchBufferSize)
{
- PGENERIC_LIST_ENTRY ListEntry;
- LPCWSTR pszNewLayout;
+ return RtlStringCchPrintfA(Buffer, cchBufferSize, "%S",
+ ((PGENENTRY)GetListEntryData(Entry))->Value);
+}
- pszNewLayout = MUIDefaultKeyboardLayout();
+static NTSTATUS
+NTAPI
+GetNTOSInstallationName(
+ IN PGENERIC_LIST_ENTRY Entry,
+ OUT PSTR Buffer,
+ IN SIZE_T cchBufferSize)
+{
+ PNTOS_INSTALLATION NtOsInstall = (PNTOS_INSTALLATION)GetListEntryData(Entry);
+ PPARTENTRY PartEntry = NtOsInstall->PartEntry;
- if (LayoutList == NULL)
+ if (PartEntry && PartEntry->DriveLetter)
{
- LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout);
- if (LayoutList == NULL)
- {
- /* FIXME: Handle error! */
- return;
- }
+ /* We have retrieved a partition that is mounted */
+ return RtlStringCchPrintfA(Buffer, cchBufferSize,
+ "%C:%S \"%S\"",
+ PartEntry->DriveLetter,
+ NtOsInstall->PathComponent,
+ NtOsInstall->InstallationName);
}
-
- ListEntry = GetFirstListEntry(LayoutList);
-
- /* Search for default layout (if provided) */
- if (pszNewLayout != NULL)
+ else
{
- while (ListEntry != NULL)
- {
- if (!wcscmp(pszNewLayout, GetListEntryUserData(ListEntry)))
- {
- SetCurrentListEntry(LayoutList, ListEntry);
- break;
- }
-
- ListEntry = GetNextListEntry(ListEntry);
- }
+ /* We failed somewhere, just show the NT path */
+ return RtlStringCchPrintfA(Buffer, cchBufferSize,
+ "%wZ \"%S\"",
+ &NtOsInstall->SystemNtPath,
+ NtOsInstall->InstallationName);
}
}
*
* SIDEEFFECTS
* Init SelectedLanguageId
- * Init LanguageId
+ * Init USetupData.LanguageId
*
* RETURNS
* Number of the next page.
LanguagePage(PINPUT_RECORD Ir)
{
GENERIC_LIST_UI ListUi;
- PWCHAR NewLanguageId;
+ PCWSTR NewLanguageId;
BOOL RefreshPage = FALSE;
/* Initialize the computer settings list */
- if (LanguageList == NULL)
+ if (USetupData.LanguageList == NULL)
{
- LanguageList = CreateLanguageList(SetupInf, DefaultLanguage);
- if (LanguageList == NULL)
+ USetupData.LanguageList = CreateLanguageList(USetupData.SetupInf, DefaultLanguage);
+ if (USetupData.LanguageList == NULL)
{
PopupError("Setup failed to initialize available translations", NULL, NULL, POPUP_WAIT_NONE);
return WELCOME_PAGE;
}
}
- /* Load the font */
SelectedLanguageId = DefaultLanguage;
+ USetupData.LanguageId = 0;
+
+ /* Load the font */
SetConsoleCodePage();
UpdateKBLayout();
- /* If there's just a single language in the list skip
- * the language selection process altogether! */
- if (GenericListHasSingleEntry(LanguageList))
+ /*
+ * If there is no language or just a single one in the list,
+ * skip the language selection process altogether.
+ */
+ if (GetNumberOfListEntries(USetupData.LanguageList) <= 1)
{
- LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
+ USetupData.LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
return WELCOME_PAGE;
}
- InitGenericListUi(&ListUi, LanguageList);
+ InitGenericListUi(&ListUi, USetupData.LanguageList, GetSettingDescription);
DrawGenericList(&ListUi,
- 2,
- 18,
+ 2, 18,
xScreen - 3,
yScreen - 3);
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(&ListUi);
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
- SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));
+ ASSERT(GetNumberOfListEntries(USetupData.LanguageList) >= 1);
- LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
+ SelectedLanguageId =
+ ((PGENENTRY)GetListEntryData(GetCurrentListEntry(USetupData.LanguageList)))->Id;
+
+ USetupData.LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
if (wcscmp(SelectedLanguageId, DefaultLanguage))
{
if (RefreshPage)
{
- NewLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));
+ ASSERT(GetNumberOfListEntries(USetupData.LanguageList) >= 1);
+
+ NewLanguageId =
+ ((PGENENTRY)GetListEntryData(GetCurrentListEntry(USetupData.LanguageList)))->Id;
- if (SelectedLanguageId != NewLanguageId)
+ if (wcscmp(SelectedLanguageId, NewLanguageId))
{
/* Clear the language page */
MUIClearPage(LANGUAGE_PAGE);
*
* SIDEEFFECTS
* Init Sdi
- * Init SourcePath
- * Init SourceRootPath
- * Init SourceRootDir
- * Init SetupInf
- * Init RequiredPartitionDiskSpace
+ * Init USetupData.SourcePath
+ * Init USetupData.SourceRootPath
+ * Init USetupData.SourceRootDir
+ * Init USetupData.SetupInf
+ * 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)
{
- NTSTATUS Status;
- WCHAR FileNameBuffer[MAX_PATH];
- INFCONTEXT Context;
- PWCHAR Value;
- UINT ErrorLine;
+ ULONG Error;
PGENERIC_LIST_ENTRY ListEntry;
- INT IntValue;
-
- CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
-
- /* Get the source path and source root path */
- Status = GetSourcePaths(&SourcePath,
- &SourceRootPath,
- &SourceRootDir);
- if (!NT_SUCCESS(Status))
- {
- CONSOLE_PrintTextXY(6, 15, "GetSourcePaths() failed (Status 0x%08lx)", Status);
- MUIDisplayError(ERROR_NO_SOURCE_DRIVE, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
- DPRINT1("SourcePath: '%wZ'\n", &SourcePath);
- DPRINT1("SourceRootPath: '%wZ'\n", &SourceRootPath);
- DPRINT1("SourceRootDir: '%wZ'\n", &SourceRootDir);
-
- /* Load txtsetup.sif from install media. */
- CombinePaths(FileNameBuffer, ARRAYSIZE(FileNameBuffer), 2, SourcePath.Buffer, L"txtsetup.sif");
- SetupInf = SetupOpenInfFileW(FileNameBuffer,
- NULL,
- INF_STYLE_WIN4,
- LanguageId,
- &ErrorLine);
-
- if (SetupInf == INVALID_HANDLE_VALUE)
- {
- MUIDisplayError(ERROR_LOAD_TXTSETUPSIF, 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;
- }
+ PCWSTR LocaleId;
- /* Open 'DiskSpaceRequirements' section */
- if (!SetupFindFirstLineW(SetupInf, L"DiskSpaceRequirements", L"FreeSysPartDiskSpace", &Context))
- {
- MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
+ MUIDisplayPage(SETUP_INIT_PAGE);
- /* Get the 'FreeSysPartDiskSpace' value */
- if (!SetupGetIntField(&Context, 1, &IntValue))
+ /* Initialize Setup, phase 1 */
+ Error = InitializeSetup(&USetupData, 1);
+ if (Error != ERROR_SUCCESS)
{
- MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
+ MUIDisplayError(Error, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
- RequiredPartitionDiskSpace = (ULONG)IntValue;
+ /* Initialize the user-mode PnP manager */
+ if (!EnableUserModePnpManager())
+ DPRINT1("The user-mode PnP manager could not initialize, expect unavailable devices!\n");
- /* Start the PnP thread */
- if (hPnpThread != INVALID_HANDLE_VALUE)
- {
- NtResumeThread(hPnpThread, NULL);
- hPnpThread = INVALID_HANDLE_VALUE;
- }
+ /* Wait for any immediate pending installations to finish */
+ if (WaitNoPendingInstallEvents(NULL) != STATUS_WAIT_0)
+ DPRINT1("WaitNoPendingInstallEvents() failed to wait!\n");
- CheckUnattendedSetup();
+ CheckUnattendedSetup(&USetupData);
if (IsUnattendedSetup)
{
// TODO: Read options from inf
- ComputerList = CreateComputerTypeList(SetupInf);
- DisplayList = CreateDisplayDriverList(SetupInf);
- KeyboardList = CreateKeyboardDriverList(SetupInf);
- LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout);
- LanguageList = CreateLanguageList(SetupInf, DefaultLanguage);
+ /* Load the hardware, language and keyboard layout lists */
+
+ USetupData.ComputerList = CreateComputerTypeList(USetupData.SetupInf);
+ USetupData.DisplayList = CreateDisplayDriverList(USetupData.SetupInf);
+ USetupData.KeyboardList = CreateKeyboardDriverList(USetupData.SetupInf);
+
+ USetupData.LanguageList = CreateLanguageList(USetupData.SetupInf, DefaultLanguage);
/* new part */
- wcscpy(SelectedLanguageId, LocaleID);
- LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
+ SelectedLanguageId = DefaultLanguage;
+ wcscpy(DefaultLanguage, USetupData.LocaleID);
+ USetupData.LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF);
+
+ USetupData.LayoutList = CreateKeyboardLayoutList(USetupData.SetupInf, SelectedLanguageId, DefaultKBLayout);
/* first we hack LanguageList */
- ListEntry = GetFirstListEntry(LanguageList);
- while (ListEntry != NULL)
+ for (ListEntry = GetFirstListEntry(USetupData.LanguageList); ListEntry;
+ ListEntry = GetNextListEntry(ListEntry))
{
- if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
+ LocaleId = ((PGENENTRY)GetListEntryData(ListEntry))->Id;
+ if (!wcsicmp(USetupData.LocaleID, LocaleId))
{
- DPRINT("found %S in LanguageList\n",GetListEntryUserData(ListEntry));
- SetCurrentListEntry(LanguageList, ListEntry);
+ DPRINT("found %S in LanguageList\n", LocaleId);
+ SetCurrentListEntry(USetupData.LanguageList, ListEntry);
break;
}
-
- ListEntry = GetNextListEntry(ListEntry);
}
/* now LayoutList */
- ListEntry = GetFirstListEntry(LayoutList);
- while (ListEntry != NULL)
+ for (ListEntry = GetFirstListEntry(USetupData.LayoutList); ListEntry;
+ ListEntry = GetNextListEntry(ListEntry))
{
- if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
+ LocaleId = ((PGENENTRY)GetListEntryData(ListEntry))->Id;
+ if (!wcsicmp(USetupData.LocaleID, LocaleId))
{
- DPRINT("found %S in LayoutList\n",GetListEntryUserData(ListEntry));
- SetCurrentListEntry(LayoutList, ListEntry);
+ DPRINT("found %S in LayoutList\n", LocaleId);
+ SetCurrentListEntry(USetupData.LayoutList, ListEntry);
break;
}
-
- ListEntry = GetNextListEntry(ListEntry);
}
SetConsoleCodePage();
* Next pages:
* InstallIntroPage (default)
* RepairIntroPage
+ * RecoveryPage
* LicensePage
* QuitPage
*
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') /* L */
{
{
MUIDisplayPage(REPAIR_INTRO_PAGE);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
}
/*
- * Displays the InstallIntroPage.
+ * Displays the UpgradeRepairPage.
*
* Next pages:
- * DeviceSettingsPage (At once if repair or update is selected)
- * SelectPartitionPage (At once if unattended setup)
- * DeviceSettingsPage (default)
- * QuitPage
+ * RebootPage (default)
+ * InstallIntroPage
+ * RecoveryPage
+ * WelcomePage
*
* RETURNS
* Number of the next page.
*/
static PAGE_NUMBER
-InstallIntroPage(PINPUT_RECORD Ir)
+UpgradeRepairPage(PINPUT_RECORD Ir)
{
- if (RepairUpdateFlag)
- {
- //return SELECT_PARTITION_PAGE;
- return DEVICE_SETTINGS_PAGE;
- }
-
- if (IsUnattendedSetup)
- return SELECT_PARTITION_PAGE;
-
- MUIDisplayPage(INSTALL_INTRO_PAGE);
+ GENERIC_LIST_UI ListUi;
- while (TRUE)
+/*** HACK!! ***/
+ if (PartitionList == NULL)
{
- CONSOLE_ConInKey(Ir);
-
- if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
- (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
+ PartitionList = CreatePartitionList();
+ if (PartitionList == NULL)
{
- if (ConfirmQuit(Ir) != FALSE)
- return QUIT_PAGE;
-
- break;
+ /* FIXME: show an error dialog */
+ MUIDisplayError(ERROR_DRIVE_INFORMATION, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
}
- else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
+ else if (IsListEmpty(&PartitionList->DiskListHead))
{
- return DEVICE_SETTINGS_PAGE;
- // return SCSI_CONTROLLER_PAGE;
+ MUIDisplayError(ERROR_NO_HDD, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
}
- }
- return INSTALL_INTRO_PAGE;
-}
+ /* Reset the formatter machine state */
+ TempPartition = NULL;
+ FormatState = Start;
+ }
+/**************/
+ NtOsInstallsList = CreateNTOSInstallationsList(PartitionList);
+ if (!NtOsInstallsList)
+ DPRINT1("Failed to get a list of NTOS installations; continue installation...\n");
-#if 0
-static PAGE_NUMBER
-ScsiControllerPage(PINPUT_RECORD Ir)
-{
- // MUIDisplayPage(SCSI_CONTROLLER_PAGE);
+ /*
+ * If there is no available installation (or just a single one??) that can
+ * be updated in the list, just continue with the regular installation.
+ */
+ if (!NtOsInstallsList || GetNumberOfListEntries(NtOsInstallsList) == 0)
+ {
+ RepairUpdateFlag = FALSE;
- CONSOLE_SetTextXY(6, 8, "Setup detected the following mass storage devices:");
+ // return INSTALL_INTRO_PAGE;
+ return DEVICE_SETTINGS_PAGE;
+ // return SCSI_CONTROLLER_PAGE;
+ }
- /* FIXME: print loaded mass storage driver descriptions */
-#if 0
- CONSOLE_SetTextXY(8, 10, "TEST device");
-#endif
+ MUIDisplayPage(UPGRADE_REPAIR_PAGE);
- CONSOLE_SetStatusText(" ENTER = Continue F3 = Quit");
+ InitGenericListUi(&ListUi, NtOsInstallsList, GetNTOSInstallationName);
+ DrawGenericList(&ListUi,
+ 2, 23,
+ xScreen - 3,
+ yScreen - 3);
+ // return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
while (TRUE)
{
CONSOLE_ConInKey(Ir);
- if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
- (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
+ if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00)
{
- if (ConfirmQuit(Ir) != FALSE)
- return QUIT_PAGE;
+ 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 */
+ {
+ RestoreGenericListUiState(&ListUi);
+ // return nextPage; // prevPage;
- break;
+ // return INSTALL_INTRO_PAGE;
+ return DEVICE_SETTINGS_PAGE;
+ // return SCSI_CONTROLLER_PAGE;
+ }
+ }
}
- else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
+ else
{
- return DEVICE_SETTINGS_PAGE;
+ // 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 */
+ ASSERT(GetNumberOfListEntries(NtOsInstallsList) >= 1);
+
+ CurrentInstallation =
+ (PNTOS_INSTALLATION)GetListEntryData(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.
+ *
+ * Next pages:
+ * DeviceSettingsPage (At once if repair or update is selected)
+ * SelectPartitionPage (At once if unattended setup)
+ * DeviceSettingsPage (default)
+ * QuitPage
+ *
+ * RETURNS
+ * Number of the next page.
+ */
+static PAGE_NUMBER
+InstallIntroPage(PINPUT_RECORD Ir)
+{
+ if (RepairUpdateFlag)
+ {
+#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)
+ {
+ 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 UPGRADE_REPAIR_PAGE;
+ }
+ }
+
+ return INSTALL_INTRO_PAGE;
+}
+
+
+#if 0
+static PAGE_NUMBER
+ScsiControllerPage(PINPUT_RECORD Ir)
+{
+ // MUIDisplayPage(SCSI_CONTROLLER_PAGE);
+
+ CONSOLE_SetTextXY(6, 8, "Setup detected the following mass storage devices:");
+
+ /* FIXME: print loaded mass storage driver descriptions */
+#if 0
+ CONSOLE_SetTextXY(8, 10, "TEST device");
+#endif
+
+ 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;
}
}
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;
* QuitPage
*
* SIDEEFFECTS
- * Init ComputerList
- * Init DisplayList
- * Init KeyboardList
- * Init LayoutList
+ * Init USetupData.ComputerList
+ * Init USetupData.DisplayList
+ * Init USetupData.KeyboardList
+ * Init USetupData.LayoutList
*
* RETURNS
* Number of the next page.
static ULONG Line = 16;
/* Initialize the computer settings list */
- if (ComputerList == NULL)
+ if (USetupData.ComputerList == NULL)
{
- ComputerList = CreateComputerTypeList(SetupInf);
- if (ComputerList == NULL)
+ USetupData.ComputerList = CreateComputerTypeList(USetupData.SetupInf);
+ if (USetupData.ComputerList == NULL)
{
MUIDisplayError(ERROR_LOAD_COMPUTER, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
/* Initialize the display settings list */
- if (DisplayList == NULL)
+ if (USetupData.DisplayList == NULL)
{
- DisplayList = CreateDisplayDriverList(SetupInf);
- if (DisplayList == NULL)
+ USetupData.DisplayList = CreateDisplayDriverList(USetupData.SetupInf);
+ if (USetupData.DisplayList == NULL)
{
MUIDisplayError(ERROR_LOAD_DISPLAY, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
/* Initialize the keyboard settings list */
- if (KeyboardList == NULL)
+ if (USetupData.KeyboardList == NULL)
{
- KeyboardList = CreateKeyboardDriverList(SetupInf);
- if (KeyboardList == NULL)
+ USetupData.KeyboardList = CreateKeyboardDriverList(USetupData.SetupInf);
+ if (USetupData.KeyboardList == NULL)
{
MUIDisplayError(ERROR_LOAD_KEYBOARD, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
/* Initialize the keyboard layout list */
- if (LayoutList == NULL)
+ if (USetupData.LayoutList == NULL)
{
- LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout);
- if (LayoutList == NULL)
+ USetupData.LayoutList = CreateKeyboardLayoutList(USetupData.SetupInf, SelectedLanguageId, DefaultKBLayout);
+ if (USetupData.LayoutList == NULL)
{
/* FIXME: report error */
MUIDisplayError(ERROR_LOAD_KBLAYOUT, Ir, POPUP_WAIT_ENTER);
MUIDisplayPage(DEVICE_SETTINGS_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)));
+ DrawGenericListCurrentItem(USetupData.ComputerList, GetSettingDescription, 25, 11);
+ DrawGenericListCurrentItem(USetupData.DisplayList , GetSettingDescription, 25, 12);
+ DrawGenericListCurrentItem(USetupData.KeyboardList, GetSettingDescription, 25, 13);
+ DrawGenericListCurrentItem(USetupData.LayoutList , GetSettingDescription, 25, 14);
CONSOLE_InvertTextXY(24, Line, 48, 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;
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(ListUi);
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */
{
- RestoreGenericListState(ListUi->List);
+ RestoreGenericListUiState(ListUi);
return nextPage; // Use some "prevPage;" instead?
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
GENERIC_LIST_UI ListUi;
MUIDisplayPage(COMPUTER_SETTINGS_PAGE);
- InitGenericListUi(&ListUi, ComputerList);
+ InitGenericListUi(&ListUi, USetupData.ComputerList, GetSettingDescription);
DrawGenericList(&ListUi,
- 2,
- 18,
+ 2, 18,
xScreen - 3,
yScreen - 3);
- SaveGenericListState(ComputerList);
-
return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
}
GENERIC_LIST_UI ListUi;
MUIDisplayPage(DISPLAY_SETTINGS_PAGE);
- InitGenericListUi(&ListUi, DisplayList);
+ InitGenericListUi(&ListUi, USetupData.DisplayList, GetSettingDescription);
DrawGenericList(&ListUi,
- 2,
- 18,
+ 2, 18,
xScreen - 3,
yScreen - 3);
- SaveGenericListState(DisplayList);
-
return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
}
GENERIC_LIST_UI ListUi;
MUIDisplayPage(KEYBOARD_SETTINGS_PAGE);
- InitGenericListUi(&ListUi, KeyboardList);
+ InitGenericListUi(&ListUi, USetupData.KeyboardList, GetSettingDescription);
DrawGenericList(&ListUi,
- 2,
- 18,
+ 2, 18,
xScreen - 3,
yScreen - 3);
- SaveGenericListState(KeyboardList);
-
return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir);
}
GENERIC_LIST_UI ListUi;
MUIDisplayPage(LAYOUT_SETTINGS_PAGE);
- InitGenericListUi(&ListUi, LayoutList);
+ InitGenericListUi(&ListUi, USetupData.LayoutList, GetSettingDescription);
DrawGenericList(&ListUi,
- 2,
- 18,
+ 2, 18,
xScreen - 3,
yScreen - 3);
- SaveGenericListState(LayoutList);
-
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 one */
- DPRINT1("Partition is too small (size: %I64u MB), required disk space is %lu MB\n", size, RequiredPartitionDiskSpace);
+ DPRINT1("Partition is too small (size: %I64u MB), required disk space is %lu MB\n", size, USetupData.RequiredPartitionDiskSpace);
return FALSE;
}
else
return QUIT_PAGE;
}
+ /* Reset the formatter machine state */
TempPartition = NULL;
FormatState = Start;
}
+ if (RepairUpdateFlag)
+ {
+ ASSERT(CurrentInstallation);
+
+ /* Determine the selected installation disk & partition */
+ InstallPartition = SelectPartition(PartitionList,
+ CurrentInstallation->DiskNumber,
+ CurrentInstallation->PartitionNumber);
+ if (!InstallPartition)
+ {
+ DPRINT1("RepairUpdateFlag == TRUE, SelectPartition() returned FALSE, assert!\n");
+ ASSERT(FALSE);
+ }
+ ASSERT(!IsContainerPartition(InstallPartition->PartitionType));
+
+ return SELECT_FILE_SYSTEM_PAGE;
+ }
+
MUIDisplayPage(SELECT_PARTITION_PAGE);
InitPartitionListUi(&ListUi, PartitionList,
- 2,
- 23,
+ CurrentPartition,
+ 2, 23,
xScreen - 3,
yScreen - 3);
DrawPartitionList(&ListUi);
if (IsUnattendedSetup)
{
- if (!SelectPartition(PartitionList, UnattendDestinationDiskNumber, UnattendDestinationPartitionNumber))
+ /* Determine the selected installation disk & partition */
+ InstallPartition = SelectPartition(PartitionList,
+ USetupData.DestinationDiskNumber,
+ USetupData.DestinationPartitionNumber);
+ if (!InstallPartition)
{
- if (AutoPartition)
+ CurrentPartition = ListUi.CurrentPartition;
+
+ if (USetupData.AutoPartition)
{
- if (PartitionList->CurrentPartition->LogicalPartition)
+ ASSERT(CurrentPartition != NULL);
+ ASSERT(!IsContainerPartition(CurrentPartition->PartitionType));
+
+ if (CurrentPartition->LogicalPartition)
{
CreateLogicalPartition(PartitionList,
- PartitionList->CurrentPartition->SectorCount.QuadPart,
+ CurrentPartition,
+ CurrentPartition->SectorCount.QuadPart,
TRUE);
}
else
{
CreatePrimaryPartition(PartitionList,
- PartitionList->CurrentPartition->SectorCount.QuadPart,
+ CurrentPartition,
+ CurrentPartition->SectorCount.QuadPart,
TRUE);
}
// FIXME?? Aren't we going to enter an infinite loop, if this test fails??
- if (!IsDiskSizeValid(PartitionList->CurrentPartition))
+ if (!IsDiskSizeValid(CurrentPartition))
{
MUIDisplayError(ERROR_INSUFFICIENT_PARTITION_SIZE, Ir, POPUP_WAIT_ANY_KEY,
- RequiredPartitionDiskSpace);
+ USetupData.RequiredPartitionDiskSpace);
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
+ InstallPartition = CurrentPartition;
return SELECT_FILE_SYSTEM_PAGE;
}
}
else
{
- DrawPartitionList(&ListUi);
+ ASSERT(!IsContainerPartition(InstallPartition->PartitionType));
+
+ DrawPartitionList(&ListUi); // FIXME: Doesn't make much sense...
// FIXME?? Aren't we going to enter an infinite loop, if this test fails??
- if (!IsDiskSizeValid(PartitionList->CurrentPartition))
+ if (!IsDiskSizeValid(InstallPartition))
{
MUIDisplayError(ERROR_INSUFFICIENT_PARTITION_SIZE, Ir, POPUP_WAIT_ANY_KEY,
- RequiredPartitionDiskSpace);
+ USetupData.RequiredPartitionDiskSpace);
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
while (TRUE)
{
+ CurrentPartition = ListUi.CurrentPartition;
+
/* Update status text */
- if (PartitionList->CurrentPartition == NULL)
+ if (CurrentPartition == NULL)
{
CONSOLE_SetStatusText(MUIGetString(STRING_INSTALLCREATEPARTITION));
}
- else if (PartitionList->CurrentPartition->LogicalPartition)
+ else if (CurrentPartition->LogicalPartition)
{
- if (PartitionList->CurrentPartition->IsPartitioned)
+ if (CurrentPartition->IsPartitioned)
{
CONSOLE_SetStatusText(MUIGetString(STRING_DELETEPARTITION));
}
}
else
{
- if (PartitionList->CurrentPartition->IsPartitioned)
+ if (CurrentPartition->IsPartitioned)
{
- if (IsContainerPartition(PartitionList->CurrentPartition->PartitionType))
+ if (IsContainerPartition(CurrentPartition->PartitionType))
{
CONSOLE_SetStatusText(MUIGetString(STRING_DELETEPARTITION));
}
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.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
- if (IsContainerPartition(PartitionList->CurrentPartition->PartitionType))
+ ASSERT(CurrentPartition != NULL);
+
+ if (IsContainerPartition(CurrentPartition->PartitionType))
continue; // return SELECT_PARTITION_PAGE;
- if (PartitionList->CurrentPartition == NULL ||
- PartitionList->CurrentPartition->IsPartitioned == FALSE)
+ /*
+ * Check whether the user wants to install ReactOS on a disk that
+ * is not recognized by the computer's firmware and if so, display
+ * a warning since such disks may not be bootable.
+ */
+ if (CurrentPartition->DiskEntry->MediaType == FixedMedia &&
+ !CurrentPartition->DiskEntry->BiosFound)
+ {
+ PopupError("The disk you have selected for installing ReactOS\n"
+ "is not visible by the firmware of your computer,\n"
+ "and so may not be bootable.\n"
+ "Press ENTER to continue nonetheless.",
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
+ // return SELECT_PARTITION_PAGE;
+ }
+
+ if (CurrentPartition->IsPartitioned == FALSE)
{
- if (PartitionList->CurrentPartition->LogicalPartition)
+ if (CurrentPartition->LogicalPartition)
{
+ Error = LogicalPartitionCreationChecks(CurrentPartition);
+ if (Error != NOT_AN_ERROR)
+ {
+ MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
+ return SELECT_PARTITION_PAGE;
+ }
+
CreateLogicalPartition(PartitionList,
+ CurrentPartition,
0ULL,
TRUE);
}
else
{
+ Error = PrimaryPartitionCreationChecks(CurrentPartition);
+ if (Error != NOT_AN_ERROR)
+ {
+ MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
+ return SELECT_PARTITION_PAGE;
+ }
+
CreatePrimaryPartition(PartitionList,
+ CurrentPartition,
0ULL,
TRUE);
}
}
- if (!IsDiskSizeValid(PartitionList->CurrentPartition))
+ if (!IsDiskSizeValid(CurrentPartition))
{
MUIDisplayError(ERROR_INSUFFICIENT_PARTITION_SIZE, Ir, POPUP_WAIT_ANY_KEY,
- RequiredPartitionDiskSpace);
+ USetupData.RequiredPartitionDiskSpace);
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
+ InstallPartition = CurrentPartition;
return SELECT_FILE_SYSTEM_PAGE;
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'P') /* P */
{
- if (PartitionList->CurrentPartition->LogicalPartition == FALSE)
+ ASSERT(CurrentPartition != NULL);
+
+ if (CurrentPartition->LogicalPartition == FALSE)
{
- Error = PrimaryPartitionCreationChecks(PartitionList);
+ Error = PrimaryPartitionCreationChecks(CurrentPartition);
if (Error != NOT_AN_ERROR)
{
MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'E') /* E */
{
- if (PartitionList->CurrentPartition->LogicalPartition == FALSE)
+ ASSERT(CurrentPartition != NULL);
+
+ if (CurrentPartition->LogicalPartition == FALSE)
{
- Error = ExtendedPartitionCreationChecks(PartitionList);
+ Error = ExtendedPartitionCreationChecks(CurrentPartition);
if (Error != NOT_AN_ERROR)
{
MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'L') /* L */
{
- if (PartitionList->CurrentPartition->LogicalPartition != FALSE)
+ ASSERT(CurrentPartition != NULL);
+
+ if (CurrentPartition->LogicalPartition)
{
- Error = LogicalPartitionCreationChecks(PartitionList);
+ Error = LogicalPartitionCreationChecks(CurrentPartition);
if (Error != NOT_AN_ERROR)
{
MUIDisplayError(Error, Ir, POPUP_WAIT_ANY_KEY);
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */
{
- if (PartitionList->CurrentPartition->IsPartitioned == FALSE)
+ UNICODE_STRING CurrentPartitionU;
+ WCHAR PathBuffer[MAX_PATH];
+
+ ASSERT(CurrentPartition != NULL);
+
+ if (CurrentPartition->IsPartitioned == FALSE)
{
MUIDisplayError(ERROR_DELETE_SPACE, Ir, POPUP_WAIT_ANY_KEY);
return SELECT_PARTITION_PAGE;
}
- if (PartitionList->CurrentPartition->BootIndicator ||
- PartitionList->CurrentPartition == PartitionList->SystemPartition)
+// TODO: Do something similar before trying to format the partition?
+ if (!CurrentPartition->New &&
+ !IsContainerPartition(CurrentPartition->PartitionType) &&
+ CurrentPartition->FormatState != Unformatted)
+ {
+ ASSERT(CurrentPartition->PartitionNumber != 0);
+
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu\\",
+ CurrentPartition->DiskEntry->DiskNumber,
+ CurrentPartition->PartitionNumber);
+ RtlInitUnicodeString(&CurrentPartitionU, 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(&CurrentPartitionU, &USetupData.SourcePath, TRUE))
+ {
+ PopupError("You cannot delete the partition containing the installation source!",
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
+ return SELECT_PARTITION_PAGE;
+ }
+ }
+
+// FIXME TODO: PartitionList->SystemPartition is not yet initialized!!!!
+ if (CurrentPartition == PartitionList->SystemPartition ||
+ CurrentPartition->BootIndicator)
{
return CONFIRM_DELETE_SYSTEM_PARTITION_PAGE;
}
#define PARTITION_SIZE_INPUT_FIELD_LENGTH 9
-/* Restriction for MaxSize: pow(10, (PARTITION_SIZE_INPUT_FIELD_LENGTH - 1)) - 1 */
+/* Restriction for MaxSize */
#define PARTITION_MAXSIZE (pow(10, (PARTITION_SIZE_INPUT_FIELD_LENGTH - 1)) - 1)
static VOID
static PAGE_NUMBER
CreatePrimaryPartitionPage(PINPUT_RECORD Ir)
{
- PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
+ PDISKENTRY DiskEntry;
BOOLEAN Quit;
BOOLEAN Cancel;
WCHAR InputBuffer[50];
ULONGLONG SectorCount;
PCHAR Unit;
- if (PartitionList == NULL ||
- PartitionList->CurrentDisk == NULL ||
- PartitionList->CurrentPartition == NULL)
+ if (PartitionList == NULL || CurrentPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
- DiskEntry = PartitionList->CurrentDisk;
- PartEntry = PartitionList->CurrentPartition;
+ PartEntry = CurrentPartition;
+ DiskEntry = CurrentPartition->DiskEntry;
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
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;
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
else
{
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
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);
+ CurrentPartition->SectorCount * DiskEntry->BytesPerSector / MB);
#endif
CONSOLE_SetStatusText(MUIGetString(STRING_CREATEPARTITION));
- PartEntry = PartitionList->CurrentPartition;
+ PartEntry = 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
{
/* 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)
DPRINT ("Partition size: %I64u bytes\n", PartSize);
CreatePrimaryPartition(PartitionList,
+ CurrentPartition,
SectorCount,
FALSE);
static PAGE_NUMBER
CreateExtendedPartitionPage(PINPUT_RECORD Ir)
{
- PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
+ PDISKENTRY DiskEntry;
BOOLEAN Quit;
BOOLEAN Cancel;
WCHAR InputBuffer[50];
ULONGLONG SectorCount;
PCHAR Unit;
- if (PartitionList == NULL ||
- PartitionList->CurrentDisk == NULL ||
- PartitionList->CurrentPartition == NULL)
+ if (PartitionList == NULL || CurrentPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
- DiskEntry = PartitionList->CurrentDisk;
- PartEntry = PartitionList->CurrentPartition;
+ PartEntry = CurrentPartition;
+ DiskEntry = CurrentPartition->DiskEntry;
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
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;
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
else
{
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
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);
+ CurrentPartition->SectorCount * DiskEntry->BytesPerSector / MB);
#endif
CONSOLE_SetStatusText(MUIGetString(STRING_CREATEPARTITION));
- PartEntry = PartitionList->CurrentPartition;
+ PartEntry = 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
{
/* 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)
DPRINT ("Partition size: %I64u bytes\n", PartSize);
CreateExtendedPartition(PartitionList,
+ CurrentPartition,
SectorCount);
return SELECT_PARTITION_PAGE;
static PAGE_NUMBER
CreateLogicalPartitionPage(PINPUT_RECORD Ir)
{
- PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
+ PDISKENTRY DiskEntry;
BOOLEAN Quit;
BOOLEAN Cancel;
WCHAR InputBuffer[50];
ULONGLONG SectorCount;
PCHAR Unit;
- if (PartitionList == NULL ||
- PartitionList->CurrentDisk == NULL ||
- PartitionList->CurrentPartition == NULL)
+ if (PartitionList == NULL || CurrentPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
- DiskEntry = PartitionList->CurrentDisk;
- PartEntry = PartitionList->CurrentPartition;
+ PartEntry = CurrentPartition;
+ DiskEntry = CurrentPartition->DiskEntry;
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
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;
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
else
{
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
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);
+ CurrentPartition->SectorCount * DiskEntry->BytesPerSector / MB);
#endif
CONSOLE_SetStatusText(MUIGetString(STRING_CREATEPARTITION));
- PartEntry = PartitionList->CurrentPartition;
+ PartEntry = 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
{
/* 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)
DPRINT("Partition size: %I64u bytes\n", PartSize);
CreateLogicalPartition(PartitionList,
+ CurrentPartition,
SectorCount,
FALSE);
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;
static PAGE_NUMBER
DeletePartitionPage(PINPUT_RECORD Ir)
{
- PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
+ PDISKENTRY DiskEntry;
ULONGLONG DiskSize;
ULONGLONG PartSize;
PCHAR Unit;
CHAR PartTypeString[32];
- if (PartitionList == NULL ||
- PartitionList->CurrentDisk == NULL ||
- PartitionList->CurrentPartition == NULL)
+ if (PartitionList == NULL || CurrentPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
- DiskEntry = PartitionList->CurrentDisk;
- PartEntry = PartitionList->CurrentPartition;
+ PartEntry = CurrentPartition;
+ DiskEntry = CurrentPartition->DiskEntry;
MUIDisplayPage(DELETE_PARTITION_PAGE);
+ /* Adjust partition type */
GetPartTypeStringFromPartitionType(PartEntry->PartitionType,
PartTypeString,
ARRAYSIZE(PartTypeString));
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);
}
{
CONSOLE_PrintTextXY(6, 10,
MUIGetString(STRING_HDDINFOUNK2),
- (PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
+ (PartEntry->DriveLetter == 0) ? '-' : (CHAR)PartEntry->DriveLetter,
(PartEntry->DriveLetter == 0) ? '-' : ':',
PartEntry->PartitionType,
PartSize,
{
CONSOLE_PrintTextXY(6, 10,
" %c%c %s %I64u %s",
- (PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
+ (PartEntry->DriveLetter == 0) ? '-' : (CHAR)PartEntry->DriveLetter,
(PartEntry->DriveLetter == 0) ? '-' : ':',
PartTypeString,
PartSize,
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;
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
else
{
DiskEntry->Port,
DiskEntry->Bus,
DiskEntry->Id,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
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.wVirtualKeyCode == 'D') /* D */
{
- DeleteCurrentPartition(PartitionList);
-
+ DeletePartition(PartitionList,
+ CurrentPartition,
+ &CurrentPartition);
return SELECT_PARTITION_PAGE;
}
}
}
+static VOID
+ResetFileSystemList(VOID)
+{
+ if (!FileSystemList)
+ return;
+
+ DestroyFileSystemList(FileSystemList);
+ FileSystemList = NULL;
+}
+
/*
* Displays the SelectFileSystemPage.
*
* 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
*
* SIDEEFFECTS
- * Sets PartEntry->DiskEntry->LayoutBuffer->PartitionEntry[PartEntry->PartitionIndex].PartitionType (via UpdatePartitionType)
+ * Calls UpdatePartitionType()
* Calls CheckActiveSystemPartition()
*
* RETURNS
static PAGE_NUMBER
SelectFileSystemPage(PINPUT_RECORD Ir)
{
- PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
+ PDISKENTRY DiskEntry;
ULONGLONG DiskSize;
ULONGLONG PartSize;
PCHAR DiskUnit;
PCHAR PartUnit;
CHAR PartTypeString[32];
FORMATMACHINESTATE PreviousFormatState;
+ PCWSTR DefaultFs;
DPRINT("SelectFileSystemPage()\n");
- if (PartitionList == NULL ||
- PartitionList->CurrentDisk == NULL ||
- PartitionList->CurrentPartition == NULL)
+ if (PartitionList == NULL || InstallPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
- /* Find or set the active system partition */
- CheckActiveSystemPartition(PartitionList);
- if (PartitionList->SystemPartition == NULL)
+ /* Find or set the active system partition when starting formatting */
+ if (FormatState == Start)
{
- /* 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;
+ /* Find or set the active system partition */
+ CheckActiveSystemPartition(PartitionList,
+ FALSE,
+ InstallPartition->DiskEntry,
+ InstallPartition);
+ 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;
+ }
+
+ /*
+ * If the system partition can be created in some
+ * non-partitioned space, create it now.
+ */
+ if (!PartitionList->SystemPartition->IsPartitioned)
+ {
+ // if (IsUnattendedSetup)
+ {
+ CreatePrimaryPartition(PartitionList,
+ PartitionList->SystemPartition,
+ 0LL, // PartitionList->SystemPartition->SectorCount.QuadPart,
+ TRUE);
+ ASSERT(PartitionList->SystemPartition->IsPartitioned);
+ }
+ // else
+ {
+ }
+ }
+
+ /* Commit all partition changes to all the disks */
+ if (!WritePartitionsToDisk(PartitionList))
+ {
+ DPRINT("WritePartitionsToDisk() failed\n");
+ MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
+
+ /*
+ * In all cases, whether or not we are going to perform a formatting,
+ * we must perform a filesystem check of both the system and the
+ * installation partitions.
+ */
+ InstallPartition->NeedsCheck = TRUE;
+ if (PartitionList->SystemPartition != InstallPartition)
+ PartitionList->SystemPartition->NeedsCheck = TRUE;
+
+ /*
+ * In case we just repair an existing installation, or make
+ * an unattended setup without formatting, just go to the
+ * filesystem check step.
+ */
+ if (RepairUpdateFlag)
+ return CHECK_FILE_SYSTEM_PAGE;
+
+ if (IsUnattendedSetup && !USetupData.FormatPartition)
+ return CHECK_FILE_SYSTEM_PAGE;
}
+ // ASSERT(PartitionList->SystemPartition->IsPartitioned);
+
+ /* Reset the filesystem list for each partition that is to be formatted */
+ ResetFileSystemList();
+
PreviousFormatState = FormatState;
switch (FormatState)
{
case Start:
{
- if (PartitionList->CurrentPartition != PartitionList->SystemPartition)
+ /*
+ * We start by formatting the system partition in case it is new
+ * (it didn't exist before) and is not the same as the installation
+ * partition. Otherwise we just require a filesystem check on it,
+ * and start by formatting the installation partition instead.
+ */
+
+ ASSERT(PartitionList->SystemPartition->IsPartitioned);
+
+ if ((PartitionList->SystemPartition != InstallPartition) &&
+ (PartitionList->SystemPartition->FormatState == Unformatted))
{
TempPartition = PartitionList->SystemPartition;
TempPartition->NeedsCheck = TRUE;
+ // TODO: Should we let the user using a custom file-system,
+ // or should we always use FAT(32) for it?
+ // For "compatibility", FAT(32) would be best indeed.
+
FormatState = FormatSystemPartition;
DPRINT1("FormatState: Start --> FormatSystemPartition\n");
}
else
{
- TempPartition = PartitionList->CurrentPartition;
+ TempPartition = InstallPartition;
TempPartition->NeedsCheck = TRUE;
+ if (PartitionList->SystemPartition != InstallPartition)
+ {
+ /* The system partition is separate, so it had better be formatted! */
+ ASSERT((PartitionList->SystemPartition->FormatState == Preformatted) ||
+ (PartitionList->SystemPartition->FormatState == Formatted));
+
+ /* Require a filesystem check on the system partition too */
+ PartitionList->SystemPartition->NeedsCheck = TRUE;
+ }
+
FormatState = FormatInstallPartition;
DPRINT1("FormatState: Start --> FormatInstallPartition\n");
}
case FormatSystemPartition:
{
- TempPartition = PartitionList->CurrentPartition;
+ TempPartition = InstallPartition;
TempPartition->NeedsCheck = TRUE;
FormatState = FormatInstallPartition;
}
case FormatInstallPartition:
+ case FormatOtherPartition:
{
if (GetNextUnformattedPartition(PartitionList,
NULL,
{
FormatState = FormatOtherPartition;
TempPartition->NeedsCheck = TRUE;
- DPRINT1("FormatState: FormatInstallPartition --> FormatOtherPartition\n");
+
+ if (FormatState == FormatInstallPartition)
+ DPRINT1("FormatState: FormatInstallPartition --> FormatOtherPartition\n");
+ else
+ DPRINT1("FormatState: FormatOtherPartition --> FormatOtherPartition\n");
}
else
{
FormatState = FormatDone;
- DPRINT1("FormatState: FormatInstallPartition --> FormatDone\n");
+
+ if (FormatState == FormatInstallPartition)
+ DPRINT1("FormatState: FormatInstallPartition --> FormatDone\n");
+ else
+ DPRINT1("FormatState: FormatOtherPartition --> FormatDone\n");
+
return CHECK_FILE_SYSTEM_PAGE;
}
break;
}
- case FormatOtherPartition:
+ case FormatDone:
{
- if (GetNextUnformattedPartition(PartitionList,
- NULL,
- &TempPartition))
- {
- FormatState = FormatOtherPartition;
- TempPartition->NeedsCheck = TRUE;
- DPRINT1("FormatState: FormatOtherPartition --> FormatOtherPartition\n");
- }
- else
- {
- FormatState = FormatDone;
- DPRINT1("FormatState: FormatOtherPartition --> FormatDone\n");
- return CHECK_FILE_SYSTEM_PAGE;
- }
- break;
+ DPRINT1("FormatState: FormatDone\n");
+ return CHECK_FILE_SYSTEM_PAGE;
}
default:
}
PartEntry = TempPartition;
- DiskEntry = PartEntry->DiskEntry;
+ DiskEntry = TempPartition->DiskEntry;
+
+ ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
/* 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 */
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);
}
PartTypeString,
ARRAYSIZE(PartTypeString));
- if (PartEntry->AutoCreate != FALSE)
+ MUIDisplayPage(SELECT_FILE_SYSTEM_PAGE);
+
+ if (PartEntry->AutoCreate)
{
CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_NEWPARTITION));
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
CONSOLE_SetTextXY(6, 12, MUIGetString(STRING_PARTFORMAT));
PartEntry->AutoCreate = FALSE;
}
- else if (PartEntry->New != FALSE)
+ else if (PartEntry->New)
{
switch (FormatState)
{
{
CONSOLE_PrintTextXY(8, 10,
MUIGetString(STRING_HDDINFOUNK4),
- (PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
+ (PartEntry->DriveLetter == 0) ? '-' : (CHAR)PartEntry->DriveLetter,
(PartEntry->DriveLetter == 0) ? '-' : ':',
PartEntry->PartitionType,
PartSize,
{
CONSOLE_PrintTextXY(8, 10,
"%c%c %s %I64u %s",
- (PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter,
+ (PartEntry->DriveLetter == 0) ? '-' : (CHAR)PartEntry->DriveLetter,
(PartEntry->DriveLetter == 0) ? '-' : ':',
PartTypeString,
PartSize,
DiskEntry->Bus,
DiskEntry->Id,
&DiskEntry->DriverName,
- DiskEntry->NoMbr ? "GPT" : "MBR");
+ DiskEntry->DiskStyle == PARTITION_STYLE_MBR ? "MBR" :
+ DiskEntry->DiskStyle == PARTITION_STYLE_GPT ? "GPT" :
+ "RAW");
}
- MUIDisplayPage(SELECT_FILE_SYSTEM_PAGE);
+ ASSERT(FileSystemList == NULL);
- if (FileSystemList == NULL)
+ if (IsUnattendedSetup)
{
- /* Create the file system list, and by default select the "FAT" file system */
- FileSystemList = CreateFileSystemList(6, 26, PartEntry->New, L"FAT");
- if (FileSystemList == NULL)
+ ASSERT(USetupData.FormatPartition);
+
+ switch (USetupData.FsType)
{
- /* FIXME: show an error dialog */
- return QUIT_PAGE;
+ /* 1 is for BtrFS */
+ case 1:
+ DefaultFs = L"BTRFS";
+ break;
+
+ /* If we don't understand input, default to FAT */
+ default:
+ DefaultFs = L"FAT";
+ break;
}
}
+ else
+ {
+ /* By default select the "FAT" file system */
+ DefaultFs = L"FAT";
+ }
- if (RepairUpdateFlag)
+ /* Create the file system list */
+ // TODO: Display only the FSes compatible with the selected partition!
+ FileSystemList = CreateFileSystemList(6, 26,
+ PartEntry->New ||
+ PartEntry->FormatState == Unformatted,
+ DefaultFs);
+ if (FileSystemList == NULL)
{
- return CHECK_FILE_SYSTEM_PAGE;
- //return SELECT_PARTITION_PAGE;
+ /* FIXME: show an error dialog */
+ return QUIT_PAGE;
}
if (IsUnattendedSetup)
{
- if (UnattendFormatPartition)
- {
- /*
- * 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;
+ ASSERT(USetupData.FormatPartition);
+ return FORMAT_PARTITION_PAGE;
}
DrawFileSystemList(FileSystemList);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
+ {
+ /* Reset the filesystem list */
+ ResetFileSystemList();
return QUIT_PAGE;
+ }
break;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */
{
+ /* Reset the formatter machine state */
+ TempPartition = NULL;
FormatState = Start;
+
+ /* Reset the filesystem list */
+ ResetFileSystemList();
+
return SELECT_PARTITION_PAGE;
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
if (!FileSystemList->Selected->FileSystem)
+ {
+ ASSERT(!TempPartition->New && TempPartition->FormatState != Unformatted);
+
+ /*
+ * Skip formatting this partition. We will also ignore
+ * filesystem checks on it, unless it is either the system
+ * or the installation partition.
+ */
+ if (TempPartition != PartitionList->SystemPartition &&
+ TempPartition != InstallPartition)
+ {
+ PartEntry->NeedsCheck = FALSE;
+ }
+
return SELECT_FILE_SYSTEM_PAGE;
+ }
else
+ {
+ /* Format this partition */
return FORMAT_PARTITION_PAGE;
+ }
}
}
* QuitPage
*
* SIDEEFFECTS
- * Sets PartitionList->CurrentPartition->FormatState
- * Sets DestinationRootPath
+ * Sets InstallPartition->FormatState
+ * Sets USetupData.DestinationRootPath
*
* RETURNS
* Number of the next page.
static PAGE_NUMBER
FormatPartitionPage(PINPUT_RECORD Ir)
{
- UNICODE_STRING PartitionRootPath;
- WCHAR PathBuffer[MAX_PATH];
- PDISKENTRY DiskEntry;
+ NTSTATUS Status;
PPARTENTRY PartEntry;
+ PDISKENTRY DiskEntry;
PFILE_SYSTEM_ITEM SelectedFileSystem;
- NTSTATUS Status;
+ UNICODE_STRING PartitionRootPath;
+ WCHAR PathBuffer[MAX_PATH];
+ CHAR Buffer[MAX_PATH];
#ifndef NDEBUG
ULONG Line;
}
PartEntry = TempPartition;
- DiskEntry = PartEntry->DiskEntry;
+ DiskEntry = TempPartition->DiskEntry;
+
+ ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
SelectedFileSystem = FileSystemList->Selected;
+ ASSERT(SelectedFileSystem && SelectedFileSystem->FileSystem);
while (TRUE)
{
if (!IsUnattendedSetup)
- {
CONSOLE_ConInKey(Ir);
- }
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit(Ir) != FALSE)
+ if (ConfirmQuit(Ir))
+ {
+ /* Reset the filesystem list */
+ ResetFileSystemList();
return QUIT_PAGE;
+ }
break;
}
if (!PreparePartitionForFormatting(PartEntry, SelectedFileSystem->FileSystem))
{
/* FIXME: show an error dialog */
+
+ /* Reset the filesystem list */
+ ResetFileSystemList();
+
return QUIT_PAGE;
}
#endif
/* Commit the partition changes to the disk */
- if (!WritePartitionsToDisk(PartitionList))
+ Status = WritePartitions(DiskEntry);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("WritePartitionsToDisk() failed\n");
+ DPRINT1("WritePartitions(disk %lu) failed, Status 0x%08lx\n",
+ DiskEntry->DiskNumber, Status);
+
MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER);
+
+ /* Reset the filesystem list */
+ ResetFileSystemList();
+
return QUIT_PAGE;
}
/* Set PartitionRootPath */
- StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
L"\\Device\\Harddisk%lu\\Partition%lu",
DiskEntry->DiskNumber,
PartEntry->PartitionNumber);
DPRINT("PartitionRootPath: %wZ\n", &PartitionRootPath);
/* Format the partition */
- if (SelectedFileSystem->FileSystem)
+ Status = FormatPartition(&PartitionRootPath,
+ SelectedFileSystem->FileSystem,
+ SelectedFileSystem->QuickFormat);
+ if (Status == STATUS_NOT_SUPPORTED)
{
- Status = FormatPartition(&PartitionRootPath,
- SelectedFileSystem);
- if (!NT_SUCCESS(Status))
+ sprintf(Buffer,
+ "Setup is currently unable to format a partition in %S.\n"
+ "\n"
+ " \x07 Press ENTER to continue Setup.\n"
+ " \x07 Press F3 to quit Setup.",
+ SelectedFileSystem->FileSystem);
+
+ PopupError(Buffer,
+ MUIGetString(STRING_QUITCONTINUE),
+ NULL, POPUP_WAIT_NONE);
+
+ while (TRUE)
{
- DPRINT1("FormatPartition() failed with status 0x%08lx\n", Status);
- MUIDisplayError(ERROR_FORMATTING_PARTITION, Ir, POPUP_WAIT_ANY_KEY, PathBuffer);
- return QUIT_PAGE;
+ CONSOLE_ConInKey(Ir);
+
+ if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00 &&
+ Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3) /* F3 */
+ {
+ if (ConfirmQuit(Ir))
+ {
+ /* Reset the filesystem list */
+ ResetFileSystemList();
+ return QUIT_PAGE;
+ }
+ else
+ {
+ return SELECT_FILE_SYSTEM_PAGE;
+ }
+ }
+ else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */
+ {
+ return SELECT_FILE_SYSTEM_PAGE;
+ }
}
+ }
+ else if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("FormatPartition() failed with status 0x%08lx\n", Status);
+ MUIDisplayError(ERROR_FORMATTING_PARTITION, Ir, POPUP_WAIT_ANY_KEY, PathBuffer);
+
+ /* Reset the filesystem list */
+ ResetFileSystemList();
- PartEntry->FormatState = Formatted;
- // PartEntry->FileSystem = FileSystem;
- PartEntry->New = FALSE;
+ return QUIT_PAGE;
}
+//
+// TODO: Here, call a partlist.c function that update the actual FS name
+// and the label fields of the volume.
+//
+ PartEntry->FormatState = Formatted;
+ // PartEntry->FileSystem = FileSystem;
+ PartEntry->New = FALSE;
+
#ifndef NDEBUG
CONSOLE_SetStatusText(" Done. Press any key ...");
CONSOLE_ConInKey(Ir);
static PAGE_NUMBER
CheckFileSystemPage(PINPUT_RECORD Ir)
{
- PFILE_SYSTEM CurrentFileSystem;
+ NTSTATUS Status;
+ PDISKENTRY DiskEntry;
+ PPARTENTRY PartEntry;
UNICODE_STRING PartitionRootPath;
WCHAR PathBuffer[MAX_PATH];
CHAR Buffer[MAX_PATH];
- PDISKENTRY DiskEntry;
- PPARTENTRY PartEntry;
- NTSTATUS Status;
if (PartitionList == NULL)
{
return INSTALL_DIRECTORY_PAGE;
}
- /* Set PartitionRootPath */
- StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
- L"\\Device\\Harddisk%lu\\Partition%lu",
- DiskEntry->DiskNumber,
- PartEntry->PartitionNumber);
- RtlInitUnicodeString(&PartitionRootPath, PathBuffer);
- DPRINT("PartitionRootPath: %wZ\n", &PartitionRootPath);
+ ASSERT(PartEntry->IsPartitioned && PartEntry->PartitionNumber != 0);
CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_CHECKINGPART));
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
- CurrentFileSystem = PartEntry->FileSystem;
- DPRINT1("CheckFileSystemPage -- PartitionType: 0x%02X ; FileSystemName: %S\n",
- PartEntry->PartitionType, (CurrentFileSystem ? CurrentFileSystem->FileSystemName : L"n/a"));
+ DPRINT1("CheckFileSystemPage -- PartitionType: 0x%02X ; FileSystem: %S\n",
+ PartEntry->PartitionType, (*PartEntry->FileSystem ? PartEntry->FileSystem : L"n/a"));
/* HACK: Do not try to check a partition with an unknown filesystem */
- if (CurrentFileSystem == NULL)
+ if (!*PartEntry->FileSystem)
{
PartEntry->NeedsCheck = FALSE;
return CHECK_FILE_SYSTEM_PAGE;
}
- if (CurrentFileSystem->ChkdskFunc == NULL)
+ /* Set PartitionRootPath */
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ DiskEntry->DiskNumber,
+ PartEntry->PartitionNumber);
+ RtlInitUnicodeString(&PartitionRootPath, PathBuffer);
+ DPRINT("PartitionRootPath: %wZ\n", &PartitionRootPath);
+
+ /* Check the partition */
+ Status = ChkdskPartition(&PartitionRootPath, PartEntry->FileSystem);
+ if (Status == STATUS_NOT_SUPPORTED)
{
+ /*
+ * Partition checking is not supported with the current filesystem,
+ * so disable FS checks on it.
+ */
+ PartEntry->NeedsCheck = FALSE;
+
sprintf(Buffer,
"Setup is currently unable to check a partition formatted in %S.\n"
"\n"
" \x07 Press ENTER to continue Setup.\n"
" \x07 Press F3 to quit Setup.",
- CurrentFileSystem->FileSystemName);
+ PartEntry->FileSystem);
PopupError(Buffer,
MUIGetString(STRING_QUITCONTINUE),
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */
{
- PartEntry->NeedsCheck = FALSE;
return CHECK_FILE_SYSTEM_PAGE;
}
}
}
- else
+ else if (!NT_SUCCESS(Status))
{
- Status = ChkdskPartition(&PartitionRootPath, CurrentFileSystem);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("ChkdskPartition() failed with status 0x%08lx\n", Status);
- // sprintf(Buffer, "Setup failed to verify the selected partition.\n"
- sprintf(Buffer, "ChkDsk detected some disk errors.\n"
- "(Status 0x%08lx).\n", Status);
- PopupError(Buffer,
- // MUIGetString(STRING_REBOOTCOMPUTER),
- MUIGetString(STRING_CONTINUE),
- Ir, POPUP_WAIT_ENTER);
-
- // return QUIT_PAGE;
- }
+ DPRINT("ChkdskPartition() failed with status 0x%08lx\n", Status);
+ // sprintf(Buffer, "Setup failed to verify the selected partition.\n"
+ sprintf(Buffer, "ChkDsk detected some disk errors.\n"
+ "(Status 0x%08lx).\n", Status);
+ PopupError(Buffer,
+ // MUIGetString(STRING_REBOOTCOMPUTER),
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
- PartEntry->NeedsCheck = FALSE;
- return CHECK_FILE_SYSTEM_PAGE;
+ // return QUIT_PAGE;
}
+
+ PartEntry->NeedsCheck = FALSE;
+ return CHECK_FILE_SYSTEM_PAGE;
}
-static VOID
-BuildInstallPaths(PWSTR InstallDir,
- PDISKENTRY DiskEntry,
- PPARTENTRY PartEntry)
+static NTSTATUS
+BuildInstallPaths(
+ IN PCWSTR InstallDir,
+ IN PPARTENTRY PartEntry)
{
- WCHAR PathBuffer[MAX_PATH];
+ NTSTATUS Status;
- /* Create 'InstallPath' string */
- RtlFreeUnicodeString(&InstallPath);
- RtlCreateUnicodeString(&InstallPath, InstallDir);
+ Status = InitDestinationPaths(&USetupData, InstallDir, PartEntry);
- /* Create 'DestinationRootPath' string */
- RtlFreeUnicodeString(&DestinationRootPath);
- StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
- L"\\Device\\Harddisk%lu\\Partition%lu\\",
- DiskEntry->DiskNumber,
- PartEntry->PartitionNumber);
- RtlCreateUnicodeString(&DestinationRootPath, PathBuffer);
- DPRINT("DestinationRootPath: %wZ\n", &DestinationRootPath);
-
- /* Create 'DestinationPath' string */
- RtlFreeUnicodeString(&DestinationPath);
- CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
- DestinationRootPath.Buffer, InstallDir);
- RtlCreateUnicodeString(&DestinationPath, PathBuffer);
-
- /* Create 'DestinationArcPath' */
- RtlFreeUnicodeString(&DestinationArcPath);
- StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
- L"multi(0)disk(0)rdisk(%lu)partition(%lu)\\",
- DiskEntry->BiosDiskNumber,
- PartEntry->PartitionNumber);
- ConcatPaths(PathBuffer, ARRAYSIZE(PathBuffer), 1, InstallDir);
- RtlCreateUnicodeString(&DestinationArcPath, PathBuffer);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("InitDestinationPaths() failed with status 0x%08lx\n", Status);
+ return Status;
+ }
/* Initialize DestinationDriveLetter */
- DestinationDriveLetter = (WCHAR)PartEntry->DriveLetter;
+ DestinationDriveLetter = PartEntry->DriveLetter;
+
+ return STATUS_SUCCESS;
+}
+
+
+static BOOLEAN
+IsValidPath(
+ IN PCWSTR InstallDir)
+{
+ UINT i, Length;
+
+ Length = wcslen(InstallDir);
+
+ // TODO: Add check for 8.3 too.
+
+ /* Path must be at least 2 characters long */
+// if (Length < 2)
+// return FALSE;
+
+ /* Path must start with a backslash */
+// if (InstallDir[0] != L'\\')
+// return FALSE;
+
+ /* Path must not end with a backslash */
+ if (InstallDir[Length - 1] == L'\\')
+ return FALSE;
+
+ /* Path must not contain whitespace characters */
+ for (i = 0; i < Length; i++)
+ {
+ if (iswspace(InstallDir[i]))
+ return FALSE;
+ }
+
+ /* Path component must not end with a dot */
+ for (i = 0; i < Length; i++)
+ {
+ if (InstallDir[i] == L'\\' && i > 0)
+ {
+ if (InstallDir[i - 1] == L'.')
+ return FALSE;
+ }
+ }
+
+ if (InstallDir[Length - 1] == L'.')
+ return FALSE;
+
+ return TRUE;
}
* Displays the InstallDirectoryPage.
*
* Next pages:
- * PrepareCopyPage (As the direct result of InstallDirectoryPage1)
+ * PrepareCopyPage
* QuitPage
*
* RETURNS
static PAGE_NUMBER
InstallDirectoryPage(PINPUT_RECORD Ir)
{
- PDISKENTRY DiskEntry;
- PPARTENTRY PartEntry;
- WCHAR InstallDir[51];
- WCHAR c;
+ NTSTATUS Status;
ULONG Length, Pos;
+ WCHAR c;
+ WCHAR InstallDir[MAX_PATH];
- /* We do not need the filesystem list any more */
- if (FileSystemList != NULL)
- {
- DestroyFileSystemList(FileSystemList);
- FileSystemList = NULL;
- }
+ /* We do not need the filesystem list anymore */
+ ResetFileSystemList();
- if (PartitionList == NULL ||
- PartitionList->CurrentDisk == NULL ||
- PartitionList->CurrentPartition == NULL)
+ if (PartitionList == NULL || InstallPartition == NULL)
{
/* FIXME: show an error dialog */
return QUIT_PAGE;
}
- DiskEntry = PartitionList->CurrentDisk;
- PartEntry = PartitionList->CurrentPartition;
-
-#if 0
+ // if (IsUnattendedSetup)
if (RepairUpdateFlag)
+ wcscpy(InstallDir, CurrentInstallation->PathComponent); // SystemNtPath
+ else if (USetupData.InstallationDirectory[0])
+ wcscpy(InstallDir, USetupData.InstallationDirectory);
+ else
+ wcscpy(InstallDir, L"\\ReactOS");
+
+ /*
+ * 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))
{
- if (!IsValidPath(CurrentInstallation->PathComponent)) // SystemNtPath
+ Status = BuildInstallPaths(InstallDir, InstallPartition);
+ if (!NT_SUCCESS(Status))
{
- /* FIXME: Log the error? */
+ DPRINT1("BuildInstallPaths() failed. Status code: 0x%lx", Status);
+ PopupError("Failed to build the installation paths for the ReactOS installation directory!",
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
- BuildInstallPaths(CurrentInstallation->PathComponent, // SystemNtPath
- DiskEntry,
- PartEntry);
-
- return PREPARE_COPY_PAGE;
- }
-#endif
- if (IsUnattendedSetup)
- {
- if (!IsValidPath(UnattendInstallationDirectory))
+ /*
+ * 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))
{
- /* FIXME: Log the error? */
- return QUIT_PAGE;
+ PopupError("You cannot install ReactOS within the installation source directory!",
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
+ return INSTALL_DIRECTORY_PAGE;
}
- BuildInstallPaths(UnattendInstallationDirectory,
- DiskEntry,
- PartEntry);
-
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);
return INSTALL_DIRECTORY_PAGE;
}
- BuildInstallPaths(InstallDir,
- DiskEntry,
- PartEntry);
+ Status = BuildInstallPaths(InstallDir, InstallPartition);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("BuildInstallPaths() failed. Status code: 0x%lx", Status);
+ PopupError("Failed to build the installation paths for the ReactOS installation directory!",
+ MUIGetString(STRING_CONTINUE),
+ Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
+
+ /*
+ * 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;
}
}
-static BOOLEAN
-AddSectionToCopyQueueCab(HINF InfFile,
- PWCHAR SectionName,
- PWCHAR SourceCabinet,
- PCUNICODE_STRING DestinationPath,
- PINPUT_RECORD Ir)
-{
- INFCONTEXT FilesContext;
- INFCONTEXT DirContext;
- PWCHAR FileKeyName;
- PWCHAR FileKeyValue;
- 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];
- 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.
- */
- do
- {
- /* Get source file name and target directory id */
- if (!INF_GetData(&FilesContext, &FileKeyName, &FileKeyValue))
- {
- /* FIXME: Handle error! */
- DPRINT1("INF_GetData() failed\n");
- break;
- }
-
- /* Get optional target file name */
- if (!INF_GetDataField(&FilesContext, 2, &TargetFileName))
- TargetFileName = NULL;
-
- DPRINT("FileKeyName: '%S' FileKeyValue: '%S'\n", FileKeyName, FileKeyValue);
-
- /* Lookup target directory */
- if (!SetupFindFirstLineW(InfFile, L"Directories", FileKeyValue, &DirContext))
- {
- /* FIXME: Handle error! */
- DPRINT1("SetupFindFirstLine() failed\n");
- break;
- }
-
- if (!INF_GetData(&DirContext, NULL, &DirKeyValue))
- {
- /* FIXME: Handle error! */
- DPRINT1("INF_GetData() failed\n");
- break;
- }
-
- if (!SetupQueueCopy(SetupFileQueue,
- SourceCabinet,
- SourceRootPath.Buffer,
- SourceRootDir.Buffer,
- FileKeyName,
- DirKeyValue,
- TargetFileName))
- {
- /* FIXME: Handle error! */
- DPRINT1("SetupQueueCopy() failed\n");
- }
- } while (SetupFindNextLine(&FilesContext, &FilesContext));
-
- return TRUE;
-}
-
-
-static BOOLEAN
-AddSectionToCopyQueue(HINF InfFile,
- PWCHAR SectionName,
- PWCHAR SourceCabinet,
- PCUNICODE_STRING DestinationPath,
- PINPUT_RECORD Ir)
-{
- INFCONTEXT FilesContext;
- INFCONTEXT DirContext;
- PWCHAR FileKeyName;
- PWCHAR FileKeyValue;
- PWCHAR DirKeyValue;
- PWCHAR TargetFileName;
- 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];
- 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.
- */
- do
- {
- /* Get source file name and target directory id */
- if (!INF_GetData(&FilesContext, &FileKeyName, &FileKeyValue))
- {
- /* FIXME: Handle error! */
- DPRINT1("INF_GetData() failed\n");
- break;
- }
-
- /* Get target directory id */
- if (!INF_GetDataField(&FilesContext, 13, &FileKeyValue))
- {
- /* FIXME: Handle error! */
- DPRINT1("INF_GetData() failed\n");
- break;
- }
-
- /* Get optional target file name */
- if (!INF_GetDataField(&FilesContext, 11, &TargetFileName))
- TargetFileName = NULL;
- else if (!*TargetFileName)
- TargetFileName = NULL;
-
- DPRINT("FileKeyName: '%S' FileKeyValue: '%S'\n", FileKeyName, FileKeyValue);
-
- /* Lookup target directory */
- if (!SetupFindFirstLineW(InfFile, L"Directories", FileKeyValue, &DirContext))
- {
- /* FIXME: Handle error! */
- DPRINT1("SetupFindFirstLine() failed\n");
- break;
- }
-
- if (!INF_GetData(&DirContext, NULL, &DirKeyValue))
- {
- /* FIXME: Handle error! */
- DPRINT1("INF_GetData() failed\n");
- break;
- }
-
- if ((DirKeyValue[0] == UNICODE_NULL) || (DirKeyValue[0] == L'\\' && DirKeyValue[1] == UNICODE_NULL))
- {
- /* Installation path */
- DPRINT("InstallationPath: '%S'\n", DirKeyValue);
-
- StringCchCopyW(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName),
- SourceRootDir.Buffer);
-
- DPRINT("InstallationPath(2): '%S'\n", CompleteOrigDirName);
- }
- else if (DirKeyValue[0] == L'\\')
- {
- /* Absolute path */
- DPRINT("AbsolutePath: '%S'\n", DirKeyValue);
-
- StringCchCopyW(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName),
- DirKeyValue);
-
- DPRINT("AbsolutePath(2): '%S'\n", CompleteOrigDirName);
- }
- else // if (DirKeyValue[0] != L'\\')
- {
- /* Path relative to the installation path */
- DPRINT("RelativePath: '%S'\n", DirKeyValue);
-
- CombinePaths(CompleteOrigDirName, ARRAYSIZE(CompleteOrigDirName), 2,
- SourceRootDir.Buffer, DirKeyValue);
-
- DPRINT("RelativePath(2): '%S'\n", CompleteOrigDirName);
- }
-
- if (!SetupQueueCopy(SetupFileQueue,
- SourceCabinet,
- SourceRootPath.Buffer,
- CompleteOrigDirName,
- FileKeyName,
- DirKeyValue,
- TargetFileName))
- {
- /* FIXME: Handle error! */
- DPRINT1("SetupQueueCopy() failed\n");
- }
- } while (SetupFindNextLine(&FilesContext, &FilesContext));
-
- return TRUE;
-}
-
-
-static BOOLEAN
-PrepareCopyPageInfFile(HINF InfFile,
- PWCHAR SourceCabinet,
- PINPUT_RECORD Ir)
-{
- NTSTATUS Status;
- INFCONTEXT DirContext;
- PWCHAR AdditionalSectionName = NULL;
- PWCHAR DirKeyValue;
- WCHAR PathBuffer[MAX_PATH];
-
- /* Add common files */
- if (!AddSectionToCopyQueue(InfFile, L"SourceDisksFiles", SourceCabinet, &DestinationPath, Ir))
- return FALSE;
-
- /* Add specific files depending of computer type */
- if (SourceCabinet == NULL)
- {
- if (!ProcessComputerFiles(InfFile, ComputerList, &AdditionalSectionName))
- return FALSE;
-
- if (AdditionalSectionName)
- {
- if (!AddSectionToCopyQueue(InfFile, AdditionalSectionName, SourceCabinet, &DestinationPath, Ir))
- return FALSE;
- }
- }
-
- /* Create directories */
-
- /*
- * FIXME:
- * Copying files to DestinationRootPath should be done from within
- * the SystemPartitionFiles section.
- * At the moment we check whether we specify paths like '\foo' or '\\' for that.
- * For installing to DestinationPath specify just '\' .
- */
-
- /* Get destination path */
- StringCchCopyW(PathBuffer, ARRAYSIZE(PathBuffer), DestinationPath.Buffer);
-
- 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\n", PathBuffer, Status);
- MUIDisplayError(ERROR_CREATE_INSTALL_DIR, Ir, POPUP_WAIT_ENTER);
- return FALSE;
- }
-
- /* Search for the 'Directories' section */
- if (!SetupFindFirstLineW(InfFile, L"Directories", NULL, &DirContext))
- {
- if (SourceCabinet)
- {
- MUIDisplayError(ERROR_CABINET_SECTION, Ir, POPUP_WAIT_ENTER);
- }
- else
- {
- MUIDisplayError(ERROR_TXTSETUP_SECTION, Ir, POPUP_WAIT_ENTER);
- }
-
- return FALSE;
- }
-
- /* Enumerate the directory values and create the subdirectories */
- do
- {
- if (!INF_GetData(&DirContext, NULL, &DirKeyValue))
- {
- DPRINT1("break\n");
- break;
- }
-
- if ((DirKeyValue[0] == UNICODE_NULL) || (DirKeyValue[0] == L'\\' && DirKeyValue[1] == UNICODE_NULL))
- {
- /* Installation path */
- DPRINT("InstallationPath: '%S'\n", DirKeyValue);
-
- StringCchCopyW(PathBuffer, ARRAYSIZE(PathBuffer),
- DestinationPath.Buffer);
-
- DPRINT("InstallationPath(2): '%S'\n", PathBuffer);
- }
- else if (DirKeyValue[0] == L'\\')
- {
- /* Absolute path */
- DPRINT("AbsolutePath: '%S'\n", DirKeyValue);
-
- CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
- DestinationRootPath.Buffer, DirKeyValue);
-
- DPRINT("AbsolutePath(2): '%S'\n", PathBuffer);
-
- Status = SetupCreateDirectory(PathBuffer);
- if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
- {
- DPRINT("Creating directory '%S' failed: Status = 0x%08lx", PathBuffer, Status);
- MUIDisplayError(ERROR_CREATE_DIR, Ir, POPUP_WAIT_ENTER);
- return FALSE;
- }
- }
- else // if (DirKeyValue[0] != L'\\')
- {
- /* Path relative to the installation path */
- DPRINT("RelativePath: '%S'\n", DirKeyValue);
-
- CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
- DestinationPath.Buffer, DirKeyValue);
-
- DPRINT("RelativePath(2): '%S'\n", PathBuffer);
-
- Status = SetupCreateDirectory(PathBuffer);
- if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_COLLISION)
- {
- DPRINT("Creating directory '%S' failed: Status = 0x%08lx", PathBuffer, Status);
- MUIDisplayError(ERROR_CREATE_DIR, Ir, POPUP_WAIT_ENTER);
- return FALSE;
- }
- }
- } while (SetupFindNextLine(&DirContext, &DirContext));
-
- return TRUE;
-}
-
-
-/*
- * Displays the PrepareCopyPage.
- *
- * Next pages:
- * FileCopyPage(At once)
- * QuitPage
- *
- * SIDEEFFECTS
- * Inits SetupFileQueue
- * Calls PrepareCopyPageInfFile
- *
- * RETURNS
- * Number of the next page.
- */
-static PAGE_NUMBER
-PrepareCopyPage(PINPUT_RECORD Ir)
+// PSETUP_ERROR_ROUTINE
+static VOID
+__cdecl
+USetupErrorRoutine(
+ IN PUSETUP_DATA pSetupData,
+ ...)
{
- HINF InfHandle;
- WCHAR PathBuffer[MAX_PATH];
- INFCONTEXT CabinetsContext;
- ULONG InfFileSize;
- PWCHAR KeyValue;
- UINT ErrorLine;
- PVOID InfFileData;
-
- MUIDisplayPage(PREPARE_COPY_PAGE);
-
- /* Create the file queue */
- SetupFileQueue = SetupOpenFileQueue();
- if (SetupFileQueue == NULL)
- {
- MUIDisplayError(ERROR_COPY_QUEUE, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
-
- if (!PrepareCopyPageInfFile(SetupInf, NULL, Ir))
- {
- /* FIXME: show an error dialog */
- return QUIT_PAGE;
- }
-
- /* Search for the 'Cabinets' section */
- if (!SetupFindFirstLineW(SetupInf, L"Cabinets", NULL, &CabinetsContext))
- {
- return FILE_COPY_PAGE;
- }
-
- /*
- * Enumerate the directory values in the 'Cabinets'
- * section and parse their inf files.
- */
- do
- {
- if (!INF_GetData(&CabinetsContext, NULL, &KeyValue))
- break;
-
- CombinePaths(PathBuffer, ARRAYSIZE(PathBuffer), 2,
- SourcePath.Buffer, KeyValue);
-
- CabinetInitialize();
- CabinetSetEventHandlers(NULL, NULL, NULL);
- CabinetSetCabinetName(PathBuffer);
-
- if (CabinetOpen() == CAB_STATUS_SUCCESS)
- {
- DPRINT("Cabinet %S\n", CabinetGetCabinetName());
-
- InfFileData = CabinetGetCabinetReservedArea(&InfFileSize);
- if (InfFileData == NULL)
- {
- MUIDisplayError(ERROR_CABINET_SCRIPT, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
- }
- else
- {
- DPRINT("Cannot open cabinet: %S.\n", CabinetGetCabinetName());
- MUIDisplayError(ERROR_CABINET_MISSING, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
+ INPUT_RECORD Ir;
+ va_list arg_ptr;
- InfHandle = INF_OpenBufferedFileA((CHAR*) InfFileData,
- InfFileSize,
- (const CHAR*) NULL,
- INF_STYLE_WIN4,
- LanguageId,
- &ErrorLine);
+ va_start(arg_ptr, pSetupData);
- if (InfHandle == INVALID_HANDLE_VALUE)
- {
- MUIDisplayError(ERROR_INVALID_CABINET_INF, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
+ if (pSetupData->LastErrorNumber >= ERROR_SUCCESS &&
+ pSetupData->LastErrorNumber < ERROR_LAST_ERROR_CODE)
+ {
+ // Note: the "POPUP_WAIT_ENTER" actually depends on the LastErrorNumber...
+ MUIDisplayErrorV(pSetupData->LastErrorNumber, &Ir, POPUP_WAIT_ENTER, arg_ptr);
+ }
- CabinetCleanup();
+ va_end(arg_ptr);
+}
- if (!PrepareCopyPageInfFile(InfHandle, KeyValue, Ir))
- {
- /* FIXME: show an error dialog */
- return QUIT_PAGE;
- }
- } while (SetupFindNextLine(&CabinetsContext, &CabinetsContext));
+/*
+ * Displays the PrepareCopyPage.
+ *
+ * Next pages:
+ * FileCopyPage(At once)
+ * QuitPage
+ *
+ * SIDEEFFECTS
+ * Calls PrepareFileCopy
+ *
+ * RETURNS
+ * Number of the next page.
+ */
+static PAGE_NUMBER
+PrepareCopyPage(PINPUT_RECORD Ir)
+{
+ // ERROR_NUMBER ErrorNumber;
+ BOOLEAN Success;
+
+ MUIDisplayPage(PREPARE_COPY_PAGE);
+
+ /* ErrorNumber = */ Success = PrepareFileCopy(&USetupData, NULL);
+ if (/*ErrorNumber != ERROR_SUCCESS*/ !Success)
+ {
+ // MUIDisplayError(ErrorNumber, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
return FILE_COPY_PAGE;
}
+typedef struct _COPYCONTEXT
+{
+ ULONG TotalOperations;
+ ULONG CompletedOperations;
+ PPROGRESSBAR ProgressBar;
+ PPROGRESSBAR MemoryBars[4];
+} COPYCONTEXT, *PCOPYCONTEXT;
-VOID
-NTAPI
+static VOID
SetupUpdateMemoryInfo(IN PCOPYCONTEXT CopyContext,
IN BOOLEAN First)
{
ProgressSetStep(CopyContext->MemoryBars[2], PerfInfo.AvailablePages);
}
-
static UINT
CALLBACK
FileCopyCallback(PVOID Context,
UINT_PTR Param1,
UINT_PTR Param2)
{
- PCOPYCONTEXT CopyContext;
-
- CopyContext = (PCOPYCONTEXT)Context;
+ PCOPYCONTEXT CopyContext = (PCOPYCONTEXT)Context;
+ PFILEPATHS_W FilePathInfo;
+ PCWSTR SrcFileName, DstFileName;
switch (Notification)
{
case SPFILENOTIFY_STARTSUBQUEUE:
+ {
CopyContext->TotalOperations = (ULONG)Param2;
+ CopyContext->CompletedOperations = 0;
ProgressSetStepCount(CopyContext->ProgressBar,
CopyContext->TotalOperations);
SetupUpdateMemoryInfo(CopyContext, TRUE);
break;
+ }
+ case SPFILENOTIFY_STARTDELETE:
+ case SPFILENOTIFY_STARTRENAME:
case SPFILENOTIFY_STARTCOPY:
- /* Display copy message */
- CONSOLE_SetStatusText(MUIGetString(STRING_COPYING), (PWSTR)Param1);
+ {
+ FilePathInfo = (PFILEPATHS_W)Param1;
+
+ if (Notification == SPFILENOTIFY_STARTDELETE)
+ {
+ /* Display delete message */
+ ASSERT(Param2 == FILEOP_DELETE);
+
+ DstFileName = wcsrchr(FilePathInfo->Target, L'\\');
+ if (DstFileName) ++DstFileName;
+ else DstFileName = FilePathInfo->Target;
+
+ CONSOLE_SetStatusText(MUIGetString(STRING_DELETING),
+ DstFileName);
+ }
+ else if (Notification == SPFILENOTIFY_STARTRENAME)
+ {
+ /* Display move/rename message */
+ ASSERT(Param2 == FILEOP_RENAME);
+
+ SrcFileName = wcsrchr(FilePathInfo->Source, L'\\');
+ if (SrcFileName) ++SrcFileName;
+ else SrcFileName = FilePathInfo->Source;
+
+ DstFileName = wcsrchr(FilePathInfo->Target, L'\\');
+ if (DstFileName) ++DstFileName;
+ else DstFileName = FilePathInfo->Target;
+
+ if (!wcsicmp(SrcFileName, DstFileName))
+ Param2 = STRING_MOVING;
+ else
+ Param2 = STRING_RENAMING;
+
+ CONSOLE_SetStatusText(MUIGetString(Param2),
+ SrcFileName, DstFileName);
+ }
+ else if (Notification == SPFILENOTIFY_STARTCOPY)
+ {
+ /* Display copy message */
+ ASSERT(Param2 == FILEOP_COPY);
+
+ /* NOTE: When extracting from CABs the Source is the CAB name */
+ DstFileName = wcsrchr(FilePathInfo->Target, L'\\');
+ if (DstFileName) ++DstFileName;
+ else DstFileName = FilePathInfo->Target;
+
+ CONSOLE_SetStatusText(MUIGetString(STRING_COPYING),
+ DstFileName);
+ }
+
SetupUpdateMemoryInfo(CopyContext, FALSE);
break;
+ }
+
+ case SPFILENOTIFY_COPYERROR:
+ {
+ FilePathInfo = (PFILEPATHS_W)Param1;
+
+ DPRINT1("An error happened while trying to copy file '%S' (error 0x%08lx), skipping it...\n",
+ FilePathInfo->Target, FilePathInfo->Win32Error);
+ return FILEOP_SKIP;
+ }
+ case SPFILENOTIFY_ENDDELETE:
+ case SPFILENOTIFY_ENDRENAME:
case SPFILENOTIFY_ENDCOPY:
+ {
CopyContext->CompletedOperations++;
/* SYSREG checkpoint */
ProgressNextStep(CopyContext->ProgressBar);
SetupUpdateMemoryInfo(CopyContext, FALSE);
break;
+ }
}
- return 0;
+ return FILEOP_DOIT;
}
* RegistryPage(At once)
*
* SIDEEFFECTS
- * Calls SetupCommitFileQueueW
- * Calls SetupCloseFileQueue
+ * Calls DoFileCopy
*
* RETURNS
* Number of the next page.
FileCopyPage(PINPUT_RECORD Ir)
{
COPYCONTEXT CopyContext;
- unsigned int mem_bar_width;
+ UINT MemBarWidth;
MUIDisplayPage(FILE_COPY_PAGE);
/* Create context for the copy process */
- CopyContext.DestinationRootPath = DestinationRootPath.Buffer;
- CopyContext.InstallPath = InstallPath.Buffer;
CopyContext.TotalOperations = 0;
CopyContext.CompletedOperations = 0;
MUIGetString(STRING_SETUPCOPYINGFILES));
// fit memory bars to screen width, distribute them uniform
- mem_bar_width = (xScreen - 26) / 5;
- mem_bar_width -= mem_bar_width % 2; // make even
+ MemBarWidth = (xScreen - 26) / 5;
+ MemBarWidth -= MemBarWidth % 2; // make even
/* ATTENTION: The following progress bars are debug stuff, which should not be translated!! */
/* Create the paged pool progress bar */
CopyContext.MemoryBars[0] = CreateProgressBar(13,
40,
- 13 + mem_bar_width,
+ 13 + MemBarWidth,
43,
13,
44,
"Kernel Pool");
/* Create the non paged pool progress bar */
- CopyContext.MemoryBars[1] = CreateProgressBar((xScreen / 2)- (mem_bar_width / 2),
+ CopyContext.MemoryBars[1] = CreateProgressBar((xScreen / 2)- (MemBarWidth / 2),
40,
- (xScreen / 2) + (mem_bar_width / 2),
+ (xScreen / 2) + (MemBarWidth / 2),
43,
- (xScreen / 2)- (mem_bar_width / 2),
+ (xScreen / 2)- (MemBarWidth / 2),
44,
FALSE,
"Kernel Cache");
/* Create the global memory progress bar */
- CopyContext.MemoryBars[2] = CreateProgressBar(xScreen - 13 - mem_bar_width,
+ CopyContext.MemoryBars[2] = CreateProgressBar(xScreen - 13 - MemBarWidth,
40,
xScreen - 13,
43,
- xScreen - 13 - mem_bar_width,
+ xScreen - 13 - MemBarWidth,
44,
FALSE,
"Free Memory");
/* Do the file copying */
- SetupCommitFileQueueW(NULL,
- SetupFileQueue,
- FileCopyCallback,
- &CopyContext);
+ DoFileCopy(&USetupData, FileCopyCallback, &CopyContext);
- /* If we get here, we're done, so cleanup the queue and progress bar */
- SetupCloseFileQueue(SetupFileQueue);
+ /* If we get here, we're done, so cleanup the progress bar */
DestroyProgressBar(CopyContext.ProgressBar);
DestroyProgressBar(CopyContext.MemoryBars[0]);
DestroyProgressBar(CopyContext.MemoryBars[1]);
DestroyProgressBar(CopyContext.MemoryBars[2]);
+ /* Create the $winnt$.inf file */
+ InstallSetupInfFile(&USetupData);
+
/* Go display the next page */
return REGISTRY_PAGE;
}
+static VOID
+__cdecl
+RegistryStatus(IN REGISTRY_STATUS RegStatus, ...)
+{
+ /* WARNING: Please keep this lookup table in sync with the resources! */
+ static const UINT StringIDs[] =
+ {
+ STRING_DONE, /* Success */
+ STRING_REGHIVEUPDATE, /* RegHiveUpdate */
+ STRING_IMPORTFILE, /* ImportRegHive */
+ STRING_DISPLAYSETTINGSUPDATE, /* DisplaySettingsUpdate */
+ STRING_LOCALESETTINGSUPDATE, /* LocaleSettingsUpdate */
+ STRING_ADDKBLAYOUTS, /* KeybLayouts */
+ STRING_KEYBOARDSETTINGSUPDATE, /* KeybSettingsUpdate */
+ STRING_CODEPAGEINFOUPDATE, /* CodePageInfoUpdate */
+ };
+
+ va_list args;
+
+ if (RegStatus < ARRAYSIZE(StringIDs))
+ {
+ va_start(args, RegStatus);
+ CONSOLE_SetStatusTextV(MUIGetString(StringIDs[RegStatus]), args);
+ va_end(args);
+ }
+ else
+ {
+ CONSOLE_SetStatusText("Unknown status %d", RegStatus);
+ }
+}
+
/*
* Displays the RegistryPage.
*
* QuitPage
*
* SIDEEFFECTS
- * Calls RegInitializeRegistry
- * Calls ImportRegistryFile
- * Calls SetDefaultPagefile
- * Calls SetMountedDeviceValues
+ * Calls UpdateRegistry
*
* RETURNS
* Number of the next page.
static PAGE_NUMBER
RegistryPage(PINPUT_RECORD Ir)
{
- NTSTATUS Status;
- INFCONTEXT InfContext;
- PWSTR Action;
- PWSTR File;
- PWSTR Section;
- BOOLEAN Success;
- BOOLEAN ShouldRepairRegistry = FALSE;
- BOOLEAN Delete;
+ ULONG Error;
MUIDisplayPage(REGISTRY_PAGE);
- if (RepairUpdateFlag)
- {
- DPRINT1("TODO: Updating / repairing the registry is not completely implemented yet!\n");
-
- /* Verify the registry hives and check whether we need to update or repair any of them */
- Status = VerifyRegistryHives(&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");
- }
-
-DoUpdate:
- /* Update the registry */
- CONSOLE_SetStatusText(MUIGetString(STRING_REGHIVEUPDATE));
-
- /* Initialize the registry and setup the registry hives */
- Status = RegInitializeRegistry(&DestinationPath);
- if (!NT_SUCCESS(Status))
+ Error = UpdateRegistry(&USetupData,
+ RepairUpdateFlag,
+ PartitionList,
+ DestinationDriveLetter,
+ SelectedLanguageId,
+ RegistryStatus);
+ if (Error != ERROR_SUCCESS)
{
- 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);
- }
+ MUIDisplayError(Error, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
-
- 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).
- */
-
- 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)
- {
- /*
- * 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
- {
- INF_GetDataField(&InfContext, 0, &Action);
- INF_GetDataField(&InfContext, 1, &File);
- INF_GetDataField(&InfContext, 2, &Section);
-
- DPRINT("Action: %S File: %S Section %S\n", Action, File, Section);
-
- if (Action == NULL)
- 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);
- continue;
- }
-
- CONSOLE_SetStatusText(MUIGetString(STRING_IMPORTFILE), File);
-
- if (!ImportRegistryFile(File, Section, LanguageId, Delete))
- {
- DPRINT1("Importing %S failed\n", File);
- MUIDisplayError(ERROR_IMPORT_HIVE, Ir, POPUP_WAIT_ENTER);
- goto Cleanup;
- }
- } while (SetupFindNextLine(&InfContext, &InfContext));
-
- if (!RepairUpdateFlag || ShouldRepairRegistry)
- {
- /* See the explanation for this test above */
-
- /* Update display registry settings */
- CONSOLE_SetStatusText(MUIGetString(STRING_DISPLAYETTINGSUPDATE));
- if (!ProcessDisplayRegistry(SetupInf, DisplayList))
- {
- MUIDisplayError(ERROR_UPDATE_DISPLAY_SETTINGS, Ir, POPUP_WAIT_ENTER);
- goto Cleanup;
- }
-
- /* 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())
- {
- MUIDisplayError(ERROR_ADDING_KBLAYOUTS, Ir, POPUP_WAIT_ENTER);
- goto Cleanup;
- }
-
- /* Set GeoID */
- if (!SetGeoID(MUIGetGeoID()))
- {
- MUIDisplayError(ERROR_UPDATE_GEOID, Ir, POPUP_WAIT_ENTER);
- goto Cleanup;
- }
-
- if (!IsUnattendedSetup)
- {
- /* Update keyboard layout settings */
- CONSOLE_SetStatusText(MUIGetString(STRING_KEYBOARDSETTINGSUPDATE));
- if (!ProcessKeyboardLayoutRegistry(LayoutList))
- {
- MUIDisplayError(ERROR_UPDATE_KBSETTINGS, Ir, POPUP_WAIT_ENTER);
- goto Cleanup;
- }
- }
-
- /* Add codepage information to registry */
- CONSOLE_SetStatusText(MUIGetString(STRING_CODEPAGEINFOUPDATE));
- if (!AddCodePage())
- {
- 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);
- }
-
-Cleanup:
- //
- // TODO: Unload all the registry stuff, perform cleanup,
- // and copy the created hive files into .sav files.
- //
- RegCleanupRegistry(&DestinationPath);
-
- /*
- * 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)
- {
- ShouldRepairRegistry = FALSE;
- goto DoUpdate;
- }
-
- if (NT_SUCCESS(Status))
+ else
{
CONSOLE_SetStatusText(MUIGetString(STRING_DONE));
return BOOT_LOADER_PAGE;
}
- else
- {
- return QUIT_PAGE;
- }
}
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
- RtlFreeUnicodeString(&SystemRootPath);
- StringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
+ ASSERT(PartitionList->SystemPartition->IsPartitioned && PartitionList->SystemPartition->PartitionNumber != 0);
+
+ RtlFreeUnicodeString(&USetupData.SystemRootPath);
+ RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer),
L"\\Device\\Harddisk%lu\\Partition%lu\\",
PartitionList->SystemPartition->DiskEntry->DiskNumber,
PartitionList->SystemPartition->PartitionNumber);
- RtlCreateUnicodeString(&SystemRootPath, PathBuffer);
- DPRINT1("SystemRootPath: %wZ\n", &SystemRootPath);
+ 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");
DPRINT("Found OS/2 boot manager partition\n");
InstallOnFloppy = TRUE;
}
- else if (PartitionType == PARTITION_EXT2)
+ else if (PartitionType == PARTITION_LINUX)
{
- /* Linux EXT2 partition */
- DPRINT("Found Linux EXT2 partition\n");
+ /* Linux partition */
+ DPRINT("Found Linux native partition (ext2/ext3/ReiserFS/BTRFS/etc)\n");
InstallOnFloppy = FALSE;
}
else if (PartitionType == PARTITION_IFS)
}
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;
+
+ CONSOLE_InvertTextXY(8, Line, 60, 1);
+ }
+ else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
+ (Ir->Event.KeyEvent.wVirtualKeyCode == VK_HOME)) /* HOME */
+ {
+ CONSOLE_NormalTextXY(8, Line, 60, 1);
+
+ 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_END)) /* END */
+ {
+ CONSOLE_NormalTextXY(8, Line, 60, 1);
+ Line = 15;
+
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;
}
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 (DoesPathExist(NULL, L"\\Device\\Floppy0\\") == 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;
}
{
NTSTATUS Status;
- Status = InstallVBRToPartition(&SystemRootPath,
- &SourceRootPath,
- &DestinationArcPath,
+ // FIXME! We must not use the partition type, but instead use the partition FileSystem!!
+ Status = InstallVBRToPartition(&USetupData.SystemRootPath,
+ &USetupData.SourceRootPath,
+ &USetupData.DestinationArcPath,
PartitionList->SystemPartition->PartitionType);
if (!NT_SUCCESS(Status))
{
- MUIDisplayError(ERROR_WRITE_BOOT, Ir, POPUP_WAIT_ENTER);
+ MUIDisplayError(ERROR_WRITE_BOOT, Ir, POPUP_WAIT_ENTER,
+ PartitionList->SystemPartition->FileSystem);
return QUIT_PAGE;
}
{
NTSTATUS Status;
WCHAR DestinationDevicePathBuffer[MAX_PATH];
- WCHAR SourceMbrPathBuffer[MAX_PATH];
- WCHAR DstPath[MAX_PATH];
/* Step 1: Write the VBR */
- Status = InstallVBRToPartition(&SystemRootPath,
- &SourceRootPath,
- &DestinationArcPath,
+ // FIXME! We must not use the partition type, but instead use the partition FileSystem!!
+ Status = InstallVBRToPartition(&USetupData.SystemRootPath,
+ &USetupData.SourceRootPath,
+ &USetupData.DestinationArcPath,
PartitionList->SystemPartition->PartitionType);
if (!NT_SUCCESS(Status))
{
- MUIDisplayError(ERROR_WRITE_BOOT, Ir, POPUP_WAIT_ENTER);
+ MUIDisplayError(ERROR_WRITE_BOOT, Ir, POPUP_WAIT_ENTER,
+ PartitionList->SystemPartition->FileSystem);
return QUIT_PAGE;
}
- /* Step 2: Write the MBR */
- StringCchPrintfW(DestinationDevicePathBuffer, ARRAYSIZE(DestinationDevicePathBuffer),
- L"\\Device\\Harddisk%d\\Partition0",
- PartitionList->SystemPartition->DiskEntry->DiskNumber);
-
- CombinePaths(SourceMbrPathBuffer, ARRAYSIZE(SourceMbrPathBuffer), 2, SourceRootPath.Buffer, L"\\loader\\dosmbr.bin");
-
- if (IsThereAValidBootSector(DestinationDevicePathBuffer))
+ /* Step 2: Write the MBR if the disk containing the system partition is not a super-floppy */
+ if (!IsSuperFloppy(PartitionList->SystemPartition->DiskEntry))
{
- /* Save current MBR */
- CombinePaths(DstPath, ARRAYSIZE(DstPath), 2, SystemRootPath.Buffer, L"mbr.old");
-
- DPRINT1("Save MBR: %S ==> %S\n", DestinationDevicePathBuffer, DstPath);
- Status = SaveBootSector(DestinationDevicePathBuffer, DstPath, sizeof(PARTITION_SECTOR));
+ 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("SaveBootSector() failed (Status %lx)\n", Status);
- // Don't care if we succeeded or not saving the old MBR, just go ahead.
+ DPRINT1("InstallMbrBootCodeToDisk() failed (Status %lx)\n", Status);
+ MUIDisplayError(ERROR_INSTALL_BOOTCODE, Ir, POPUP_WAIT_ENTER, L"MBR");
+ return QUIT_PAGE;
}
}
- DPRINT1("Install MBR bootcode: %S ==> %S\n",
- SourceMbrPathBuffer, DestinationDevicePathBuffer);
- Status = InstallMbrBootCodeToDisk(SourceMbrPathBuffer,
- 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;
}
{
MUIDisplayPage(QUIT_PAGE);
+ /* Destroy the NTOS installations list */
+ if (NtOsInstallsList != NULL)
+ {
+ DestroyGenericList(NtOsInstallsList, TRUE);
+ NtOsInstallsList = NULL;
+ }
+
/* Destroy the partition list */
if (PartitionList != NULL)
{
DestroyPartitionList(PartitionList);
PartitionList = NULL;
}
+
+ /* Reset the formatter machine state */
TempPartition = NULL;
FormatState = Start;
/* Destroy the filesystem list */
- if (FileSystemList != NULL)
- {
- DestroyFileSystemList(FileSystemList);
- FileSystemList = NULL;
- }
-
- /* Destroy the computer settings list */
- if (ComputerList != NULL)
- {
- DestroyGenericList(ComputerList, TRUE);
- ComputerList = NULL;
- }
-
- /* Destroy the display settings list */
- if (DisplayList != NULL)
- {
- DestroyGenericList(DisplayList, TRUE);
- DisplayList = NULL;
- }
-
- /* Destroy the keyboard settings list */
- if (KeyboardList != NULL)
- {
- DestroyGenericList(KeyboardList, TRUE);
- KeyboardList = NULL;
- }
-
- /* Destroy the keyboard layout list */
- if (LayoutList != NULL)
- {
- DestroyGenericList(LayoutList, TRUE);
- LayoutList = NULL;
- }
-
- /* Destroy the languages list */
- if (LanguageList != NULL)
- {
- DestroyGenericList(LanguageList, FALSE);
- LanguageList = NULL;
- }
+ ResetFileSystemList();
CONSOLE_SetStatusText(MUIGetString(STRING_REBOOTCOMPUTER2));
}
-DWORD WINAPI
-PnpEventThread(IN LPVOID lpParameter);
-
-
/*
* The start routine and page management
*/
if (!NT_SUCCESS(Status))
DPRINT1("NtInitializeRegistry() failed (Status 0x%08lx)\n", Status);
- /* Create the PnP thread in suspended state */
- Status = RtlCreateUserThread(NtCurrentProcess(),
- NULL,
- TRUE,
- 0,
- 0,
- 0,
- PnpEventThread,
- &SetupInf,
- &hPnpThread,
- NULL);
+ /* Initialize the user-mode PnP manager */
+ Status = InitializeUserModePnpManager(&USetupData.SetupInf);
if (!NT_SUCCESS(Status))
- hPnpThread = INVALID_HANDLE_VALUE;
+ {
+ // PrintString(??);
+ DPRINT1("The user-mode PnP manager could not initialize (Status 0x%08lx), expect unavailable devices!\n", Status);
+ }
if (!CONSOLE_Init())
{
return STATUS_APP_INIT_FAILURE;
}
- /* Initialize global unicode strings */
- RtlInitUnicodeString(&SourcePath, NULL);
- RtlInitUnicodeString(&SourceRootPath, NULL);
- RtlInitUnicodeString(&SourceRootDir, NULL);
- RtlInitUnicodeString(&InstallPath, NULL);
- RtlInitUnicodeString(&DestinationPath, NULL);
- RtlInitUnicodeString(&DestinationArcPath, NULL);
- RtlInitUnicodeString(&DestinationRootPath, NULL);
- RtlInitUnicodeString(&SystemRootPath, NULL);
+ /* Initialize Setup, phase 0 */
+ InitializeSetup(&USetupData, 0);
+ USetupData.ErrorRoutine = USetupErrorRoutine;
- /* Hide the cursor */
+ /* Hide the cursor and clear the screen and keyboard buffer */
CONSOLE_SetCursorType(TRUE, FALSE);
-
- /* Global Initialization page */
CONSOLE_ClearScreen();
CONSOLE_Flush();
+
+ /* Global Initialization page */
Page = SetupStartPage(&Ir);
while (Page != REBOOT_PAGE && Page != RECOVERY_PAGE)
Page = RepairIntroPage(&Ir);
break;
+ case UPGRADE_REPAIR_PAGE:
+ Page = UpgradeRepairPage(&Ir);
+ break;
+
case SUCCESS_PAGE:
Page = SuccessPage(&Ir);
break;
Page = QuitPage(&Ir);
break;
- case RECOVERY_PAGE:
+ /* Virtual pages */
+ case SETUP_INIT_PAGE:
case REBOOT_PAGE:
+ case RECOVERY_PAGE:
break;
}
}
+ /* Terminate the user-mode PnP manager */
+ TerminateUserModePnpManager();
+
+ /* Setup has finished */
+ FinishSetup(&USetupData);
+
if (Page == RECOVERY_PAGE)
RecoveryConsole();