[AUTOCHK][CHKDSK]: Minor fixes / formatting. Really add chkdsk to build.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 3 Mar 2016 00:36:25 +0000 (00:36 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Thu, 3 Mar 2016 00:36:25 +0000 (00:36 +0000)
[FMIFS]: Quickly implement the chkdsk function, the same way as it is done for the formatting function.

svn path=/trunk/; revision=70869

reactos/base/system/CMakeLists.txt
reactos/base/system/autochk/autochk.c
reactos/base/system/chkdsk/chkdsk.c
reactos/dll/win32/fmifs/chkdsk.c
reactos/dll/win32/fmifs/format.c
reactos/dll/win32/fmifs/init.c

index e92a506..2afca07 100644 (file)
@@ -1,6 +1,7 @@
 
 add_subdirectory(autochk)
 add_subdirectory(bootok)
+add_subdirectory(chkdsk)
 add_subdirectory(diskpart)
 add_subdirectory(expand)
 add_subdirectory(format)
index 4fa58ce..88b9b08 100644 (file)
@@ -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
index 2c6909f..5edf7d6 100644 (file)
@@ -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.
 
 /* 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
@@ -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");
index 60edaca..ba6839f 100644 (file)
@@ -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 <debug.h>
+
 /* 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;
+
+    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 */
index 9aed419..266002e 100644 (file)
@@ -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
index 0fe8bc0..e895f5e 100644 (file)
@@ -167,9 +167,7 @@ InitializeFmIfs(
             if (FmIfsInitialized == FALSE)
             {
                 if (InitializeFmIfsOnce() == FALSE)
-                {
-                        return FALSE;
-                }
+                    return FALSE;
 
                 FmIfsInitialized = TRUE;
             }