Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS FS utility tool * FILE: base/applications/cmdutils/dirty.c * PURPOSE: FSutil dirty bit handling * PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org> */
#include "fsutil.h"#include <winioctl.h>
/* Add handlers here for subcommands */static HandlerProc QueryMain;static HandlerProc SetMain;static HandlerItem HandlersList[] ={ /* Proc, name, help */ { QueryMain, _T("query"), _T("Show the dirty bit") }, { SetMain, _T("set"), _T("Set the dirty bit") },};
static intQueryMain(int argc, const TCHAR *argv[]){ HANDLE Volume; ULONG VolumeStatus, BytesRead;
/* We need a volume (letter or GUID) */ if (argc < 2) { _ftprintf(stderr, _T("Usage: fsutil dirty query <volume>\n")); _ftprintf(stderr, _T("\tFor example: fsutil dirty query c:\n")); return 1; }
/* Get a handle for the volume */ Volume = OpenVolume(argv[1], FALSE, FALSE); if (Volume == INVALID_HANDLE_VALUE) { return 1; }
/* And query the dirty status */ if (DeviceIoControl(Volume, FSCTL_IS_VOLUME_DIRTY, NULL, 0, &VolumeStatus, sizeof(ULONG), &BytesRead, NULL) == FALSE) { PrintErrorMessage(GetLastError()); CloseHandle(Volume); return 1; }
CloseHandle(Volume);
/* Print the status */ _ftprintf(stdout, _T("The %s volume is %s\n"), argv[1], ((VolumeStatus & VOLUME_IS_DIRTY) ? _T("dirty") : _T("clean")));
return 0;}
static intSetMain(int argc, const TCHAR *argv[]){ HANDLE Volume; DWORD BytesRead;
/* 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; }
/* Get a handle for the volume */ Volume = OpenVolume(argv[1], FALSE, FALSE); if (Volume == INVALID_HANDLE_VALUE) { return 1; }
/* And set the dirty bit */ if (DeviceIoControl(Volume, FSCTL_MARK_VOLUME_DIRTY, NULL, 0, NULL, 0, &BytesRead, NULL) == FALSE) { PrintErrorMessage(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 voidPrintUsage(const TCHAR * Command){ PrintDefaultUsage(_T(" DIRTY "), Command, (HandlerItem *)&HandlersList, (sizeof(HandlersList) / sizeof(HandlersList[0])));}
intDirtyMain(int argc, const TCHAR *argv[]){ return FindHandler(argc, argv, (HandlerItem *)&HandlersList, (sizeof(HandlersList) / sizeof(HandlersList[0])), PrintUsage);}