From 9bf8d5dcc24cdcac8b44f321a28804ab218f5aaf Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 15 Jun 2006 15:00:37 +0000 Subject: [PATCH] Add code to query volume for its filesystem type svn path=/trunk/; revision=22370 --- reactos/base/system/autochk/autochk.c | 138 +++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 4 deletions(-) diff --git a/reactos/base/system/autochk/autochk.c b/reactos/base/system/autochk/autochk.c index 5df6079412f..393f3a97144 100644 --- a/reactos/base/system/autochk/autochk.c +++ b/reactos/base/system/autochk/autochk.c @@ -3,17 +3,26 @@ * LICENSE: GPL - See COPYING in the top level directory * FILE: base/system/autochk/autochk.c * PURPOSE: Filesystem checker - * PROGRAMMERS: Eric Kohl + * PROGRAMMERS: Aleksey Bragin + * Eric Kohl */ /* INCLUDES *****************************************************************/ +//#define NDEBUG +#include + #include #define WIN32_NO_STATUS #include #define NTOS_MODE_USER #include +/* DEFINES ******************************************************************/ + +#define FS_ATTRIBUTE_BUFFER_SIZE (MAX_PATH * sizeof(WCHAR) + sizeof(FILE_FS_ATTRIBUTE_INFORMATION)) + + /* FUNCTIONS ****************************************************************/ void @@ -45,6 +54,97 @@ PrintString(char* fmt,...) RtlFreeUnicodeString(&UnicodeString); } +// this func is taken from kernel32/file/volume.c +HANDLE +OpenDirectory(LPCWSTR DirName, + BOOLEAN Write) +{ + UNICODE_STRING NtPathU; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE hFile; + + if (!RtlDosPathNameToNtPathName_U(DirName, + &NtPathU, + NULL, + NULL)) + { + DPRINT1("Invalid path!\n"); + return INVALID_HANDLE_VALUE; + } + + InitializeObjectAttributes( + &ObjectAttributes, + &NtPathU, + Write ? FILE_WRITE_ATTRIBUTES : FILE_READ_ATTRIBUTES, + NULL, + NULL); + + Status = NtCreateFile( + &hFile, + Write ? FILE_GENERIC_WRITE : FILE_GENERIC_READ, + &ObjectAttributes, + &IoStatusBlock, + NULL, + 0, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL, + 0); + + RtlFreeHeap(RtlGetProcessHeap(), 0, NtPathU.Buffer); + + if (!NT_SUCCESS(Status)) + { + return INVALID_HANDLE_VALUE; + } + + return hFile; +} + +NTSTATUS +GetFileSystem(LPCWSTR Drive, + LPWSTR FileSystemName, + ULONG FileSystemNameSize) +{ + HANDLE FileHandle; + NTSTATUS Status; + IO_STATUS_BLOCK IoStatusBlock; + PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute; + UCHAR Buffer[FS_ATTRIBUTE_BUFFER_SIZE]; + + FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; + + FileHandle = OpenDirectory(Drive, FALSE); + if (FileHandle == INVALID_HANDLE_VALUE) + return STATUS_INVALID_PARAMETER; + + Status = NtQueryVolumeInformationFile(FileHandle, + &IoStatusBlock, + FileFsAttribute, + FS_ATTRIBUTE_BUFFER_SIZE, + FileFsAttributeInformation); + NtClose(FileHandle); + + if (NT_SUCCESS(Status)) + { + if (FileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) + { + memcpy(FileSystemName, + FileFsAttribute->FileSystemName, + FileFsAttribute->FileSystemNameLength); + FileSystemName[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; + } + else + return STATUS_BUFFER_TOO_SMALL; + } + else + return Status; + + return STATUS_SUCCESS; +} /* Native image's entry point */ int @@ -57,8 +157,17 @@ _main(int argc, PROCESS_DEVICEMAP_INFORMATION DeviceMap; ULONG i; NTSTATUS Status; + WCHAR FileSystem[128]; + WCHAR DrivePath[128]; - PrintString("Autochk 0.0.1\n"); + PrintString("Autochk 0.0.2\n"); + + // Win2003 passes the only param - "*". Probably means to check all drives + /* + DPRINT("Got %d params\n", argc); + for (i=0; i