Implement "Check volume" page in usetup.

Doesn't work yet because VfatChkdsk() is not implemented

svn path=/trunk/; revision=24000
This commit is contained in:
Hervé Poussineau 2006-09-09 17:11:03 +00:00
parent 07f8340c15
commit 8e420b3974
7 changed files with 205 additions and 56 deletions

View file

@ -0,0 +1,86 @@
/*
* ReactOS kernel
* Copyright (C) 2006 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS text-mode setup
* FILE: subsys/system/usetup/chkdsk.c
* PURPOSE: Filesystem chkdsk support functions
* PROGRAMMER: Hervé Poussineau (hpoussin@reactos.org)
*/
/* INCLUDES *****************************************************************/
#include "usetup.h"
#define NDEBUG
#include <debug.h>
static PPROGRESSBAR ChkdskProgressBar = NULL;
/* FUNCTIONS ****************************************************************/
static BOOLEAN NTAPI
ChkdskCallback(
IN CALLBACKCOMMAND Command,
IN ULONG Modifier,
IN PVOID Argument)
{
switch (Command)
{
default:
DPRINT("Unknown callback %lu\n", (ULONG)Command);
break;
}
return TRUE;
}
NTSTATUS
ChkdskPartition(
IN PUNICODE_STRING DriveRoot,
IN PFILE_SYSTEM_ITEM FileSystem)
{
NTSTATUS Status;
if (!FileSystem->ChkdskFunc)
return STATUS_NOT_SUPPORTED;
ChkdskProgressBar = CreateProgressBar(6,
yScreen - 14,
xScreen - 7,
yScreen - 10,
"Setup is checking your disk");
ProgressSetStepCount(ChkdskProgressBar, 100);
Status = FileSystem->ChkdskFunc(DriveRoot,
TRUE, /* FixErrors */
FALSE, /* Verbose */
FALSE, /* CheckOnlyIfDirty */
FALSE, /* ScanDrive */
ChkdskCallback); /* Callback */
DestroyProgressBar(ChkdskProgressBar);
ChkdskProgressBar = NULL;
DPRINT("ChkdskPartition() finished with status 0x%08lx\n", Status);
return Status;
}
/* EOF */

View file

@ -0,0 +1,36 @@
/*
* ReactOS kernel
* Copyright (C) 2006 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS text-mode setup
* FILE: subsys/system/usetup/chkdsk.h
* PURPOSE: Filesystem chkdsk support functions
* PROGRAMMER: Hervé Poussineau (hpoussin@reactos.org)
*/
#ifndef __CHKDSK_H__
#define __CHKDSK_H__
NTSTATUS
ChkdskPartition(
IN PUNICODE_STRING DriveRoot,
IN PFILE_SYSTEM_ITEM FileSystem);
#endif /* __CHKDSK_H__ */
/* EOF */

View file

