2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS FS utility tool
4 * FILE: base/applications/cmdutils/common.c
5 * PURPOSE: FSutil common functions
6 * PROGRAMMERS: Pierre Schweitzer <pierre@reactos.org>
11 int FindHandler(int argc
,
13 HandlerItem
* HandlersList
,
15 void (*UsageHelper
)(const TCHAR
*))
19 const TCHAR
* Command
;
25 /* If we have a command, does it match a known one? */
28 /* Browse all the known commands finding the right one */
30 for (i
= 0; i
< HandlerListCount
; ++i
)
32 if (_tcsicmp(Command
, HandlersList
[i
].Command
) == 0)
34 ret
= HandlersList
[i
].Handler(argc
- 1, &argv
[1]);
40 /* We failed finding someone to handle the caller's needs, print out */
41 if (i
== HandlerListCount
)
49 HANDLE
OpenVolume(const TCHAR
* Volume
,
55 TCHAR VolumeID
[PATH_MAX
];
58 if (!AllowRemote
&& Volume
[1] == L
':')
60 Type
= GetDriveType(Volume
);
61 if (Type
== DRIVE_REMOTE
)
63 _ftprintf(stderr
, _T("FSUTIL needs a local device\n"));
64 return INVALID_HANDLE_VALUE
;
68 /* Get filesystem type */
71 TCHAR FileSystem
[MAX_PATH
+ 1];
73 _stprintf(VolumeID
, _T("\\\\.\\%s\\"), Volume
);
74 if (!GetVolumeInformation(VolumeID
, NULL
, 0, NULL
, NULL
, NULL
, FileSystem
, MAX_PATH
+ 1))
76 PrintErrorMessage(GetLastError());
77 return INVALID_HANDLE_VALUE
;
80 if (_tcscmp(FileSystem
, _T("NTFS")) != 0)
82 _ftprintf(stderr
, _T("FSUTIL needs a NTFS device\n"));
83 return INVALID_HANDLE_VALUE
;
87 /* Create full name */
88 _stprintf(VolumeID
, _T("\\\\.\\%s"), Volume
);
91 hVolume
= CreateFile(VolumeID
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
,
92 NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
93 if (hVolume
== INVALID_HANDLE_VALUE
)
95 PrintErrorMessage(GetLastError());
96 return INVALID_HANDLE_VALUE
;
102 void PrintDefaultUsage(const TCHAR
* Command
,
103 const TCHAR
* SubCommand
,
104 HandlerItem
* HandlersList
,
105 int HandlerListCount
)
109 /* If we were given a command, print it's not supported */
110 if (SubCommand
!= NULL
)
112 _ftprintf(stderr
, _T("Unhandled%scommand: %s\n"), Command
, SubCommand
);
115 /* And dump any available command */
116 _ftprintf(stderr
, _T("---- Handled%scommands ----\n\n"), Command
);
117 for (i
= 0; i
< HandlerListCount
; ++i
)
119 _ftprintf(stderr
, _T("%s\t%s\n"), HandlersList
[i
].Command
, HandlersList
[i
].Desc
);
123 int PrintErrorMessage(DWORD Error
)
127 /* Try to get textual error */
128 if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
,
129 NULL
, Error
, 0, (TCHAR
*)&String
, 0, NULL
) != 0)
132 _ftprintf(stderr
, _T("Error: %s\n"), String
);
137 /* Otherwise, just print the error number */
138 _ftprintf(stderr
, _T("Error: %d\n"), Error
);