[AUTOCHK] Statically link to FS libs.
authorPierre Schweitzer <pierre@reactos.org>
Fri, 4 May 2018 19:35:25 +0000 (21:35 +0200)
committerPierre Schweitzer <pierre@reactos.org>
Thu, 10 May 2018 08:49:17 +0000 (10:49 +0200)
This will help reducing the number of handles open.

CORE-13759

base/system/autochk/CMakeLists.txt
base/system/autochk/autochk.c

index ba720da..e7a9fb1 100644 (file)
@@ -1,6 +1,6 @@
 
 add_executable(autochk WIN32 autochk.c autochk.rc)
 set_module_type(autochk nativecui)
-target_link_libraries(autochk nt)
+target_link_libraries(autochk nt ext2lib vfatlib ntfslib cdfslib ffslib reiserfslib btrfslib)
 add_importlibs(autochk ntdll)
 add_cd_file(TARGET autochk DESTINATION reactos/system32 FOR all)
index cc94858..36dfdae 100644 (file)
@@ -6,6 +6,7 @@
  * PROGRAMMERS:     Aleksey Bragin
  *                  Eric Kohl
  *                  HervĂ© Poussineau
+ *                  Pierre Schweitzer
  */
 
 /* INCLUDES *****************************************************************/
 #include <ndk/umfuncs.h>
 #include <fmifs/fmifs.h>
 
+#include <fslib/vfatlib.h>
+#include <fslib/ext2lib.h>
+#include <fslib/ntfslib.h>
+#include <fslib/cdfslib.h>
+#include <fslib/btrfslib.h>
+#include <fslib/ffslib.h>
+#include <fslib/reiserfslib.h>
+
 #define NDEBUG
 #include <debug.h>
 
 
 #define FS_ATTRIBUTE_BUFFER_SIZE (MAX_PATH * sizeof(WCHAR) + sizeof(FILE_FS_ATTRIBUTE_INFORMATION))
 
+typedef struct _FILESYSTEM_CHKDSK
+{
+    WCHAR Name[10];
+    CHKDSKEX ChkdskFunc;
+} FILESYSTEM_CHKDSK, *PFILESYSTEM_CHKDSK;
+
+FILESYSTEM_CHKDSK FileSystems[10] =
+{
+    { L"FAT", VfatChkdsk },
+    { L"FAT32", VfatChkdsk },
+    { L"NTFS", NtfsChkdsk },
+    { L"EXT2", Ext2Chkdsk },
+    { L"EXT3", Ext2Chkdsk },
+    { L"EXT4", Ext2Chkdsk },
+    { L"Btrfs", BtrfsChkdskEx },
+    { L"RFSD", ReiserfsChkdsk },
+    { L"FFS", FfsChkdsk },
+    { L"CDFS", CdfsChkdsk },
+};
 
 /* FUNCTIONS ****************************************************************/
 //
@@ -245,70 +273,15 @@ ChkdskCallback(
     return TRUE;
 }
 
