[FMIFS]: Quickly implement the chkdsk function, the same way as it is done for the formatting function.
svn path=/trunk/; revision=70869
add_subdirectory(autochk)
add_subdirectory(bootok)
+add_subdirectory(chkdsk)
add_subdirectory(diskpart)
add_subdirectory(expand)
add_subdirectory(format)
-/* PROJECT: ReactOS Kernel
+/*
+ * PROJECT: ReactOS Kernel
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/system/autochk/autochk.c
* PURPOSE: Filesystem checker
//
// 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.
/* PSDK/NDK Headers */
#define WIN32_NO_STATUS
-#include <windows.h>
+#include <windef.h>
+#include <winbase.h>
+#include <wincon.h>
#define NTOS_MODE_USER
#include <ndk/ntndk.h>
+
+/* FMIFS Public Header */
#include <fmifs/fmifs.h>
#define FMIFS_IMPORT_DLL
//
// 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"
// Get the switches.
//
//----------------------------------------------------------------------
-int
+static int
ParseCommandLine(
int argc,
WCHAR *argv[]
switch (argv[i][1])
{
- case L'?':
- Usage(argv[0]);
- break;
+ // case L'?':
+ // Usage(argv[0]);
+ // return i;
case L'F': case L'f':
{
case DONE:
status = (PBOOLEAN)Argument;
- if (*status == TRUE)
+ if (*status == FALSE)
{
wprintf(L"Chkdsk was unable to complete successfully.\n\n");
Error = TRUE;
// 19990216 EA Used wide functions
//
//----------------------------------------------------------------------
-BOOLEAN
+static BOOLEAN
LoadFMIFSEntryPoints(VOID)
{
HMODULE hFmifs = LoadLibraryW(L"fmifs.dll");
* 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 <debug.h>
+
/* FMIFS.1 */
VOID
NTAPI
IN PVOID Unused3,
IN PFMIFSCALLBACK Callback)
{
+ PIFS_PROVIDER Provider;
+ UNICODE_STRING usDriveRoot;
BOOLEAN Argument = FALSE;
+ WCHAR VolumeName[MAX_PATH];
+ //CURDIR CurDir;
+
+ 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);
- /* FAIL immediately */
- Callback(DONE, /* Command */
- 0, /* DWORD Modifier */
- &Argument);/* Argument */
+ RtlFreeUnicodeString(&usDriveRoot);
}
/* EOF */
if (!Provider)
{
/* Unknown file system */
- Callback(DONE, /* Command */
- 0, /* DWORD Modifier */
- &Argument); /* Argument */
+ Callback(DONE, 0, &Argument);
return;
}
!RtlDosPathNameToNtPathName_U(VolumeName, &usDriveRoot, NULL, &CurDir))
{
/* Report an error. */
- Callback(DONE, /* Command */
- 0, /* DWORD Modifier */
- &Argument); /* Argument */
+ Callback(DONE, 0, &Argument);
return;
}
#endif
if (FmIfsInitialized == FALSE)
{
if (InitializeFmIfsOnce() == FALSE)
- {
- return FALSE;
- }
+ return FALSE;
FmIfsInitialized = TRUE;
}