Author: pschweitzer Date: Tue Sep 5 19:11:02 2017 New Revision: 75768
URL: http://svn.reactos.org/svn/reactos?rev=75768&view=rev Log: [FSUTIL] Implement setting the dirty bit (fsutil dirty set) on a volume.
This doesn't allow to trigger a chkdsk on reboot with ReactOS, because of the way we handle the dirty bit in our FAT implementation is a bit... weird.
This works on W2K3 though!
Modified: trunk/reactos/base/applications/cmdutils/fsutil/dirty.c
Modified: trunk/reactos/base/applications/cmdutils/fsutil/dirty.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/cmdutils/... ============================================================================== --- trunk/reactos/base/applications/cmdutils/fsutil/dirty.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/cmdutils/fsutil/dirty.c [iso-8859-1] Tue Sep 5 19:11:02 2017 @@ -60,15 +60,50 @@ /* Print the status */ _ftprintf(stdout, _T("The %s volume is %s\n"), argv[1], (VolumeStatus & VOLUME_IS_DIRTY ? _T("dirty") : _T("clean")));
- return 1; + return 0; }
static int SetMain(int argc, const TCHAR *argv[]) { - /* FIXME */ - _ftprintf(stderr, _T("Not implemented\n")); - return 1; + HANDLE Volume; + DWORD BytesRead; + TCHAR VolumeID[PATH_MAX]; + + /* We need a volume (letter or GUID) */ + if (argc < 2) + { + _ftprintf(stderr, _T("Usage: fsutil dirty set <volume>\n")); + _ftprintf(stderr, _T("\tFor example: fsutil dirty set c:\n")); + return 1; + } + + /* Create full name */ + _stprintf(VolumeID, _T("\\.\%s"), argv[1]); + + /* Open the volume */ + Volume = CreateFile(VolumeID, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (Volume == INVALID_HANDLE_VALUE) + { + _ftprintf(stderr, _T("Error: %d\n"), GetLastError()); + return 1; + } + + /* And set the dirty bit */ + if (DeviceIoControl(Volume, FSCTL_MARK_VOLUME_DIRTY, NULL, 0, NULL, 0, &BytesRead, NULL) == FALSE) + { + _ftprintf(stderr, _T("Error: %d\n"), GetLastError()); + CloseHandle(Volume); + return 1; + } + + CloseHandle(Volume); + + /* Print the status */ + _ftprintf(stdout, _T("The %s volume is now marked as dirty\n"), argv[1]); + + return 0; }
static void