https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a5431030681038941cff30...
commit a5431030681038941cff3037a6b48c35e1ac1b2a Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Mon Feb 25 20:29:16 2019 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun Mar 10 15:41:25 2019 +0100
[USETUP] Improve the formatter & check-disk state machine. CORE-7749
- Find or set the active system partition only once, when we start the formatting stage. If the system partition is to be created in some non-partitioned space, we create it.
- A file-system check is always scheduled for both the system and the installation partitions.
- If the system partition was already formatted (which usually means that it already existed on the system), don't ask for formatting it.
CORE-13205
- For each partition to be formatted, the file-system menu list is re-created, in order to display only the FSes that are compatible with the selected partition, and allow to give the user the choice to keep the existing file-system only if the selected partition was already formatted.
- Check whether the user attempts to delete the partition on which the installation source is present, only if it is not "new" and is formatted.
- Check first whether the current partition is the system partition, before displaying the CONFIRM_DELETE_SYSTEM_PARTITION_PAGE. --- base/setup/usetup/partlist.c | 3 +- base/setup/usetup/partlist.h | 11 +- base/setup/usetup/usetup.c | 419 ++++++++++++++++++++++++++++--------------- 3 files changed, 287 insertions(+), 146 deletions(-)
diff --git a/base/setup/usetup/partlist.c b/base/setup/usetup/partlist.c index 7ad044c1c6..2c0cd5a55a 100644 --- a/base/setup/usetup/partlist.c +++ b/base/setup/usetup/partlist.c @@ -16,7 +16,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* COPYRIGHT: See COPYING in the top level directory +/* + * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: base/setup/usetup/partlist.c * PURPOSE: Partition list functions diff --git a/base/setup/usetup/partlist.h b/base/setup/usetup/partlist.h index c07b993497..87c9959854 100644 --- a/base/setup/usetup/partlist.h +++ b/base/setup/usetup/partlist.h @@ -16,7 +16,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* COPYRIGHT: See COPYING in the top level directory +/* + * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS text-mode setup * FILE: base/setup/usetup/partlist.h * PURPOSE: Partition list functions @@ -34,10 +35,10 @@ typedef enum _FORMATMACHINESTATE FormatInstallPartition, FormatOtherPartition, FormatDone, - CheckSystemPartition, - CheckInstallPartition, - CheckOtherPartition, - CheckDone + // CheckSystemPartition, + // CheckInstallPartition, + // CheckOtherPartition, + // CheckDone } FORMATMACHINESTATE, *PFORMATMACHINESTATE;
typedef struct _PARTLIST_UI diff --git a/base/setup/usetup/usetup.c b/base/setup/usetup/usetup.c index 555d37e83a..c030d07ff3 100644 --- a/base/setup/usetup/usetup.c +++ b/base/setup/usetup/usetup.c @@ -57,9 +57,14 @@ static WCHAR DefaultKBLayout[20]; // Copy of string inside KeyboardList
static BOOLEAN RepairUpdateFlag = FALSE;
+/* Global partition list on the system */ static PPARTLIST PartitionList = NULL; -static PPARTENTRY TempPartition = NULL; + +/* List of currently supported file systems for the partition to be formatted */ static PFILE_SYSTEM_LIST FileSystemList = NULL; + +/* Machine state for the formatter */ +static PPARTENTRY TempPartition = NULL; static FORMATMACHINESTATE FormatState = Start;
/*****************************************************/ @@ -798,7 +803,7 @@ RepairIntroPage(PINPUT_RECORD Ir) { MUIDisplayPage(REPAIR_INTRO_PAGE);
- while(TRUE) + while (TRUE) { CONSOLE_ConInKey(Ir);
@@ -858,6 +863,7 @@ UpgradeRepairPage(PINPUT_RECORD Ir) return QUIT_PAGE; }
+ /* Reset the formatter machine state */ TempPartition = NULL; FormatState = Start; } @@ -1461,6 +1467,7 @@ SelectPartitionPage(PINPUT_RECORD Ir) return QUIT_PAGE; }
+ /* Reset the formatter machine state */ TempPartition = NULL; FormatState = Start; } @@ -1690,8 +1697,8 @@ SelectPartitionPage(PINPUT_RECORD Ir) } else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */ { - WCHAR PathBuffer[MAX_PATH]; UNICODE_STRING CurrentPartition; + WCHAR PathBuffer[MAX_PATH];
if (PartitionList->CurrentPartition->IsPartitioned == FALSE) { @@ -1699,27 +1706,34 @@ SelectPartitionPage(PINPUT_RECORD Ir) return SELECT_PARTITION_PAGE; }
- RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer), - L"\Device\Harddisk%lu\Partition%lu\", - PartitionList->CurrentDisk->DiskNumber, - PartitionList->CurrentPartition->PartitionNumber); - RtlInitUnicodeString(&CurrentPartition, PathBuffer); - - /* - * Check whether the user attempts to delete the partition on which - * the installation source is present. If so, fail with an error. - */ - // &USetupData.SourceRootPath - if (RtlPrefixUnicodeString(&CurrentPartition, &USetupData.SourcePath, TRUE)) +// TODO: Do something similar before trying to format the partition? + if (!PartitionList->CurrentPartition->New && + PartitionList->CurrentPartition->FormatState != Unformatted) { - PopupError("You cannot delete the partition containing the installation source!", - MUIGetString(STRING_CONTINUE), - Ir, POPUP_WAIT_ENTER); - return SELECT_PARTITION_PAGE; + ASSERT(PartitionList->CurrentPartition->PartitionNumber != 0); + + RtlStringCchPrintfW(PathBuffer, ARRAYSIZE(PathBuffer), + L"\Device\Harddisk%lu\Partition%lu\", + PartitionList->CurrentDisk->DiskNumber, + PartitionList->CurrentPartition->PartitionNumber); + RtlInitUnicodeString(&CurrentPartition, PathBuffer); + + /* + * Check whether the user attempts to delete the partition on which + * the installation source is present. If so, fail with an error. + */ + // &USetupData.SourceRootPath + if (RtlPrefixUnicodeString(&CurrentPartition, &USetupData.SourcePath, TRUE)) + { + PopupError("You cannot delete the partition containing the installation source!", + MUIGetString(STRING_CONTINUE), + Ir, POPUP_WAIT_ENTER); + return SELECT_PARTITION_PAGE; + } }
- if (PartitionList->CurrentPartition->BootIndicator || - PartitionList->CurrentPartition == PartitionList->SystemPartition) + if (PartitionList->CurrentPartition == PartitionList->SystemPartition || + PartitionList->CurrentPartition->BootIndicator) { return CONFIRM_DELETE_SYSTEM_PARTITION_PAGE; } @@ -1733,7 +1747,7 @@ SelectPartitionPage(PINPUT_RECORD Ir)
#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 @@ -2485,6 +2499,7 @@ DeletePartitionPage(PINPUT_RECORD Ir)
MUIDisplayPage(DELETE_PARTITION_PAGE);
+ /* Adjust partition type */ GetPartTypeStringFromPartitionType(PartEntry->PartitionType, PartTypeString, ARRAYSIZE(PartTypeString)); @@ -2596,7 +2611,6 @@ DeletePartitionPage(PINPUT_RECORD Ir) else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */ { DeleteCurrentPartition(PartitionList); - return SELECT_PARTITION_PAGE; } } @@ -2605,6 +2619,16 @@ DeletePartitionPage(PINPUT_RECORD Ir) }
+static VOID +ResetFileSystemList(VOID) +{ + if (!FileSystemList) + return; + + DestroyFileSystemList(FileSystemList); + FileSystemList = NULL; +} + /* * Displays the SelectFileSystemPage. * @@ -2634,6 +2658,7 @@ SelectFileSystemPage(PINPUT_RECORD Ir) PCHAR PartUnit; CHAR PartTypeString[32]; FORMATMACHINESTATE PreviousFormatState; + PCWSTR DefaultFs;
DPRINT("SelectFileSystemPage()\n");
@@ -2645,31 +2670,101 @@ SelectFileSystemPage(PINPUT_RECORD Ir) 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); + 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. + */ + PartitionList->CurrentPartition->NeedsCheck = TRUE; + if (PartitionList->SystemPartition != PartitionList->CurrentPartition) + 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 != PartitionList->CurrentPartition) && + (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"); } @@ -2678,6 +2773,16 @@ SelectFileSystemPage(PINPUT_RECORD Ir) TempPartition = PartitionList->CurrentPartition; TempPartition->NeedsCheck = TRUE;
+ if (PartitionList->SystemPartition != PartitionList->CurrentPartition) + { + /* 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"); } @@ -2695,6 +2800,7 @@ SelectFileSystemPage(PINPUT_RECORD Ir) }
case FormatInstallPartition: + case FormatOtherPartition: { if (GetNextUnformattedPartition(PartitionList, NULL, @@ -2702,34 +2808,30 @@ SelectFileSystemPage(PINPUT_RECORD Ir) { 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: @@ -2866,54 +2968,47 @@ SelectFileSystemPage(PINPUT_RECORD Ir) "RAW"); }
- if (FileSystemList == NULL) + ASSERT(FileSystemList == NULL); + + if (IsUnattendedSetup) { - PWSTR DefaultFs; + ASSERT(USetupData.FormatPartition);
- if (IsUnattendedSetup) + switch (USetupData.FsType) { - switch (USetupData.FsType) - { - /* 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"; - } + /* 1 is for BtrFS */ + case 1: + DefaultFs = L"BTRFS"; + break;
- /* Create the file system list */ - FileSystemList = CreateFileSystemList(6, 26, PartEntry->New, DefaultFs); - if (FileSystemList == NULL) - { - /* FIXME: show an error dialog */ - return QUIT_PAGE; + /* 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 (USetupData.FormatPartition) - { - return FORMAT_PARTITION_PAGE; - } - - return CHECK_FILE_SYSTEM_PAGE; + ASSERT(USetupData.FormatPartition); + return FORMAT_PARTITION_PAGE; }
DrawFileSystemList(FileSystemList); @@ -2926,14 +3021,24 @@ SelectFileSystemPage(PINPUT_RECORD Ir) (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ { 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) && @@ -2949,9 +3054,27 @@ SelectFileSystemPage(PINPUT_RECORD Ir) 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 != PartitionList->CurrentPartition) + { + PartEntry->NeedsCheck = FALSE; + } + return SELECT_FILE_SYSTEM_PAGE; + } else + { + /* Format this partition */ return FORMAT_PARTITION_PAGE; + } } }
@@ -3014,15 +3137,17 @@ FormatPartitionPage(PINPUT_RECORD Ir) while (TRUE) { if (!IsUnattendedSetup) - { 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; + }
break; } @@ -3033,6 +3158,10 @@ FormatPartitionPage(PINPUT_RECORD Ir) if (!PreparePartitionForFormatting(PartEntry, SelectedFileSystem->FileSystem)) { /* FIXME: show an error dialog */ + + /* Reset the filesystem list */ + ResetFileSystemList(); + return QUIT_PAGE; }
@@ -3064,10 +3193,17 @@ FormatPartitionPage(PINPUT_RECORD Ir) #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; }
@@ -3080,54 +3216,65 @@ FormatPartitionPage(PINPUT_RECORD Ir) 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->FileSystem, - SelectedFileSystem->QuickFormat); - if (Status == STATUS_NOT_SUPPORTED) + 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) { - 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) - { - CONSOLE_ConInKey(Ir); + CONSOLE_ConInKey(Ir);
- if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00 && - Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3) /* F3 */ + if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00 && + Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3) /* F3 */ + { + if (ConfirmQuit(Ir)) { - if (ConfirmQuit(Ir)) - return QUIT_PAGE; - else - return SELECT_FILE_SYSTEM_PAGE; + /* Reset the filesystem list */ + ResetFileSystemList(); + return QUIT_PAGE; } - else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */ + 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); - return QUIT_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); @@ -3234,7 +3381,6 @@ CheckFileSystemPage(PINPUT_RECORD Ir) } else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */ { - PartEntry->NeedsCheck = FALSE; return CHECK_FILE_SYSTEM_PAGE; } } @@ -3347,11 +3493,7 @@ InstallDirectoryPage(PINPUT_RECORD Ir) NTSTATUS Status;
/* We do not need the filesystem list anymore */ - if (FileSystemList != NULL) - { - DestroyFileSystemList(FileSystemList); - FileSystemList = NULL; - } + ResetFileSystemList();
if (PartitionList == NULL || PartitionList->CurrentDisk == NULL || @@ -4511,15 +4653,12 @@ QuitPage(PINPUT_RECORD Ir) PartitionList = NULL; }
+ /* Reset the formatter machine state */ TempPartition = NULL; FormatState = Start;
/* Destroy the filesystem list */ - if (FileSystemList != NULL) - { - DestroyFileSystemList(FileSystemList); - FileSystemList = NULL; - } + ResetFileSystemList();
CONSOLE_SetStatusText(MUIGetString(STRING_REBOOTCOMPUTER2));