https://git.reactos.org/?p=reactos.git;a=commitdiff;h=76628586701041e81bbcbf...
commit 76628586701041e81bbcbf0bff71c1f9b708e0d1 Author: Pierre Schweitzer pierre@reactos.org AuthorDate: Fri May 4 21:35:25 2018 +0200 Commit: Pierre Schweitzer pierre@reactos.org CommitDate: Thu May 10 10:49:17 2018 +0200
[AUTOCHK] Statically link to FS libs.
This will help reducing the number of handles open.
CORE-13759 --- base/system/autochk/CMakeLists.txt | 2 +- base/system/autochk/autochk.c | 140 ++++++++++++++----------------------- 2 files changed, 54 insertions(+), 88 deletions(-)
diff --git a/base/system/autochk/CMakeLists.txt b/base/system/autochk/CMakeLists.txt index ba720da364..e7a9fb1f38 100644 --- a/base/system/autochk/CMakeLists.txt +++ b/base/system/autochk/CMakeLists.txt @@ -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) diff --git a/base/system/autochk/autochk.c b/base/system/autochk/autochk.c index cc94858db3..36dfdae849 100644 --- a/base/system/autochk/autochk.c +++ b/base/system/autochk/autochk.c @@ -6,6 +6,7 @@ * PROGRAMMERS: Aleksey Bragin * Eric Kohl * Herv� Poussineau + * Pierre Schweitzer */
/* INCLUDES *****************************************************************/ @@ -23,6 +24,14 @@ #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>
@@ -30,6 +39,25 @@
#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; }