/*++ Copyright (c) 2000 Microsoft Corporation Module Name: volume.c Abstract: This file contains code for commands that affect the the dirty bit of ntfs volumes. Author: Wesley Witt [wesw] 1-March-2000 Revision History: --*/ #include INT DirtyHelp( IN INT argc, IN PWSTR argv[] ) { DisplayMsg( MSG_USAGE_DIRTY ); return EXIT_CODE_SUCCESS; } INT IsVolumeDirty( IN INT argc, IN PWSTR argv[] ) /*++ Routine Description: This routine checks if the Volume specified is dirty. Arguments: argc - The argument count. argv - Array of Strings of the form : ' fscutl isdirtyv '. Return Value: None --*/ { HANDLE FileHandle = INVALID_HANDLE_VALUE; WCHAR FileName[MAX_PATH]; BOOL Status; DWORD BytesReturned; DWORD VolumeStatus; INT ExitCode = EXIT_CODE_SUCCESS; try { if (argc != 1) { DisplayMsg( MSG_USAGE_ISVDIRTY ); if (argc != 0) { ExitCode = EXIT_CODE_FAILURE; } leave; } if (!IsVolumeLocal( argv[0][0] )) { DisplayMsg( MSG_NEED_LOCAL_VOLUME ); ExitCode = EXIT_CODE_FAILURE; leave; } if (wcslen( DotPrefix ) + wcslen( argv[0] ) + 1 > MAX_PATH) { DisplayMsg( MSG_FILENAME_TOO_LONG ); ExitCode = EXIT_CODE_FAILURE; leave; } wcscpy( FileName, DotPrefix ); wcscat( FileName, argv[0] ); FileHandle = CreateFile( FileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (FileHandle == INVALID_HANDLE_VALUE) { DisplayError(); ExitCode = EXIT_CODE_FAILURE; leave; } Status = DeviceIoControl( FileHandle, FSCTL_IS_VOLUME_DIRTY, NULL, 0, (LPVOID)&VolumeStatus, sizeof(VolumeStatus), &BytesReturned, (LPOVERLAPPED)NULL ); if (!Status) { DisplayError(); ExitCode = EXIT_CODE_FAILURE; leave; } if (VolumeStatus & VOLUME_IS_DIRTY) { DisplayMsg( MSG_ISVDIRTY_YES, argv[0] ); } else { DisplayMsg( MSG_ISVDIRTY_NO, argv[0] ); } } finally { if (FileHandle != INVALID_HANDLE_VALUE) { CloseHandle( FileHandle ); } } return ExitCode; } INT MarkVolumeDirty( IN INT argc, IN PWSTR argv[] ) /*++ Routine Description: This routine marks the volume as dirty. Arguments: argc - The argument count. argv - Array of Strings of the form : ' fscutl markv '. Return Value: None --*/ { BOOL Status; HANDLE FileHandle = INVALID_HANDLE_VALUE; DWORD BytesReturned; WCHAR FileName[MAX_PATH]; INT ExitCode = EXIT_CODE_SUCCESS; try { if (argc != 1) { DisplayMsg( MSG_USAGE_MARKV ); if (argc != 0) { ExitCode = EXIT_CODE_FAILURE; } leave; } if (!IsVolumeLocalNTFS( argv[0][0] )) { DisplayMsg( MSG_NTFS_REQUIRED ); ExitCode = EXIT_CODE_FAILURE; leave; } if (wcslen( DotPrefix ) + wcslen( argv[0] ) + 1 > MAX_PATH) { DisplayMsg( MSG_FILENAME_TOO_LONG ); ExitCode = EXIT_CODE_FAILURE; leave; } wcscpy( FileName, DotPrefix ); wcscat( FileName, argv[0] ); FileHandle = CreateFile( FileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (FileHandle == INVALID_HANDLE_VALUE) { DisplayError(); ExitCode = EXIT_CODE_FAILURE; leave; } Status = DeviceIoControl( FileHandle, FSCTL_MARK_VOLUME_DIRTY, NULL, 0, NULL, 0, &BytesReturned, (LPOVERLAPPED)NULL ); if (!Status) { DisplayError(); ExitCode = EXIT_CODE_FAILURE; } else { DisplayMsg( MSG_DIRTY_SET, argv[0] ); } } finally { if (FileHandle != INVALID_HANDLE_VALUE) { CloseHandle( FileHandle ); } } return ExitCode; }