Author: fireball Date: Thu Jun 15 19:00:37 2006 New Revision: 22370
URL: http://svn.reactos.ru/svn/reactos?rev=22370&view=rev Log: Add code to query volume for its filesystem type
Modified: trunk/reactos/base/system/autochk/autochk.c
Modified: trunk/reactos/base/system/autochk/autochk.c URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/base/system/autochk/autochk.... ============================================================================== --- trunk/reactos/base/system/autochk/autochk.c (original) +++ trunk/reactos/base/system/autochk/autochk.c Thu Jun 15 19:00:37 2006 @@ -3,16 +3,25 @@ * 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 <debug.h>
#include <stdio.h> #define WIN32_NO_STATUS #include <windows.h> #define NTOS_MODE_USER #include <ndk/ntndk.h> + +/* DEFINES ******************************************************************/ + +#define FS_ATTRIBUTE_BUFFER_SIZE (MAX_PATH * sizeof(WCHAR) + sizeof(FILE_FS_ATTRIBUTE_INFORMATION)) +
/* FUNCTIONS ****************************************************************/
@@ -45,6 +54,97 @@ 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 @@ PROCESS_DEVICEMAP_INFORMATION DeviceMap; ULONG i; NTSTATUS Status; - - PrintString("Autochk 0.0.1\n"); + WCHAR FileSystem[128]; + WCHAR DrivePath[128]; + + 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<argc; i++) + DPRINT("Param %d: %s\n", i, argv[i]); + */
Status = NtQueryInformationProcess(NtCurrentProcess(), ProcessDeviceMap, @@ -73,13 +182,34 @@ if ((DeviceMap.Query.DriveMap & (1 << i)) && (DeviceMap.Query.DriveType[i] == DOSDEVICE_DRIVE_FIXED)) { - PrintString(" Checking drive %c:", 'A'+i); - PrintString(" OK\n"); + swprintf(DrivePath, L"%c:\", 'A'+i); + Status = GetFileSystem(DrivePath, + FileSystem, + sizeof(FileSystem)); + PrintString(" Checking drive %c: \n", 'A'+i); + + if (NT_SUCCESS(Status)) + { + PrintString(" Filesystem type "); + DisplayString(FileSystem); + PrintString("\n"); + PrintString(" OK\n"); + } + else + { + DPRINT1("Error getting FS information, Status=0x%08X\n", + Status); + } } } PrintString("\n"); return 0; } + else + { + DPRINT1("NtQueryInformationProcess() failed with status=0x%08X\n", + Status); + }
return 1; }