diff --git a/reactos/base/applications/cmdutils/fsutil/common.c b/reactos/base/applications/cmdutils/fsutil/common.c index ca6cb95646c..c89cd821ada 100644 --- a/reactos/base/applications/cmdutils/fsutil/common.c +++ b/reactos/base/applications/cmdutils/fsutil/common.c @@ -46,6 +46,39 @@ int FindHandler(int argc, return ret; } +HANDLE OpenVolume(const TCHAR * Volume, + BOOLEAN AllowRemote) +{ + UINT Type; + HANDLE hVolume; + TCHAR VolumeID[PATH_MAX]; + + /* Create full name */ + _stprintf(VolumeID, _T("\\\\.\\%s"), Volume); + + /* Get volume type */ + if (!AllowRemote && Volume[1] == L':') + { + Type = GetDriveType(Volume); + if (Type == DRIVE_REMOTE) + { + _ftprintf(stderr, _T("FSUTIL needs a local device\n")); + return INVALID_HANDLE_VALUE; + } + } + + /* Open the volume */ + hVolume = CreateFile(VolumeID, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hVolume == INVALID_HANDLE_VALUE) + { + _ftprintf(stderr, _T("Error: %d\n"), GetLastError()); + return INVALID_HANDLE_VALUE; + } + + return hVolume; +} + void PrintDefaultUsage(const TCHAR * Command, const TCHAR * SubCommand, HandlerItem * HandlersList, diff --git a/reactos/base/applications/cmdutils/fsutil/dirty.c b/reactos/base/applications/cmdutils/fsutil/dirty.c index bd5be20a2d1..9eff0903714 100644 --- a/reactos/base/applications/cmdutils/fsutil/dirty.c +++ b/reactos/base/applications/cmdutils/fsutil/dirty.c @@ -23,7 +23,6 @@ static int QueryMain(int argc, const TCHAR *argv[]) { HANDLE Volume; - TCHAR VolumeID[PATH_MAX]; ULONG VolumeStatus, BytesRead; /* We need a volume (letter or GUID) */ @@ -34,15 +33,10 @@ QueryMain(int argc, const TCHAR *argv[]) 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); + /* Get a handle for the volume */ + Volume = OpenVolume(argv[1], FALSE); if (Volume == INVALID_HANDLE_VALUE) { - _ftprintf(stderr, _T("Error: %d\n"), GetLastError()); return 1; } @@ -68,7 +62,6 @@ SetMain(int argc, const TCHAR *argv[]) { HANDLE Volume; DWORD BytesRead; - TCHAR VolumeID[PATH_MAX]; /* We need a volume (letter or GUID) */ if (argc < 2) @@ -78,15 +71,10 @@ SetMain(int argc, const TCHAR *argv[]) 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); + /* Get a handle for the volume */ + Volume = OpenVolume(argv[1], FALSE); if (Volume == INVALID_HANDLE_VALUE) { - _ftprintf(stderr, _T("Error: %d\n"), GetLastError()); return 1; } diff --git a/reactos/base/applications/cmdutils/fsutil/fsutil.h b/reactos/base/applications/cmdutils/fsutil/fsutil.h index acbcc94a099..7c112a85413 100644 --- a/reactos/base/applications/cmdutils/fsutil/fsutil.h +++ b/reactos/base/applications/cmdutils/fsutil/fsutil.h @@ -18,6 +18,9 @@ int FindHandler(int argc, int HandlerListCount, void (*UsageHelper)(const TCHAR *)); +HANDLE OpenVolume(const TCHAR * Volume, + BOOLEAN AllowRemote); + void PrintDefaultUsage(const TCHAR * Command, const TCHAR * SubCommand, HandlerItem * HandlersList,