@ -30,7 +30,7 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
PPROGRESSBAR ProgressBar = NULL; static PPROGRESSBAR FormatProgressBar = NULL;
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
@ -49,7 +49,7 @@ FormatCallback(
Percent = (PULONG)Argument; Percent = (PULONG)Argument;
DPRINT("%lu percent completed\n", *Percent); DPRINT("%lu percent completed\n", *Percent);
ProgressSetStep(ProgressBar, *Percent); ProgressSetStep(FormatProgressBar, *Percent);
break; break;
} }
@ -89,13 +89,16 @@ FormatPartition(
{ {
NTSTATUS Status; NTSTATUS Status;
ProgressBar = CreateProgressBar(6, if (!FileSystem->FormatFunc)
return STATUS_NOT_SUPPORTED;
FormatProgressBar = CreateProgressBar(6,
yScreen - 14, yScreen - 14,
xScreen - 7, xScreen - 7,
yScreen - 10, yScreen - 10,
"Setup is formatting your disk"); "Setup is formatting your disk");
ProgressSetStepCount(ProgressBar, 100); ProgressSetStepCount(FormatProgressBar, 100);
Status = FileSystem->FormatFunc(DriveRoot, Status = FileSystem->FormatFunc(DriveRoot,
FMIFS_HARDDISK, /* MediaFlag */ FMIFS_HARDDISK, /* MediaFlag */
@ -104,10 +107,10 @@ FormatPartition(
0, /* ClusterSize */ 0, /* ClusterSize */
FormatCallback); /* Callback */ FormatCallback); /* Callback */
DestroyProgressBar(ProgressBar); DestroyProgressBar(FormatProgressBar);
ProgressBar = NULL; FormatProgressBar = NULL;
DPRINT("FormatEx() finished with status 0x%08lx\n", Status); DPRINT("FormatPartition() finished with status 0x%08lx\n", Status);
return Status; return Status;
} }

View file

@ -85,7 +85,7 @@ CreateFileSystemList(
List->Selected = NULL; List->Selected = NULL;
InitializeListHead(&List->ListHead); InitializeListHead(&List->ListHead);
AddProvider(List, "FAT", VfatFormat, NULL); AddProvider(List, "FAT", VfatFormat, VfatChkdsk);
if (!ForceFormat) if (!ForceFormat)
{ {
/* Add 'Keep' provider */ /* Add 'Keep' provider */

View file

@ -2419,62 +2419,84 @@ FormatPartitionPage (PINPUT_RECORD Ir)
static ULONG static ULONG
CheckFileSystemPage(PINPUT_RECORD Ir) CheckFileSystemPage(PINPUT_RECORD Ir)
{ {
PFILE_SYSTEM_ITEM CurrentFileSystem;
WCHAR PathBuffer[MAX_PATH]; WCHAR PathBuffer[MAX_PATH];
CHAR Buffer[MAX_PATH];
NTSTATUS Status;
CONSOLE_SetTextXY(6, 8, "Check file system"); /* FIXME: code duplicated in FormatPartitionPage */
CONSOLE_SetTextXY(6, 10, "At present, ReactOS can not check file systems.");
CONSOLE_SetStatusText(" Please wait ...");
CONSOLE_SetStatusText(" ENTER = Continue F3 = Quit");
/* Set DestinationRootPath */ /* Set DestinationRootPath */
RtlFreeUnicodeString (&DestinationRootPath); RtlFreeUnicodeString(&DestinationRootPath);
swprintf (PathBuffer, swprintf(PathBuffer,
L"\\Device\\Harddisk%lu\\Partition%lu", L"\\Device\\Harddisk%lu\\Partition%lu",
PartitionList->CurrentDisk->DiskNumber, PartitionList->CurrentDisk->DiskNumber,
PartitionList->CurrentPartition->PartInfo[0].PartitionNumber); PartitionList->CurrentPartition->PartInfo[0].PartitionNumber);
RtlCreateUnicodeString (&DestinationRootPath, RtlCreateUnicodeString(&DestinationRootPath, PathBuffer);
PathBuffer); DPRINT("DestinationRootPath: %wZ\n", &DestinationRootPath);
DPRINT ("DestinationRootPath: %wZ\n", &DestinationRootPath);
/* Set SystemRootPath */ /* Set SystemRootPath */
RtlFreeUnicodeString (&SystemRootPath); RtlFreeUnicodeString(&SystemRootPath);
swprintf (PathBuffer, swprintf(PathBuffer,
L"\\Device\\Harddisk%lu\\Partition%lu", L"\\Device\\Harddisk%lu\\Partition%lu",
PartitionList->ActiveBootDisk->DiskNumber, PartitionList->ActiveBootDisk->DiskNumber,
PartitionList->ActiveBootPartition->PartInfo[0].PartitionNumber); PartitionList->ActiveBootPartition->PartInfo[0].PartitionNumber);
RtlCreateUnicodeString (&SystemRootPath, RtlCreateUnicodeString(&SystemRootPath, PathBuffer);
PathBuffer); DPRINT("SystemRootPath: %wZ\n", &SystemRootPath);
DPRINT ("SystemRootPath: %wZ\n", &SystemRootPath);
CONSOLE_SetTextXY(6, 8, "Setup is now checking the selected partition.");
if (IsUnattendedSetup) CONSOLE_SetStatusText(" Please wait...");
/* 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)
{ {
return(INSTALL_DIRECTORY_PAGE); 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,
"F3= Quit ENTER = Continue",
NULL, POPUP_WAIT_NONE);
while(TRUE) while(TRUE)
{ {
CONSOLE_ConInKey(Ir); CONSOLE_ConInKey(Ir);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x00
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */ && Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3) /* F3 */
{ {
if (ConfirmQuit(Ir) == TRUE) if (ConfirmQuit(Ir))
return(QUIT_PAGE); return QUIT_PAGE;
break; else
return CHECK_FILE_SYSTEM_PAGE;
} }
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ else if (Ir->Event.KeyEvent.uChar.AsciiChar == VK_RETURN) /* ENTER */
{ {
return(INSTALL_DIRECTORY_PAGE); 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,
"ENTER = Reboot computer",
Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
return(CHECK_FILE_SYSTEM_PAGE); return INSTALL_DIRECTORY_PAGE;
}
} }

View file

@ -65,6 +65,7 @@
#include "keytrans.h" #include "keytrans.h"
#include "registry.h" #include "registry.h"
#include "fslist.h" #include "fslist.h"
#include "chkdsk.h"
#include "format.h" #include "format.h"
#include "cabinet.h" #include "cabinet.h"
#include "filesup.h" #include "filesup.h"

View file

@ -13,10 +13,11 @@
<library>inflib</library> <library>inflib</library>
<library>vfatlib</library> <library>vfatlib</library>
<library>ntdll</library> <library>ntdll</library>
<!--pch>usetup.h</pch--> <pch>usetup.h</pch>
<compilationunit name="unit.c"> <compilationunit name="unit.c">
<file>bootsup.c</file> <file>bootsup.c</file>
<file>cabinet.c</file> <file>cabinet.c</file>
<file>chkdsk.c</file>
<file>console.c</file> <file>console.c</file>
<file>drivesup.c</file> <file>drivesup.c</file>
<file>filequeue.c</file> <file>filequeue.c</file>