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