2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS FS utility tool
4 * FILE: base/applications/cmdutils/volume.c
5 * PURPOSE: FSutil volumes management
6 * PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org>
11 /* Add handlers here for subcommands */
12 static HandlerProc DismountMain
;
13 static HandlerProc DiskFreeMain
;
14 static HandlerItem HandlersList
[] =
16 /* Proc, name, help */
17 { DismountMain
, _T("dismount"), _T("Dismounts a volume") },
18 { DiskFreeMain
, _T("diskfree"), _T("Prints free space on a volume") },
22 LockOrUnlockVolume(HANDLE Volume
, BOOLEAN Lock
)
27 Operation
= (Lock
? FSCTL_LOCK_VOLUME
: FSCTL_UNLOCK_VOLUME
);
28 if (DeviceIoControl(Volume
, Operation
, NULL
, 0, NULL
, 0,
29 &BytesRead
, NULL
) == FALSE
)
31 PrintErrorMessage(GetLastError());
39 DismountMain(int argc
, const TCHAR
*argv
[])
44 /* We need a volume (letter or GUID) */
47 _ftprintf(stderr
, _T("Usage: fsutil volume dismount <volume>\n"));
48 _ftprintf(stderr
, _T("\tFor example: fsutil volume dismount d:\n"));
52 /* Get a handle for the volume */
53 Volume
= OpenVolume(argv
[1], FALSE
, FALSE
);
54 if (Volume
== INVALID_HANDLE_VALUE
)
59 /* Attempt to lock the volume */
60 if (LockOrUnlockVolume(Volume
, TRUE
))
66 /* Issue the dismount command */
67 if (DeviceIoControl(Volume
, FSCTL_DISMOUNT_VOLUME
, NULL
, 0, NULL
,
68 0, &BytesRead
, NULL
) == FALSE
)
70 PrintErrorMessage(GetLastError());
71 LockOrUnlockVolume(Volume
, FALSE
);
77 LockOrUnlockVolume(Volume
, FALSE
);
80 _ftprintf(stdout
, _T("The %s volume has been dismounted\n"), argv
[1]);
86 DiskFreeMain(int argc
, const TCHAR
*argv
[])
88 ULARGE_INTEGER FreeAvail
, TotalNumber
, TotalNumberFree
;
93 _ftprintf(stderr
, _T("Usage: fsutil volume diskfree <volume path>\n"));
94 _ftprintf(stderr
, _T("\tFor example: fsutil volume diskfree c:\n"));
98 if (!GetDiskFreeSpaceEx(argv
[1], &FreeAvail
, &TotalNumber
, &TotalNumberFree
))
100 PrintErrorMessage(GetLastError());
104 _ftprintf(stdout
, _T("Total free bytes\t\t: %I64i\n"), TotalNumberFree
.QuadPart
);
105 _ftprintf(stdout
, _T("Total bytes\t\t\t: %I64i\n"), TotalNumber
.QuadPart
);
106 _ftprintf(stdout
, _T("Total free available bytes\t: %I64i\n"), FreeAvail
.QuadPart
);
112 PrintUsage(const TCHAR
* Command
)
114 PrintDefaultUsage(_T(" VOLUME "), Command
, (HandlerItem
*)&HandlersList
,
115 (sizeof(HandlersList
) / sizeof(HandlersList
[0])));
119 VolumeMain(int argc
, const TCHAR
*argv
[])
121 return FindHandler(argc
, argv
, (HandlerItem
*)&HandlersList
,
122 (sizeof(HandlersList
) / sizeof(HandlersList
[0])),