diff --git a/reactos/base/system/CMakeLists.txt b/reactos/base/system/CMakeLists.txt index e92a5066749..2afca0775b4 100644 --- a/reactos/base/system/CMakeLists.txt +++ b/reactos/base/system/CMakeLists.txt @@ -1,6 +1,7 @@ add_subdirectory(autochk) add_subdirectory(bootok) +add_subdirectory(chkdsk) add_subdirectory(diskpart) add_subdirectory(expand) add_subdirectory(format) diff --git a/reactos/base/system/autochk/autochk.c b/reactos/base/system/autochk/autochk.c index 4fa58ce782a..88b9b0849dc 100644 --- a/reactos/base/system/autochk/autochk.c +++ b/reactos/base/system/autochk/autochk.c @@ -1,4 +1,5 @@ -/* PROJECT: ReactOS Kernel +/* + * PROJECT: ReactOS Kernel * LICENSE: GPL - See COPYING in the top level directory * FILE: base/system/autochk/autochk.c * PURPOSE: Filesystem checker diff --git a/reactos/base/system/chkdsk/chkdsk.c b/reactos/base/system/chkdsk/chkdsk.c index 2c6909fba29..5edf7d618a9 100644 --- a/reactos/base/system/chkdsk/chkdsk.c +++ b/reactos/base/system/chkdsk/chkdsk.c @@ -4,7 +4,7 @@ // // Copyright (c) 1998 Mark Russinovich // Systems Internals -// http://www.sysinternals.com/ +// http://www.sysinternals.com // // Chkdsk clone that demonstrates the use of the FMIFS file system // utility library. @@ -43,10 +43,14 @@ /* PSDK/NDK Headers */ #define WIN32_NO_STATUS -#include +#include +#include +#include #define NTOS_MODE_USER #include + +/* FMIFS Public Header */ #include #define FMIFS_IMPORT_DLL @@ -118,9 +122,8 @@ CtrlCIntercept(DWORD dwCtrlType) // // Tell the user how to use the program // -// 19990216 EA Missing printf %s argument //---------------------------------------------------------------------- -VOID +static VOID Usage(PWCHAR ProgramName) { wprintf(L"Usage: %s [drive:] [-F] [-V] [-R] [-C]\n\n" @@ -140,7 +143,7 @@ Usage(PWCHAR ProgramName) // Get the switches. // //---------------------------------------------------------------------- -int +static int ParseCommandLine( int argc, WCHAR *argv[] @@ -160,9 +163,9 @@ ParseCommandLine( switch (argv[i][1]) { - case L'?': - Usage(argv[0]); - break; + // case L'?': + // Usage(argv[0]); + // return i; case L'F': case L'f': { @@ -309,7 +312,7 @@ ChkdskCallback( case DONE: status = (PBOOLEAN)Argument; - if (*status == TRUE) + if (*status == FALSE) { wprintf(L"Chkdsk was unable to complete successfully.\n\n"); Error = TRUE; @@ -329,7 +332,7 @@ ChkdskCallback( // 19990216 EA Used wide functions // //---------------------------------------------------------------------- -BOOLEAN +static BOOLEAN LoadFMIFSEntryPoints(VOID) { HMODULE hFmifs = LoadLibraryW(L"fmifs.dll"); diff --git a/reactos/dll/win32/fmifs/chkdsk.c b/reactos/dll/win32/fmifs/chkdsk.c index 60edaca659b..ba6839ff181 100644 --- a/reactos/dll/win32/fmifs/chkdsk.c +++ b/reactos/dll/win32/fmifs/chkdsk.c @@ -2,13 +2,16 @@ * COPYRIGHT: See COPYING in the top level directory * PROJECT: File Management IFS Utility functions * FILE: reactos/dll/win32/fmifs/chkdsk.c - * PURPOSE: Chkdsk + * PURPOSE: Disk Checker * - * PROGRAMMERS: (none) + * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr) */ #include "precomp.h" +#define NDEBUG +#include + /* FMIFS.1 */ VOID NTAPI @@ -23,12 +26,44 @@ Chkdsk( IN PVOID Unused3, IN PFMIFSCALLBACK Callback) { + PIFS_PROVIDER Provider; + UNICODE_STRING usDriveRoot; BOOLEAN Argument = FALSE; + WCHAR VolumeName[MAX_PATH]; + //CURDIR CurDir; - /* FAIL immediately */ - Callback(DONE, /* Command */ - 0, /* DWORD Modifier */ - &Argument);/* Argument */ + Provider = GetProvider(Format); + if (!Provider) + { + /* Unknown file system */ + Callback(DONE, 0, &Argument); + return; + } + +#if 1 + DPRINT1("Warning: use GetVolumeNameForVolumeMountPointW() instead!\n"); + swprintf(VolumeName, L"\\??\\%c:", towupper(DriveRoot[0])); + RtlCreateUnicodeString(&usDriveRoot, VolumeName); + /* Code disabled as long as our storage stack doesn't understand IOCTL_MOUNTDEV_QUERY_DEVICE_NAME */ +#else + if (!GetVolumeNameForVolumeMountPointW(DriveRoot, VolumeName, MAX_PATH) || + !RtlDosPathNameToNtPathName_U(VolumeName, &usDriveRoot, NULL, &CurDir)) + { + /* Report an error. */ + Callback(DONE, 0, &Argument); + return; + } +#endif + + DPRINT("ChkdskEx - %S\n", Format); + Provider->ChkdskEx(&usDriveRoot, + CorrectErrors, + Verbose, + CheckOnlyIfDirty, + ScanDrive, + Callback); + + RtlFreeUnicodeString(&usDriveRoot); } /* EOF */ diff --git a/reactos/dll/win32/fmifs/format.c b/reactos/dll/win32/fmifs/format.c index 9aed4196c26..266002e08a3 100644 --- a/reactos/dll/win32/fmifs/format.c +++ b/reactos/dll/win32/fmifs/format.c @@ -55,9 +55,7 @@ FormatEx( if (!Provider) { /* Unknown file system */ - Callback(DONE, /* Command */ - 0, /* DWORD Modifier */ - &Argument); /* Argument */ + Callback(DONE, 0, &Argument); return; } @@ -71,9 +69,7 @@ FormatEx( !RtlDosPathNameToNtPathName_U(VolumeName, &usDriveRoot, NULL, &CurDir)) { /* Report an error. */ - Callback(DONE, /* Command */ - 0, /* DWORD Modifier */ - &Argument); /* Argument */ + Callback(DONE, 0, &Argument); return; } #endif diff --git a/reactos/dll/win32/fmifs/init.c b/reactos/dll/win32/fmifs/init.c index 0fe8bc051cf..e895f5ef9ca 100644 --- a/reactos/dll/win32/fmifs/init.c +++ b/reactos/dll/win32/fmifs/init.c @@ -167,9 +167,7 @@ InitializeFmIfs( if (FmIfsInitialized == FALSE) { if (InitializeFmIfsOnce() == FALSE) - { - return FALSE; - } + return FALSE; FmIfsInitialized = TRUE; }