Author: hbelusca Date: Thu May 18 01:24:41 2017 New Revision: 74576
URL: http://svn.reactos.org/svn/reactos?rev=74576&view=rev Log: [USETUP]: Implement most of the "upgrade" page (where existing NTOS installations are listed). - Modify a bit the page flow so that the upgrade page is inserted before the Device-settings page, and after the Install-Intro page. - Insert some extra 'RepairUpdateFlag' checks in SelectPartitionPage() and InstallDirectoryPage() to take specific actions in case the flag is TRUE. - As overviewed in r74573, move 'TempPartition' and 'FormatState' back to USETUP.
Added: branches/setup_improvements/base/setup/usetup/osdetect.h (with props) Modified: branches/setup_improvements/base/setup/usetup/interface/usetup.c branches/setup_improvements/base/setup/usetup/osdetect.c branches/setup_improvements/base/setup/usetup/usetup.h
Modified: branches/setup_improvements/base/setup/usetup/interface/usetup.c URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/setup/us... ============================================================================== --- branches/setup_improvements/base/setup/usetup/interface/usetup.c [iso-8859-1] (original) +++ branches/setup_improvements/base/setup/usetup/interface/usetup.c [iso-8859-1] Thu May 18 01:24:41 2017 @@ -58,7 +58,11 @@ WCHAR DefaultKBLayout[20]; BOOLEAN RepairUpdateFlag = FALSE; HANDLE hPnpThread = INVALID_HANDLE_VALUE; + PPARTLIST PartitionList = NULL; +PPARTENTRY TempPartition = NULL; +FORMATMACHINESTATE FormatState = Start; +
/* LOCALS *******************************************************************/
@@ -86,11 +90,14 @@ static UNICODE_STRING DestinationArcPath; static UNICODE_STRING DestinationRootPath;
-static WCHAR DestinationDriveLetter; +static WCHAR DestinationDriveLetter; // FIXME: Is it really useful??
static HINF SetupInf;
static HSPFILEQ SetupFileQueue = NULL; + +static PNTOS_INSTALLATION CurrentInstallation = NULL; +static PGENERIC_LIST NtOsInstallsList = NULL;
static PGENERIC_LIST ComputerList = NULL; static PGENERIC_LIST DisplayList = NULL; @@ -936,7 +943,7 @@ * * Next pages: * InstallIntroPage (default) - * RepairIntroPage + * RecoveryPage * LicensePage * QuitPage * @@ -966,7 +973,7 @@ } else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'R') /* R */ { - return REPAIR_INTRO_PAGE; + return RECOVERY_PAGE; } else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'L') /* L */ { @@ -1007,48 +1014,127 @@
/* - * Displays the RepairIntroPage. + * Displays the UpgradeRepairPage. * * Next pages: * RebootPage (default) * InstallIntroPage * RecoveryPage - * IntroPage + * WelcomePage * * RETURNS * Number of the next page. */ static PAGE_NUMBER -RepairIntroPage(PINPUT_RECORD Ir) +UpgradeRepairPage(PINPUT_RECORD Ir) { - MUIDisplayPage(REPAIR_INTRO_PAGE); - - while(TRUE) + GENERIC_LIST_UI ListUi; + +/*** HACK!! ***/ + if (PartitionList == NULL) + { + PartitionList = CreatePartitionList(); + if (PartitionList == NULL) + { + /* FIXME: show an error dialog */ + MUIDisplayError(ERROR_DRIVE_INFORMATION, Ir, POPUP_WAIT_ENTER); + return QUIT_PAGE; + } + else if (IsListEmpty(&PartitionList->DiskListHead)) + { + MUIDisplayError(ERROR_NO_HDD, Ir, POPUP_WAIT_ENTER); + return QUIT_PAGE; + } + + TempPartition = NULL; + FormatState = Start; + } +/**************/ + + NtOsInstallsList = CreateNTOSInstallationsList(PartitionList); + if (!NtOsInstallsList) + DPRINT1("Failed to get a list of NTOS installations; continue installation...\n"); + if (!NtOsInstallsList || GetNumberOfListEntries(NtOsInstallsList) == 0) + { + RepairUpdateFlag = FALSE; + + // return INSTALL_INTRO_PAGE; + return DEVICE_SETTINGS_PAGE; + // return SCSI_CONTROLLER_PAGE; + } + + MUIDisplayPage(UPGRADE_REPAIR_PAGE); + + InitGenericListUi(&ListUi, NtOsInstallsList); + DrawGenericList(&ListUi, + 2, 23, + xScreen - 3, + yScreen - 3); + + SaveGenericListState(NtOsInstallsList); + + // return HandleGenericList(&ListUi, DEVICE_SETTINGS_PAGE, Ir); + while (TRUE) { CONSOLE_ConInKey(Ir);
- if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ - { - return REBOOT_PAGE; - } - else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'U') /* U */ - { - RepairUpdateFlag = TRUE; - return INSTALL_INTRO_PAGE; - } - else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'R') /* R */ - { - return RECOVERY_PAGE; + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + ScrollDownGenericList(&ListUi); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + ScrollUpGenericList(&ListUi); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT)) /* PAGE DOWN */ + { + ScrollPageDownGenericList(&ListUi); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)) /* PAGE UP */ + { + ScrollPageUpGenericList(&ListUi); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + { + if (ConfirmQuit(Ir) == TRUE) + return QUIT_PAGE; + else + RedrawGenericList(&ListUi); } else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ { - return WELCOME_PAGE; - } - } - - return REPAIR_INTRO_PAGE; + RestoreGenericListState(NtOsInstallsList); + // return nextPage; // prevPage; + } + // else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ + else if (toupper(Ir->Event.KeyEvent.uChar.AsciiChar) == 'U') /* U */ + { + /* Retrieve the current installation */ + CurrentInstallation = (PNTOS_INSTALLATION)GetListEntryUserData(GetCurrentListEntry(NtOsInstallsList)); + DPRINT1("Selected installation for repair: "%S" ; DiskNumber = %d , PartitionNumber = %d\n", + CurrentInstallation->InstallationName, CurrentInstallation->DiskNumber, CurrentInstallation->PartitionNumber); + + RepairUpdateFlag = TRUE; + + // return nextPage; + /***/return INSTALL_INTRO_PAGE;/***/ + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b)) + { + /* a-z */ + GenericListKeyPress(&ListUi, Ir->Event.KeyEvent.uChar.AsciiChar); + } + } + + return UPGRADE_REPAIR_PAGE; } +
/* * Displays the InstallIntroPage. @@ -1067,8 +1153,17 @@ { if (RepairUpdateFlag) { - //return SELECT_PARTITION_PAGE; +#if 1 /* Old code that looks good */ + + // return SELECT_PARTITION_PAGE; return DEVICE_SETTINGS_PAGE; + +#else /* Possible new code? */ + + return DEVICE_SETTINGS_PAGE; + // return SCSI_CONTROLLER_PAGE; + +#endif }
if (IsUnattendedSetup) @@ -1090,8 +1185,7 @@ } else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { - return DEVICE_SETTINGS_PAGE; - // return SCSI_CONTROLLER_PAGE; + return UPGRADE_REPAIR_PAGE; } }
@@ -1555,6 +1649,25 @@ MUIDisplayError(ERROR_NO_HDD, Ir, POPUP_WAIT_ENTER); return QUIT_PAGE; } + + TempPartition = NULL; + FormatState = Start; + } + + if (RepairUpdateFlag) + { + /* Determine the selected installation disk & partition */ + if (!SelectPartition(PartitionList, + CurrentInstallation->DiskNumber, + CurrentInstallation->PartitionNumber)) + { + DPRINT1("Whaaaaaat?!?! ASSERT!\n"); + ASSERT(FALSE); + } + + DestinationDriveLetter = (WCHAR)PartitionList->CurrentPartition->DriveLetter; + + return SELECT_FILE_SYSTEM_PAGE; }
MUIDisplayPage(SELECT_PARTITION_PAGE); @@ -2602,25 +2715,25 @@ return QUIT_PAGE; }
- PreviousFormatState = PartitionList->FormatState; - switch (PartitionList->FormatState) + PreviousFormatState = FormatState; + switch (FormatState) { case Start: { if (PartitionList->CurrentPartition != PartitionList->SystemPartition) { - PartitionList->TempPartition = PartitionList->SystemPartition; - PartitionList->TempPartition->NeedsCheck = TRUE; - - PartitionList->FormatState = FormatSystemPartition; + TempPartition = PartitionList->SystemPartition; + TempPartition->NeedsCheck = TRUE; + + FormatState = FormatSystemPartition; DPRINT1("FormatState: Start --> FormatSystemPartition\n"); } else { - PartitionList->TempPartition = PartitionList->CurrentPartition; - PartitionList->TempPartition->NeedsCheck = TRUE; - - PartitionList->FormatState = FormatInstallPartition; + TempPartition = PartitionList->CurrentPartition; + TempPartition->NeedsCheck = TRUE; + + FormatState = FormatInstallPartition; DPRINT1("FormatState: Start --> FormatInstallPartition\n"); } break; @@ -2628,10 +2741,10 @@
case FormatSystemPartition: { - PartitionList->TempPartition = PartitionList->CurrentPartition; - PartitionList->TempPartition->NeedsCheck = TRUE; - - PartitionList->FormatState = FormatInstallPartition; + TempPartition = PartitionList->CurrentPartition; + TempPartition->NeedsCheck = TRUE; + + FormatState = FormatInstallPartition; DPRINT1("FormatState: FormatSystemPartition --> FormatInstallPartition\n"); break; } @@ -2640,15 +2753,15 @@ { if (GetNextUnformattedPartition(PartitionList, NULL, - &PartitionList->TempPartition)) - { - PartitionList->FormatState = FormatOtherPartition; - PartitionList->TempPartition->NeedsCheck = TRUE; + &TempPartition)) + { + FormatState = FormatOtherPartition; + TempPartition->NeedsCheck = TRUE; DPRINT1("FormatState: FormatInstallPartition --> FormatOtherPartition\n"); } else { - PartitionList->FormatState = FormatDone; + FormatState = FormatDone; DPRINT1("FormatState: FormatInstallPartition --> FormatDone\n"); return CHECK_FILE_SYSTEM_PAGE; } @@ -2659,15 +2772,15 @@ { if (GetNextUnformattedPartition(PartitionList, NULL, - &PartitionList->TempPartition)) - { - PartitionList->FormatState = FormatOtherPartition; - PartitionList->TempPartition->NeedsCheck = TRUE; + &TempPartition)) + { + FormatState = FormatOtherPartition; + TempPartition->NeedsCheck = TRUE; DPRINT1("FormatState: FormatOtherPartition --> FormatOtherPartition\n"); } else { - PartitionList->FormatState = FormatDone; + FormatState = FormatDone; DPRINT1("FormatState: FormatOtherPartition --> FormatDone\n"); return CHECK_FILE_SYSTEM_PAGE; } @@ -2682,7 +2795,7 @@ } }
- PartEntry = PartitionList->TempPartition; + PartEntry = TempPartition; DiskEntry = PartEntry->DiskEntry;
/* Adjust disk size */ @@ -2743,7 +2856,7 @@ } else if (PartEntry->New == TRUE) { - switch (PartitionList->FormatState) + switch (FormatState) { case FormatSystemPartition: CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_NONFORMATTEDSYSTEMPART)); @@ -2851,7 +2964,7 @@ else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ { - PartitionList->FormatState = Start; + FormatState = Start; return SELECT_PARTITION_PAGE; } else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && @@ -2873,7 +2986,7 @@ } }
- PartitionList->FormatState = PreviousFormatState; + FormatState = PreviousFormatState;
return SELECT_FILE_SYSTEM_PAGE; } @@ -2914,14 +3027,13 @@
MUIDisplayPage(FORMAT_PARTITION_PAGE);
- if (PartitionList == NULL || - PartitionList->TempPartition == NULL) + if (PartitionList == NULL || TempPartition == NULL) { /* FIXME: show an error dialog */ return QUIT_PAGE; }
- PartEntry = PartitionList->TempPartition; + PartEntry = TempPartition; DiskEntry = PartEntry->DiskEntry;
SelectedFileSystem = FileSystemList->Selected; @@ -3238,6 +3350,8 @@
if (IsUnattendedSetup) wcscpy(InstallDir, UnattendInstallationDirectory); + else if (RepairUpdateFlag) + wcscpy(InstallDir, CurrentInstallation->SystemRoot); else wcscpy(InstallDir, L"\ReactOS");
@@ -3248,6 +3362,13 @@ // FIXME: Check the validity of the InstallDir; however what to do // if it is invalid but we are in unattended setup? (case of somebody // specified an invalid installation directory in the unattended file). + + if (RepairUpdateFlag) + { + return InstallDirectoryPage1(InstallDir, + DiskEntry, + PartEntry); + }
if (IsUnattendedSetup) { @@ -4441,12 +4562,21 @@ { 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; } + TempPartition = NULL; + FormatState = Start;
/* Destroy the filesystem list */ if (FileSystemList != NULL) @@ -4745,8 +4875,8 @@ break;
/* Repair pages */ - case REPAIR_INTRO_PAGE: - Page = RepairIntroPage(&Ir); + case UPGRADE_REPAIR_PAGE: + Page = UpgradeRepairPage(&Ir); break;
case SUCCESS_PAGE:
Modified: branches/setup_improvements/base/setup/usetup/osdetect.c URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/setup/us... ============================================================================== --- branches/setup_improvements/base/setup/usetup/osdetect.c [iso-8859-1] (original) +++ branches/setup_improvements/base/setup/usetup/osdetect.c [iso-8859-1] Thu May 18 01:24:41 2017 @@ -563,16 +563,6 @@ return Success; }
-typedef struct _NTOS_INSTALLATION -{ - LIST_ENTRY ListEntry; - ULONG DiskNumber; - ULONG PartitionNumber; -// Vendor???? - WCHAR SystemRoot[MAX_PATH]; -/**/WCHAR InstallationName[MAX_PATH];/**/ -} NTOS_INSTALLATION, *PNTOS_INSTALLATION; - static VOID ListNTOSInstalls( IN PGENERIC_LIST List) @@ -682,6 +672,7 @@ PVOID ViewBase; WCHAR PathBuffer[MAX_PATH]; WCHAR SystemRoot[MAX_PATH]; + WCHAR InstallNameW[MAX_PATH];
/* Set PartitionRootPath */ swprintf(PathBuffer, @@ -741,7 +732,9 @@ { DPRINT1("Found a valid NTOS installation in disk #%d, partition #%d, SystemRoot %S\n", DiskNumber, PartitionNumber, SystemRoot); - AddNTOSInstallation(List, DiskNumber, PartitionNumber, SystemRoot, L"Install_Windows"); + StringCchPrintfW(InstallNameW, ARRAYSIZE(InstallNameW), L"%C: \Device\Harddisk%lu\Partition%lu\%s "%s"", + 'X' /* FIXME: Partition letter */, DiskNumber, PartitionNumber, SystemRoot, L"Windows (placeholder)"); + AddNTOSInstallation(List, DiskNumber, PartitionNumber, SystemRoot, InstallNameW); }
// Here we get a SystemRootPath for each installation // FIXME! @@ -751,7 +744,9 @@ { DPRINT1("Found a valid NTOS installation in disk #%d, partition #%d, SystemRoot %S\n", DiskNumber, PartitionNumber, SystemRoot); - AddNTOSInstallation(List, DiskNumber, PartitionNumber, SystemRoot, L"Install_ReactOS"); + StringCchPrintfW(InstallNameW, ARRAYSIZE(InstallNameW), L"%C: \Device\Harddisk%lu\Partition%lu\%s "%s"", + 'X' /* FIXME: Partition letter */, DiskNumber, PartitionNumber, SystemRoot, L"ReactOS (placeholder)"); + AddNTOSInstallation(List, DiskNumber, PartitionNumber, SystemRoot, InstallNameW); }
/* Finally, unmap and close the file */
Added: branches/setup_improvements/base/setup/usetup/osdetect.h URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/setup/us... ============================================================================== --- branches/setup_improvements/base/setup/usetup/osdetect.h (added) +++ branches/setup_improvements/base/setup/usetup/osdetect.h [iso-8859-1] Thu May 18 01:24:41 2017 @@ -0,0 +1,15 @@ + +typedef struct _NTOS_INSTALLATION +{ + LIST_ENTRY ListEntry; + ULONG DiskNumber; + ULONG PartitionNumber; +// Vendor???? + WCHAR SystemRoot[MAX_PATH]; +/**/WCHAR InstallationName[MAX_PATH];/**/ +} NTOS_INSTALLATION, *PNTOS_INSTALLATION; + +// EnumerateNTOSInstallations +PGENERIC_LIST +CreateNTOSInstallationsList( + IN PPARTLIST List);
Propchange: branches/setup_improvements/base/setup/usetup/osdetect.h ------------------------------------------------------------------------------ svn:eol-style = native
Modified: branches/setup_improvements/base/setup/usetup/usetup.h URL: http://svn.reactos.org/svn/reactos/branches/setup_improvements/base/setup/us... ============================================================================== --- branches/setup_improvements/base/setup/usetup/usetup.h [iso-8859-1] (original) +++ branches/setup_improvements/base/setup/usetup/usetup.h [iso-8859-1] Thu May 18 01:24:41 2017 @@ -72,6 +72,7 @@ #include "cabinet.h" #include "filesup.h" #include "genlist.h" +#include "osdetect.h" #include "host.h" #include "mui.h"