-/* Load the provider associated with this file system */
-static PVOID
-LoadProvider(
-    IN PWCHAR FileSystem)
-{
-    UNICODE_STRING ProviderDll;
-    PVOID BaseAddress;
-    NTSTATUS Status;
-
-    /* FIXME: add more providers here */
-
-    if (wcscmp(FileSystem, L"NTFS") == 0)
-    {
-      RtlInitUnicodeString(&ProviderDll, L"untfs.dll");
-    }
-    else if (wcscmp(FileSystem, L"FAT") == 0
-             || wcscmp(FileSystem, L"FAT32") == 0)
-    {
-      RtlInitUnicodeString(&ProviderDll, L"ufat.dll");
-    }
-    else if (wcscmp(FileSystem, L"EXT2") == 0
-             || wcscmp(FileSystem, L"EXT3") == 0
-             || wcscmp(FileSystem, L"EXT4") == 0)
-    {
-      RtlInitUnicodeString(&ProviderDll, L"uext2.dll");
-    }
-    else if (wcscmp(FileSystem, L"Btrfs") == 0)
-    {
-      RtlInitUnicodeString(&ProviderDll, L"ubtrfs.dll");
-    }
-    else if (wcscmp(FileSystem, L"RFSD") == 0)
-    {
-      RtlInitUnicodeString(&ProviderDll, L"ureiserfs.dll");
-    }
-    else if (wcscmp(FileSystem, L"FFS") == 0)
-    {
-      RtlInitUnicodeString(&ProviderDll, L"uffs.dll");
-    }
-    else if (wcscmp(FileSystem, L"CDFS") == 0)
-    {
-      RtlInitUnicodeString(&ProviderDll, L"ucdfs.dll");
-    }
-    else 
-    {
-      return NULL;
-    }
-
-    Status = LdrLoadDll(NULL, NULL, &ProviderDll, &BaseAddress);
-    if (!NT_SUCCESS(Status))
-        return NULL;
-    return BaseAddress;
-}
-
 static NTSTATUS
 CheckVolume(
     IN PWCHAR DrivePath)
 {
     WCHAR FileSystem[128];
-    ANSI_STRING ChkdskFunctionName = RTL_CONSTANT_STRING("ChkdskEx");
-    PVOID Provider;
-    CHKDSKEX ChkdskFunc;
     WCHAR NtDrivePath[64];
     UNICODE_STRING DrivePathU;
     NTSTATUS Status;
+    DWORD Count;
 
     /* Get the file system */
     Status = GetFileSystem(DrivePath,
@@ -321,44 +294,37 @@ CheckVolume(
         return Status;
     }
 
-    /* Load the provider which will do the chkdsk */
-    Provider = LoadProvider(FileSystem);
-    if (Provider == NULL)
+    /* Call provider */
+    for (Count = 0; Count < sizeof(FileSystems) / sizeof(FileSystems[0]); ++Count)
     {
-        DPRINT1("LoadProvider() failed\n");
-        PrintString("  Unable to verify a %S volume\r\n", FileSystem);
-        return STATUS_DLL_NOT_FOUND;
+        if (wcscmp(FileSystem, FileSystems[Count].Name) != 0)
+        {
+            continue;
+        }
+
+        // PrintString("  Verifying volume %S\r\n", DrivePath);
+        swprintf(NtDrivePath, L"\\??\\");
+        wcscat(NtDrivePath, DrivePath);
+        NtDrivePath[wcslen(NtDrivePath)-1] = 0;
+        RtlInitUnicodeString(&DrivePathU, NtDrivePath);
+
+        DPRINT1("AUTOCHK: Checking %wZ\n", &DrivePathU);
+        Status = FileSystems[Count].ChkdskFunc(&DrivePathU,
+                                               TRUE, // FixErrors
+                                               TRUE, // Verbose
+                                               TRUE, // CheckOnlyIfDirty
+                                               FALSE,// ScanDrive
+                                               ChkdskCallback);
+        break;
     }
 
-    /* Get the Chkdsk function address */
-    Status = LdrGetProcedureAddress(Provider,
-                                    &ChkdskFunctionName,
-                                    0,
-                                    (PVOID*)&ChkdskFunc);
-    if (!NT_SUCCESS(Status))
+    if (Count == sizeof(FileSystems) / sizeof(FileSystems[0]))
     {
-        DPRINT1("LdrGetProcedureAddress() failed with status 0x%08lx\n", Status);
+        DPRINT1("File system not supported\n");
         PrintString("  Unable to verify a %S volume\r\n", FileSystem);
-        LdrUnloadDll(Provider);
-        return Status;
+        return STATUS_DLL_NOT_FOUND;
     }
 
-    /* Call provider */
-    // PrintString("  Verifying volume %S\r\n", DrivePath);
-    swprintf(NtDrivePath, L"\\??\\");
-    wcscat(NtDrivePath, DrivePath);
-    NtDrivePath[wcslen(NtDrivePath)-1] = 0;
-    RtlInitUnicodeString(&DrivePathU, NtDrivePath);
-
-    DPRINT1("AUTOCHK: Checking %wZ\n", &DrivePathU);
-    Status = ChkdskFunc(&DrivePathU,
-                        TRUE, // FixErrors
-                        TRUE, // Verbose
-                        TRUE, // CheckOnlyIfDirty
-                        FALSE,// ScanDrive
-                        ChkdskCallback);
-
-    LdrUnloadDll(Provider);
     return Status;
 }