From a5c4f052be69fd35fe2dba0a364cf11851bf228c Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 3 Jan 2015 15:33:22 +0000 Subject: [PATCH] [USETUP] Implement pre-install 'select format' and 'format' pages. These enable the user to re-format an existing install partitition. CORE-9005 #resolve svn path=/trunk/; revision=65962 --- reactos/base/setup/usetup/fslist.c | 5 +- reactos/base/setup/usetup/fslist.h | 3 +- reactos/base/setup/usetup/host.h | 3 +- reactos/base/setup/usetup/interface/usetup.c | 592 +++++++++++++++---- reactos/base/setup/usetup/lang/bg-BG.h | 2 + reactos/base/setup/usetup/lang/bn-BD.h | 2 + reactos/base/setup/usetup/lang/cs-CZ.h | 2 + reactos/base/setup/usetup/lang/de-DE.h | 2 + reactos/base/setup/usetup/lang/el-GR.h | 2 + reactos/base/setup/usetup/lang/en-US.h | 2 + reactos/base/setup/usetup/lang/es-ES.h | 2 + reactos/base/setup/usetup/lang/et-EE.h | 2 + reactos/base/setup/usetup/lang/fr-FR.h | 2 + reactos/base/setup/usetup/lang/he-IL.h | 2 + reactos/base/setup/usetup/lang/it-IT.h | 2 + reactos/base/setup/usetup/lang/ja-JP.h | 2 + reactos/base/setup/usetup/lang/lt-LT.h | 2 + reactos/base/setup/usetup/lang/nl-NL.h | 2 + reactos/base/setup/usetup/lang/pl-PL.h | 2 + reactos/base/setup/usetup/lang/pt-BR.h | 2 + reactos/base/setup/usetup/lang/ro-RO.h | 2 + reactos/base/setup/usetup/lang/ru-RU.h | 2 + reactos/base/setup/usetup/lang/sk-SK.h | 2 + reactos/base/setup/usetup/lang/sq-AL.h | 2 + reactos/base/setup/usetup/lang/sv-SE.h | 2 + reactos/base/setup/usetup/lang/tr-TR.h | 2 + reactos/base/setup/usetup/lang/uk-UA.h | 2 + reactos/base/setup/usetup/mui.h | 2 + reactos/base/setup/usetup/native/fslist.c | 30 +- reactos/base/setup/usetup/partlist.c | 12 +- reactos/base/setup/usetup/partlist.h | 2 +- reactos/base/setup/usetup/usetup.h | 5 +- 32 files changed, 563 insertions(+), 137 deletions(-) diff --git a/reactos/base/setup/usetup/fslist.c b/reactos/base/setup/usetup/fslist.c index 1aa660978d1..0fe7ae17457 100644 --- a/reactos/base/setup/usetup/fslist.c +++ b/reactos/base/setup/usetup/fslist.c @@ -71,7 +71,8 @@ CreateFileSystemList( IN SHORT Left, IN SHORT Top, IN BOOLEAN ForceFormat, - IN LPCWSTR ForceFileSystem) + IN LPCWSTR ForceFileSystem, + IN UCHAR PartitionType) { PFILE_SYSTEM_LIST List; PFILE_SYSTEM_ITEM Item; @@ -86,7 +87,7 @@ CreateFileSystemList( List->Selected = NULL; InitializeListHead(&List->ListHead); - HOST_CreateFileSystemList(List); + HOST_CreateFileSystemList(List, PartitionType); if (!ForceFormat) { diff --git a/reactos/base/setup/usetup/fslist.h b/reactos/base/setup/usetup/fslist.h index 6b28e29073e..f0a2919f398 100644 --- a/reactos/base/setup/usetup/fslist.h +++ b/reactos/base/setup/usetup/fslist.h @@ -57,7 +57,8 @@ CreateFileSystemList( IN SHORT Left, IN SHORT Top, IN BOOLEAN ForceFormat, - IN LPCWSTR ForceFileSystem); + IN LPCWSTR ForceFileSystem, + IN UCHAR PartitionType); VOID DestroyFileSystemList( diff --git a/reactos/base/setup/usetup/host.h b/reactos/base/setup/usetup/host.h index 6d8a84bfdb3..6a2ead8f9ea 100644 --- a/reactos/base/setup/usetup/host.h +++ b/reactos/base/setup/usetup/host.h @@ -22,7 +22,8 @@ HOST_InitMemory(VOID); BOOLEAN HOST_CreateFileSystemList( - IN PFILE_SYSTEM_LIST List); + IN PFILE_SYSTEM_LIST List, + IN UCHAR PartitionType); BOOLEAN HOST_FormatPartition( diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index 656163aa7fd..2e5be078e79 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -1606,7 +1606,7 @@ SelectPartitionPage(PINPUT_RECORD Ir) { MUIDisplayError(ERROR_INSUFFICIENT_PARTITION_SIZE, Ir, POPUP_WAIT_ANY_KEY, RequiredPartitionDiskSpace); - continue; //return SELECT_PARTITION_PAGE; /* let the user select another partition */ + return SELECT_PARTITION_PAGE; /* let the user select another partition */ } if (PartitionList->CurrentPartition == NULL || @@ -1622,7 +1622,7 @@ SelectPartitionPage(PINPUT_RECORD Ir) DestinationDriveLetter = (WCHAR)PartitionList->CurrentPartition->DriveLetter; - return INSTALL_DIRECTORY_PAGE; + return PRE_INSTALL_SELECT_FORMAT_PAGE; } else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'P') /* P */ { @@ -2281,7 +2281,7 @@ DeletePartitionPage(PINPUT_RECORD Ir) ULONGLONG DiskSize; ULONGLONG PartSize; PCHAR Unit; - PCHAR PartType; + PCHAR PartType = NULL; NTSTATUS Status; if (PartitionList == NULL || @@ -2298,37 +2298,29 @@ DeletePartitionPage(PINPUT_RECORD Ir) MUIDisplayPage(DELETE_PARTITION_PAGE); /* Determine partition type */ - PartType = NULL; - if (PartEntry->New == TRUE) + if ((PartEntry->PartitionType == PARTITION_FAT_12) || + (PartEntry->PartitionType == PARTITION_FAT_16) || + (PartEntry->PartitionType == PARTITION_HUGE) || + (PartEntry->PartitionType == PARTITION_XINT13)) { - PartType = MUIGetString(STRING_UNFORMATTED); + PartType = "FAT"; } - else if (PartEntry->IsPartitioned == TRUE) + else if ((PartEntry->PartitionType == PARTITION_FAT32) || + (PartEntry->PartitionType == PARTITION_FAT32_XINT13)) { - if ((PartEntry->PartitionType == PARTITION_FAT_12) || - (PartEntry->PartitionType == PARTITION_FAT_16) || - (PartEntry->PartitionType == PARTITION_HUGE) || - (PartEntry->PartitionType == PARTITION_XINT13)) - { - PartType = "FAT"; - } - else if ((PartEntry->PartitionType == PARTITION_FAT32) || - (PartEntry->PartitionType == PARTITION_FAT32_XINT13)) - { - PartType = "FAT32"; - } - else if (PartEntry->PartitionType == PARTITION_EXT2) - { - PartType = "EXT2"; - } - else if (PartEntry->PartitionType == PARTITION_IFS) - { - PartType = "NTFS"; /* FIXME: Not quite correct! */ - } - else if (IsContainerPartition(PartEntry->PartitionType)) - { - PartType = MUIGetString(STRING_EXTENDED_PARTITION); - } + PartType = "FAT32"; + } + else if (PartEntry->PartitionType == PARTITION_EXT2) + { + PartType = "EXT2"; + } + else if (PartEntry->PartitionType == PARTITION_IFS) + { + PartType = "NTFS"; /* FIXME: Not quite correct! */ + } + else if (IsContainerPartition(PartEntry->PartitionType)) + { + PartType = MUIGetString(STRING_EXTENDED_PARTITION); } PartSize = PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector; @@ -2617,14 +2609,16 @@ SelectFileSystemPage(PINPUT_RECORD Ir) PartEntry->AutoCreate = FALSE; } +#if 0 else if (PartEntry->New == TRUE) { CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_NONFORMATTEDPART)); CONSOLE_SetTextXY(6, 10, MUIGetString(STRING_PARTFORMAT)); } +#endif else { - CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_INSTALLONPART)); + CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_FORMATPART)); if (PartType == NULL) { @@ -2661,14 +2655,12 @@ SelectFileSystemPage(PINPUT_RECORD Ir) if (FileSystemList == NULL) { - FileSystemList = CreateFileSystemList(6, 26, PartEntry->New, L"FAT"); + FileSystemList = CreateFileSystemList(6, 26, TRUE, L"FAT", PARTITION_ENTRY_UNUSED); if (FileSystemList == NULL) { /* FIXME: show an error dialog */ return QUIT_PAGE; } - - /* FIXME: Add file systems to list */ } DrawFileSystemList(FileSystemList); @@ -2691,6 +2683,8 @@ SelectFileSystemPage(PINPUT_RECORD Ir) { DPRINT1("WriteDirtyPartitions() failed (Status 0x%08lx)\n", Status); MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER); + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; return QUIT_PAGE; } @@ -2709,6 +2703,8 @@ SelectFileSystemPage(PINPUT_RECORD Ir) { if (ConfirmQuit(Ir) == TRUE) { + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; return QUIT_PAGE; } @@ -2717,6 +2713,8 @@ SelectFileSystemPage(PINPUT_RECORD Ir) else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ { + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; return SELECT_PARTITION_PAGE; } else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && @@ -2767,6 +2765,434 @@ FormatPartitionPage(PINPUT_RECORD Ir) PPARTENTRY PartEntry; NTSTATUS Status; +#ifndef NDEBUG + ULONG Line; + ULONG i; + PLIST_ENTRY Entry; +#endif + + MUIDisplayPage(FORMAT_PARTITION_PAGE); + + if (PartitionList == NULL || + PartitionList->CurrentDisk == NULL || + PartitionList->CurrentPartition == NULL) + { + /* FIXME: show an error dialog */ + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; + return QUIT_PAGE; + } + +// DiskEntry = PartitionList->CurrentDisk; + PartEntry = PartitionList->CurrentPartition; + + while (TRUE) + { + if (!IsUnattendedSetup) + { + CONSOLE_ConInKey(Ir); + } + + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + { + if (ConfirmQuit(Ir) == TRUE) + { + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; + return QUIT_PAGE; + } + + break; + } + else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN || IsUnattendedSetup) /* ENTER */ + { + CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT)); + + if (!FileSystemList->Selected->FormatFunc) + { + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; + return QUIT_PAGE; + } + +#ifndef NDEBUG + CONSOLE_PrintTextXY(6, 12, + "Disk: %I64u Cylinder: %I64u Track: %I64u", + DiskEntry->DiskSize, + DiskEntry->CylinderSize, + DiskEntry->TrackSize); + + Line = 13; + DiskEntry = PartitionList->CurrentDisk; + Entry = DiskEntry->PartListHead.Flink; + + while (Entry != &DiskEntry->PrimaryPartListHead) + { + PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry); + + if (PartEntry->IsPartitioned == TRUE) + { + CONSOLE_PrintTextXY(6, Line, + "%2u: %2u %c %12I64u %12I64u %2u %c", + i, + PartEntry->PartitionNumber, + PartEntry->BootIndicator ? 'A' : '-', + PartEntry->StartSector.QuadPart, + PartEntry->SectorCount.QuadPart, + PartEntry->PartitionType, + PartEntry->Dirty ? '*' : ' '); + Line++; + } + + Entry = Entry->Flink; + } + + /* Restore the old entry */ + PartEntry = PartitionList->CurrentPartition; +#endif + + /* Set DestinationRootPath */ + RtlFreeUnicodeString(&DestinationRootPath); + swprintf(PathBuffer, + L"\\Device\\Harddisk%lu\\Partition%lu", + PartitionList->CurrentDisk->DiskNumber, + PartitionList->CurrentPartition->PartitionNumber); + RtlCreateUnicodeString(&DestinationRootPath, + PathBuffer); + DPRINT("DestinationRootPath: %wZ\n", &DestinationRootPath); + + if (FileSystemList->Selected->FormatFunc) + { + Status = FormatPartition(&DestinationRootPath, + FileSystemList->Selected); + if (!NT_SUCCESS(Status)) + { + DPRINT1("FormatPartition() failed with status 0x%08lx\n", Status); + /* FIXME: show an error dialog */ + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; + return QUIT_PAGE; + } + + PartEntry->FormatState = Formatted; + } + +#ifndef NDEBUG + CONSOLE_SetStatusText(" Done. Press any key ..."); + CONSOLE_ConInKey(Ir); +#endif + + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; + + if (IsUnattendedSetup || InstallShortcut) + return INSTALL_DIRECTORY_PAGE; + else + return SELECT_PARTITION_PAGE; + } + } + + return FORMAT_PARTITION_PAGE; +} + + +static ULONG +CheckFileSystemPage(PINPUT_RECORD Ir) +{ + PFILE_SYSTEM_ITEM CurrentFileSystem; + WCHAR PathBuffer[MAX_PATH]; + CHAR Buffer[MAX_PATH]; + NTSTATUS Status; + + /* FIXME: code duplicated in FormatPartitionPage */ + /* Set DestinationRootPath */ + RtlFreeUnicodeString(&DestinationRootPath); + swprintf(PathBuffer, + L"\\Device\\Harddisk%lu\\Partition%lu", + PartitionList->CurrentDisk->DiskNumber, + PartitionList->CurrentPartition->PartitionNumber); + RtlCreateUnicodeString(&DestinationRootPath, PathBuffer); + DPRINT("DestinationRootPath: %wZ\n", &DestinationRootPath); + + CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_CHECKINGPART)); + + CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT)); + + /* WRONG: first filesystem is not necesseraly the one of the current partition! */ + CurrentFileSystem = CONTAINING_RECORD(FileSystemList->ListHead.Flink, FILE_SYSTEM_ITEM, ListEntry); + + if (!CurrentFileSystem->ChkdskFunc) + { + 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->FileSystem); + + PopupError(Buffer, + MUIGetString(STRING_QUITCONTINUE), + NULL, POPUP_WAIT_NONE); + + 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; + else + return CHECK_FILE_SYSTEM_PAGE; + } + else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */ + { + return INSTALL_DIRECTORY_PAGE; + } + } + } + else + { + Status = ChkdskPartition(&DestinationRootPath, CurrentFileSystem); + if (!NT_SUCCESS(Status)) + { + DPRINT("ChkdskPartition() failed with status 0x%08lx\n", Status); + sprintf(Buffer, "Setup failed to verify the selected partition.\n" + "(Status 0x%08lx).\n", Status); + + PopupError(Buffer, + MUIGetString(STRING_REBOOTCOMPUTER), + Ir, POPUP_WAIT_ENTER); + + return QUIT_PAGE; + } + + return INSTALL_DIRECTORY_PAGE; + } +} + + + + +static PAGE_NUMBER +PreInstallSelectFormatPage(PINPUT_RECORD Ir) +{ + PDISKENTRY DiskEntry; + PPARTENTRY PartEntry; + ULONGLONG DiskSize; + ULONGLONG PartSize; + PCHAR DiskUnit; + PCHAR PartUnit; + PCHAR PartType; + + if (PartitionList == NULL || + PartitionList->CurrentDisk == NULL || + PartitionList->CurrentPartition == NULL) + { + /* FIXME: show an error dialog */ + return QUIT_PAGE; + } + + DiskEntry = PartitionList->CurrentDisk; + PartEntry = PartitionList->CurrentPartition; + + if (PartEntry->FormatState == Formatted) + return INSTALL_DIRECTORY_PAGE; + + /* adjust disk size */ + DiskSize = DiskEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector; + if (DiskSize >= 10737418240) /* 10 GB */ + { + DiskSize = DiskSize / 1073741824; + DiskUnit = MUIGetString(STRING_GB); + } + else + { + DiskSize = DiskSize / 1048576; + DiskUnit = MUIGetString(STRING_MB); + } + + /* adjust partition size */ + PartSize = PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector; + if (PartSize >= 10737418240) /* 10 GB */ + { + PartSize = PartSize / 1073741824; + PartUnit = MUIGetString(STRING_GB); + } + else + { + PartSize = PartSize / 1048576; + PartUnit = MUIGetString(STRING_MB); + } + + /* adjust partition type */ + if ((PartEntry->PartitionType == PARTITION_FAT_12) || + (PartEntry->PartitionType == PARTITION_FAT_16) || + (PartEntry->PartitionType == PARTITION_HUGE) || + (PartEntry->PartitionType == PARTITION_XINT13)) + { + PartType = "FAT"; + } + else if ((PartEntry->PartitionType == PARTITION_FAT32) || + (PartEntry->PartitionType == PARTITION_FAT32_XINT13)) + { + PartType = "FAT32"; + } + else if (PartEntry->PartitionType == PARTITION_EXT2) + { + PartType = "EXT2"; + } + else if (PartEntry->PartitionType == PARTITION_IFS) + { + PartType = "NTFS"; /* FIXME: Not quite correct! */ + } + else if (PartEntry->PartitionType == PARTITION_ENTRY_UNUSED) + { + PartType = MUIGetString(STRING_FORMATUNUSED); + } + else + { + PartType = MUIGetString(STRING_FORMATUNKNOWN); + } + + if (PartEntry->AutoCreate == TRUE) + { + CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_NEWPARTITION)); + +#if 0 + CONSOLE_PrintTextXY(8, 10, "Partition %lu (%I64u %s) %s of", + PartEntry->PartitionNumber, + PartSize, + PartUnit, + PartType); +#endif + + CONSOLE_PrintTextXY(8, 10, MUIGetString(STRING_HDINFOPARTZEROED), + DiskEntry->DiskNumber, + DiskSize, + DiskUnit, + DiskEntry->Port, + DiskEntry->Bus, + DiskEntry->Id, + &DiskEntry->DriverName); + + CONSOLE_SetTextXY(6, 12, MUIGetString(STRING_PARTFORMAT)); + + + PartEntry->AutoCreate = FALSE; + } +#if 0 + else if (PartEntry->New == TRUE) + { + CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_NONFORMATTEDPART)); + CONSOLE_SetTextXY(6, 10, MUIGetString(STRING_PARTFORMAT)); + } +#endif + else + { + CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_INSTALLONPART)); + + if (PartType == NULL) + { + CONSOLE_PrintTextXY(8, 10, + MUIGetString(STRING_HDDINFOUNK4), + (PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter, + (PartEntry->DriveLetter == 0) ? '-' : ':', + PartEntry->PartitionType, + PartSize, + PartUnit); + } + else + { + CONSOLE_PrintTextXY(8, 10, + "%c%c %s %I64u %s", + (PartEntry->DriveLetter == 0) ? '-' : PartEntry->DriveLetter, + (PartEntry->DriveLetter == 0) ? '-' : ':', + PartType, + PartSize, + PartUnit); + } + + CONSOLE_PrintTextXY(6, 12, MUIGetString(STRING_HDINFOPARTEXISTS), + DiskEntry->DiskNumber, + DiskSize, + DiskUnit, + DiskEntry->Port, + DiskEntry->Bus, + DiskEntry->Id, + &DiskEntry->DriverName); + } + + MUIDisplayPage(SELECT_FILE_SYSTEM_PAGE); + + if (FileSystemList != NULL) + { + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; + } + + FileSystemList = CreateFileSystemList(6, 26, FALSE, L"FAT", + PartEntry->PartitionType); + if (FileSystemList == NULL) + { + /* FIXME: show an error dialog */ + return QUIT_PAGE; + } + + DrawFileSystemList(FileSystemList); + + while (TRUE) + { + CONSOLE_ConInKey(Ir); + + if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ + { + if (ConfirmQuit(Ir) == TRUE) + { + return QUIT_PAGE; + } + + break; + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE)) /* ESC */ + { + return SELECT_PARTITION_PAGE; + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ + { + ScrollDownFileSystemList(FileSystemList); + } + else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && + (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */ + { + ScrollUpFileSystemList(FileSystemList); + } + else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */ + { + if (FileSystemList->Selected->FormatFunc) + { + return PRE_INSTALL_FORMAT_PAGE; + } + } + } + + return PRE_INSTALL_SELECT_FORMAT_PAGE; +} + + +static ULONG +PreInstallFormatPage(PINPUT_RECORD Ir) +{ + WCHAR PathBuffer[MAX_PATH]; +// PDISKENTRY DiskEntry; + PPARTENTRY PartEntry; + NTSTATUS Status; + #ifndef NDEBUG ULONG Line; ULONG i; @@ -2867,8 +3293,7 @@ FormatPartitionPage(PINPUT_RECORD Ir) return QUIT_PAGE; } - PartEntry->New = FALSE; - + PartEntry->FormatState = Formatted; } #ifndef NDEBUG @@ -2879,92 +3304,15 @@ FormatPartitionPage(PINPUT_RECORD Ir) DestroyFileSystemList(FileSystemList); FileSystemList = NULL; - if (IsUnattendedSetup || InstallShortcut) - return INSTALL_DIRECTORY_PAGE; - else - return SELECT_PARTITION_PAGE; + return INSTALL_DIRECTORY_PAGE; } } - return FORMAT_PARTITION_PAGE; + return PRE_INSTALL_FORMAT_PAGE; } -static ULONG -CheckFileSystemPage(PINPUT_RECORD Ir) -{ - PFILE_SYSTEM_ITEM CurrentFileSystem; - WCHAR PathBuffer[MAX_PATH]; - CHAR Buffer[MAX_PATH]; - NTSTATUS Status; - /* FIXME: code duplicated in FormatPartitionPage */ - /* Set DestinationRootPath */ - RtlFreeUnicodeString(&DestinationRootPath); - swprintf(PathBuffer, - L"\\Device\\Harddisk%lu\\Partition%lu", - PartitionList->CurrentDisk->DiskNumber, - PartitionList->CurrentPartition->PartitionNumber); - RtlCreateUnicodeString(&DestinationRootPath, PathBuffer); - DPRINT("DestinationRootPath: %wZ\n", &DestinationRootPath); - - CONSOLE_SetTextXY(6, 8, MUIGetString(STRING_CHECKINGPART)); - - CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT)); - - /* WRONG: first filesystem is not necesseraly the one of the current partition! */ - CurrentFileSystem = CONTAINING_RECORD(FileSystemList->ListHead.Flink, FILE_SYSTEM_ITEM, ListEntry); - - if (!CurrentFileSystem->ChkdskFunc) - { - 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->FileSystem); - - PopupError(Buffer, - MUIGetString(STRING_QUITCONTINUE), - NULL, POPUP_WAIT_NONE); - - 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; - else - return CHECK_FILE_SYSTEM_PAGE; - } - else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */ - { - return INSTALL_DIRECTORY_PAGE; - } - } - } - else - { - Status = ChkdskPartition(&DestinationRootPath, CurrentFileSystem); - if (!NT_SUCCESS(Status)) - { - DPRINT("ChkdskPartition() failed with status 0x%08lx\n", Status); - sprintf(Buffer, "Setup failed to verify the selected partition.\n" - "(Status 0x%08lx).\n", Status); - - PopupError(Buffer, - MUIGetString(STRING_REBOOTCOMPUTER), - Ir, POPUP_WAIT_ENTER); - - return QUIT_PAGE; - } - - return INSTALL_DIRECTORY_PAGE; - } -} static PAGE_NUMBER @@ -4278,11 +4626,19 @@ RunUSetup(VOID) break; case FORMAT_PARTITION_PAGE: - Page = (PAGE_NUMBER) FormatPartitionPage(&Ir); + Page = FormatPartitionPage(&Ir); break; case CHECK_FILE_SYSTEM_PAGE: - Page = (PAGE_NUMBER) CheckFileSystemPage(&Ir); + Page = CheckFileSystemPage(&Ir); + break; + + case PRE_INSTALL_SELECT_FORMAT_PAGE: + Page = PreInstallSelectFormatPage(&Ir); + break; + + case PRE_INSTALL_FORMAT_PAGE: + Page = PreInstallFormatPage(&Ir); break; case INSTALL_DIRECTORY_PAGE: diff --git a/reactos/base/setup/usetup/lang/bg-BG.h b/reactos/base/setup/usetup/lang/bg-BG.h index 23dc0bf4d85..ac92febdaa3 100644 --- a/reactos/base/setup/usetup/lang/bg-BG.h +++ b/reactos/base/setup/usetup/lang/bg-BG.h @@ -1753,5 +1753,7 @@ MUI_STRING bgBGStrings[] = "ƒ"}, {STRING_ADDKBLAYOUTS, "„®¡ ¢ï­¥ ­  ª« ¢¨ âãà­¨ ¯®¤à¥¤¡¨"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/bn-BD.h b/reactos/base/setup/usetup/lang/bn-BD.h index 4218262d319..94e097479f6 100644 --- a/reactos/base/setup/usetup/lang/bn-BD.h +++ b/reactos/base/setup/usetup/lang/bn-BD.h @@ -1737,5 +1737,7 @@ MUI_STRING bnBDStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Adding keyboard layouts"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/cs-CZ.h b/reactos/base/setup/usetup/lang/cs-CZ.h index f9612b8917d..eec59fd48ac 100644 --- a/reactos/base/setup/usetup/lang/cs-CZ.h +++ b/reactos/base/setup/usetup/lang/cs-CZ.h @@ -1746,5 +1746,7 @@ MUI_STRING csCZStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Pýid v m rozlo§en¡ kl ves"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/de-DE.h b/reactos/base/setup/usetup/lang/de-DE.h index 7f1e3cc9cc5..c0eb41ed3e9 100644 --- a/reactos/base/setup/usetup/lang/de-DE.h +++ b/reactos/base/setup/usetup/lang/de-DE.h @@ -1742,5 +1742,7 @@ MUI_STRING deDEStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Tastaturlayout hinzufgen"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/el-GR.h b/reactos/base/setup/usetup/lang/el-GR.h index 52f6c3fb0d0..04c5ca918cf 100644 --- a/reactos/base/setup/usetup/lang/el-GR.h +++ b/reactos/base/setup/usetup/lang/el-GR.h @@ -1763,5 +1763,7 @@ MUI_STRING elGRStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "‚夜«˜  §¨¦©Ÿã¡ž «à¤ › ˜«á¥œà¤ §¢ž¡«¨¦¢¦šå¦¬"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/en-US.h b/reactos/base/setup/usetup/lang/en-US.h index 4cdbb45f6b4..96acd712de3 100644 --- a/reactos/base/setup/usetup/lang/en-US.h +++ b/reactos/base/setup/usetup/lang/en-US.h @@ -1737,5 +1737,7 @@ MUI_STRING enUSStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Adding keyboard layouts"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/es-ES.h b/reactos/base/setup/usetup/lang/es-ES.h index c0d0d15425f..76470d2af35 100644 --- a/reactos/base/setup/usetup/lang/es-ES.h +++ b/reactos/base/setup/usetup/lang/es-ES.h @@ -1745,5 +1745,7 @@ MUI_STRING esESStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "A¤adiendo distribuci¢n de teclado"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/et-EE.h b/reactos/base/setup/usetup/lang/et-EE.h index 4104224b58c..9a2cbaaa631 100644 --- a/reactos/base/setup/usetup/lang/et-EE.h +++ b/reactos/base/setup/usetup/lang/et-EE.h @@ -1738,5 +1738,7 @@ MUI_STRING etEEStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Klaviatuuriasetuste lisamine"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/fr-FR.h b/reactos/base/setup/usetup/lang/fr-FR.h index b83f658ebb1..93e95b24b6f 100644 --- a/reactos/base/setup/usetup/lang/fr-FR.h +++ b/reactos/base/setup/usetup/lang/fr-FR.h @@ -1751,5 +1751,7 @@ MUI_STRING frFRStrings[] = "Go"}, {STRING_ADDKBLAYOUTS, "Ajout des dispositions clavier"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/he-IL.h b/reactos/base/setup/usetup/lang/he-IL.h index 8e779f8f62f..fa6fee7728c 100644 --- a/reactos/base/setup/usetup/lang/he-IL.h +++ b/reactos/base/setup/usetup/lang/he-IL.h @@ -1739,5 +1739,7 @@ MUI_STRING heILStrings[] = "‚‰‚„‰‰ˆ"}, {STRING_ADDKBLAYOUTS, "Adding keyboard layouts"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/it-IT.h b/reactos/base/setup/usetup/lang/it-IT.h index 185f91dba15..3d7a4c66aa0 100644 --- a/reactos/base/setup/usetup/lang/it-IT.h +++ b/reactos/base/setup/usetup/lang/it-IT.h @@ -1740,5 +1740,7 @@ MUI_STRING itITStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Aggiunta delle nazionalit… di tastiera"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/ja-JP.h b/reactos/base/setup/usetup/lang/ja-JP.h index 4d11d82a293..336ec63d413 100644 --- a/reactos/base/setup/usetup/lang/ja-JP.h +++ b/reactos/base/setup/usetup/lang/ja-JP.h @@ -1741,5 +1741,7 @@ MUI_STRING jaJPStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "·°ÎÞ°ÄÞ Ú²±³ÄÉ Â²¶ Á­³"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/lt-LT.h b/reactos/base/setup/usetup/lang/lt-LT.h index f24c844c6b4..ae7da24a632 100644 --- a/reactos/base/setup/usetup/lang/lt-LT.h +++ b/reactos/base/setup/usetup/lang/lt-LT.h @@ -1748,5 +1748,7 @@ MUI_STRING ltLTStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Adding keyboard layouts"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/nl-NL.h b/reactos/base/setup/usetup/lang/nl-NL.h index e1e9d45708c..0e49b16ab5a 100644 --- a/reactos/base/setup/usetup/lang/nl-NL.h +++ b/reactos/base/setup/usetup/lang/nl-NL.h @@ -1786,5 +1786,7 @@ MUI_STRING nlNLStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Toevoegen toetsenbordindelingen"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/pl-PL.h b/reactos/base/setup/usetup/lang/pl-PL.h index c212ae50326..629fee41f47 100644 --- a/reactos/base/setup/usetup/lang/pl-PL.h +++ b/reactos/base/setup/usetup/lang/pl-PL.h @@ -1746,5 +1746,7 @@ MUI_STRING plPLStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Dodawanie ukˆad¢w klawiatury"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/pt-BR.h b/reactos/base/setup/usetup/lang/pt-BR.h index 9b32c9ab36f..06960e5182f 100644 --- a/reactos/base/setup/usetup/lang/pt-BR.h +++ b/reactos/base/setup/usetup/lang/pt-BR.h @@ -1777,5 +1777,7 @@ MUI_STRING ptBRStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Adicionando leiautes de teclado"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/ro-RO.h b/reactos/base/setup/usetup/lang/ro-RO.h index d8049e75f0a..03f9e630997 100644 --- a/reactos/base/setup/usetup/lang/ro-RO.h +++ b/reactos/base/setup/usetup/lang/ro-RO.h @@ -1814,5 +1814,7 @@ MUI_STRING roROStrings[] = "Go"}, {STRING_ADDKBLAYOUTS, "AdÇugare configuraîii de tastaturÇ"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/ru-RU.h b/reactos/base/setup/usetup/lang/ru-RU.h index 3c5e824ccbf..faf8554c5da 100644 --- a/reactos/base/setup/usetup/lang/ru-RU.h +++ b/reactos/base/setup/usetup/lang/ru-RU.h @@ -1742,5 +1742,7 @@ MUI_STRING ruRUStrings[] = "ƒ"}, {STRING_ADDKBLAYOUTS, "Adding keyboard layouts"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/sk-SK.h b/reactos/base/setup/usetup/lang/sk-SK.h index f030e282c07..470c1d5ff2e 100644 --- a/reactos/base/setup/usetup/lang/sk-SK.h +++ b/reactos/base/setup/usetup/lang/sk-SK.h @@ -1752,5 +1752,7 @@ MUI_STRING skSKStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Prid vam rozlo§enia kl vesnice"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/sq-AL.h b/reactos/base/setup/usetup/lang/sq-AL.h index e34084161ca..be0b639c650 100644 --- a/reactos/base/setup/usetup/lang/sq-AL.h +++ b/reactos/base/setup/usetup/lang/sq-AL.h @@ -1744,5 +1744,7 @@ MUI_STRING sqALStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "Shtim e p‰rzgjedhjes s‰ tastier‰s"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/sv-SE.h b/reactos/base/setup/usetup/lang/sv-SE.h index 6f1f2fe27a6..20e0494d01f 100644 --- a/reactos/base/setup/usetup/lang/sv-SE.h +++ b/reactos/base/setup/usetup/lang/sv-SE.h @@ -1747,5 +1747,7 @@ MUI_STRING svSEStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "L„gger till tangentbordslayouter"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/tr-TR.h b/reactos/base/setup/usetup/lang/tr-TR.h index 7bb8f98548b..ac2293d9982 100644 --- a/reactos/base/setup/usetup/lang/tr-TR.h +++ b/reactos/base/setup/usetup/lang/tr-TR.h @@ -1725,5 +1725,7 @@ MUI_STRING trTRStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "D§me takm dzenleri ekleniyor..."}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/uk-UA.h b/reactos/base/setup/usetup/lang/uk-UA.h index e83dd37de7e..9b38a6b9346 100644 --- a/reactos/base/setup/usetup/lang/uk-UA.h +++ b/reactos/base/setup/usetup/lang/uk-UA.h @@ -1747,5 +1747,7 @@ MUI_STRING ukUAStrings[] = "GB"}, {STRING_ADDKBLAYOUTS, "„®¤ ¢ ­­ï à®§ª« ¤®ª ª« ¢i âãà¨"}, + {STRING_FORMATPART, + "Setup formats Partition"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/mui.h b/reactos/base/setup/usetup/mui.h index b950a0e9d1b..6dd6ca2da89 100644 --- a/reactos/base/setup/usetup/mui.h +++ b/reactos/base/setup/usetup/mui.h @@ -156,3 +156,5 @@ MUIGetString( #define STRING_MB 54 #define STRING_GB 55 #define STRING_ADDKBLAYOUTS 56 +#define STRING_FORMATPART 62 + diff --git a/reactos/base/setup/usetup/native/fslist.c b/reactos/base/setup/usetup/native/fslist.c index d00a7c91368..67cce11e548 100644 --- a/reactos/base/setup/usetup/native/fslist.c +++ b/reactos/base/setup/usetup/native/fslist.c @@ -2,12 +2,36 @@ BOOLEAN NATIVE_CreateFileSystemList( - IN PFILE_SYSTEM_LIST List) + IN PFILE_SYSTEM_LIST List, + IN UCHAR PartitionType) { - FS_AddProvider(List, L"FAT", VfatFormat, VfatChkdsk); + if (PartitionType == PARTITION_ENTRY_UNUSED || + PartitionType == PARTITION_FAT_12 || + PartitionType == PARTITION_FAT_16 || + PartitionType == PARTITION_HUGE || + PartitionType == PARTITION_XINT13 || + PartitionType == PARTITION_FAT32 || + PartitionType == PARTITION_FAT32_XINT13) + { + FS_AddProvider(List, L"FAT", VfatFormat, VfatChkdsk); + } + #if 0 - FS_AddProvider(List, L"EXT2", Ext2Format, Ext2Chkdsk); + if (PartitionType == PARTITION_ENTRY_UNUSED || + PartitionType == PARTITION_EXT2) + { + FS_AddProvider(List, L"EXT2", Ext2Format, Ext2Chkdsk); + } #endif + +#if 0 + if (PartitionType == PARTITION_ENTRY_UNUSED || + PartitionType == PARTITION_IFS) + { + FS_AddProvider(List, L"NTFS", NtfsFormat, NtfsChkdsk); + } +#endif + return TRUE; } diff --git a/reactos/base/setup/usetup/partlist.c b/reactos/base/setup/usetup/partlist.c index f111d8a57d5..6eb8632271d 100644 --- a/reactos/base/setup/usetup/partlist.c +++ b/reactos/base/setup/usetup/partlist.c @@ -558,7 +558,7 @@ AddPartitionToDisk( if (IsContainerPartition(PartEntry->PartitionType)) { - PartEntry->FormatState = Unformatted; + PartEntry->FormatState = Formatted; if (LogicalPartition == FALSE && DiskEntry->ExtendedPartition == NULL) DiskEntry->ExtendedPartition = PartEntry; @@ -1499,11 +1499,7 @@ PrintPartitionData( { /* Determine partition type */ PartType = NULL; - if (PartEntry->New == TRUE) - { - PartType = MUIGetString(STRING_UNFORMATTED); - } - else if (PartEntry->IsPartitioned == TRUE) + if (PartEntry->IsPartitioned == TRUE) { if ((PartEntry->PartitionType == PARTITION_FAT_12) || (PartEntry->PartitionType == PARTITION_FAT_16) || @@ -2386,7 +2382,6 @@ DPRINT1("Convert existing partition entry\n"); PartEntry->PartitionType = PARTITION_ENTRY_UNUSED; PartEntry->FormatState = Unformatted; PartEntry->AutoCreate = AutoCreate; - PartEntry->New = TRUE; PartEntry->BootIndicator = FALSE; DPRINT1("First Sector: %I64u\n", PartEntry->StartSector.QuadPart); @@ -2420,7 +2415,6 @@ DPRINT1("First Sector: %I64u\n", NewPartEntry->StartSector.QuadPart); DPRINT1("Last Sector: %I64u\n", NewPartEntry->StartSector.QuadPart + NewPartEntry->SectorCount.QuadPart - 1); DPRINT1("Total Sectors: %I64u\n", NewPartEntry->SectorCount.QuadPart); - NewPartEntry->New = TRUE; NewPartEntry->FormatState = Unformatted; NewPartEntry->BootIndicator = FALSE; @@ -2505,7 +2499,6 @@ DPRINT1("Convert existing partition entry\n"); PartEntry->IsPartitioned = TRUE; PartEntry->FormatState = Formatted; PartEntry->AutoCreate = FALSE; - PartEntry->New = FALSE; PartEntry->BootIndicator = FALSE; if (PartEntry->StartSector.QuadPart < 1450560) @@ -2547,7 +2540,6 @@ DPRINT1("Add new partition entry\n"); NewPartEntry->SectorCount.QuadPart = Align(NewPartEntry->StartSector.QuadPart + SectorCount, DiskEntry->SectorAlignment) - NewPartEntry->StartSector.QuadPart; - NewPartEntry->New = FALSE; NewPartEntry->FormatState = Formatted; NewPartEntry->BootIndicator = FALSE; diff --git a/reactos/base/setup/usetup/partlist.h b/reactos/base/setup/usetup/partlist.h index 9db6c8e2840..8b54a90a16d 100644 --- a/reactos/base/setup/usetup/partlist.h +++ b/reactos/base/setup/usetup/partlist.h @@ -63,7 +63,7 @@ typedef struct _PARTENTRY BOOLEAN IsPartitioned; /* Partition is new. Table does not exist on disk yet */ - BOOLEAN New; +// BOOLEAN New; /* Partition was created automatically. */ BOOLEAN AutoCreate; diff --git a/reactos/base/setup/usetup/usetup.h b/reactos/base/setup/usetup/usetup.h index cc9019f101c..187d0f07664 100644 --- a/reactos/base/setup/usetup/usetup.h +++ b/reactos/base/setup/usetup/usetup.h @@ -138,8 +138,11 @@ typedef enum _PAGE_NUMBER FORMAT_PARTITION_PAGE, CHECK_FILE_SYSTEM_PAGE, - PREPARE_COPY_PAGE, + PRE_INSTALL_SELECT_FORMAT_PAGE, + PRE_INSTALL_FORMAT_PAGE, + INSTALL_DIRECTORY_PAGE, + PREPARE_COPY_PAGE, FILE_COPY_PAGE, REGISTRY_PAGE, BOOT_LOADER_PAGE,