Add code to query volume for its filesystem type

svn path=/trunk/; revision=22370
This commit is contained in:
Aleksey Bragin 2006-06-15 15:00:37 +00:00
parent 69d2fdc763
commit 9bf8d5dcc2

View file

@ -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 <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 ****************************************************************/
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<argc; i++)
DPRINT("Param %d: %s\n", i, argv[i]);
*/
Status = NtQueryInformationProcess(NtCurrentProcess(),
ProcessDeviceMap,
@ -73,13 +182,34 @@ _main(int argc,
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;
}