ReactOS  0.4.14-dev-49-gfb4591c
common.c
Go to the documentation of this file.
1 /*
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>
7  */
8 
9 #include "fsutil.h"
10 
11 int FindHandler(int argc,
12  const TCHAR *argv[],
14  int HandlerListCount,
15  void (*UsageHelper)(const TCHAR *))
16 {
17  int i;
18  int ret;
19  const TCHAR * Command;
20 
21  ret = 1;
22  Command = NULL;
23  i = HandlerListCount;
24 
25  /* If we have a command, does it match a known one? */
26  if (argc > 1)
27  {
28  /* Browse all the known commands finding the right one */
29  Command = argv[1];
30  for (i = 0; i < HandlerListCount; ++i)
31  {
33  {
34  ret = HandlersList[i].Handler(argc - 1, &argv[1]);
35  break;
36  }
37  }
38  }
39 
40  /* We failed finding someone to handle the caller's needs, print out */
41  if (i == HandlerListCount)
42  {
43  UsageHelper(Command);
44  }
45 
46  return ret;
47 }
48 
50  BOOLEAN AllowRemote,
51  BOOLEAN NtfsOnly)
52 {
53  UINT Type;
54  HANDLE hVolume;
55  TCHAR VolumeID[PATH_MAX];
56 
57  /* Get volume type */
58  if (!AllowRemote && Volume[1] == L':')
59  {
61  if (Type == DRIVE_REMOTE)
62  {
63  _ftprintf(stderr, _T("FSUTIL needs a local device\n"));
64  return INVALID_HANDLE_VALUE;
65  }
66  }
67 
68  /* Get filesystem type */
69  if (NtfsOnly)
70  {
72 
73  _stprintf(VolumeID, _T("\\\\.\\%s\\"), Volume);
74  if (!GetVolumeInformation(VolumeID, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH + 1))
75  {
77  return INVALID_HANDLE_VALUE;
78  }
79 
80  if (_tcscmp(FileSystem, _T("NTFS")) != 0)
81  {
82  _ftprintf(stderr, _T("FSUTIL needs a NTFS device\n"));
83  return INVALID_HANDLE_VALUE;
84  }
85  }
86 
87  /* Create full name */
88  _stprintf(VolumeID, _T("\\\\.\\%s"), Volume);
89 
90  /* Open the volume */
93  if (hVolume == INVALID_HANDLE_VALUE)
94  {
96  return INVALID_HANDLE_VALUE;
97  }
98 
99  return hVolume;
100 }
101 
103  const TCHAR * SubCommand,
105  int HandlerListCount)
106 {
107  int i;
108 
109  /* If we were given a command, print it's not supported */
110  if (SubCommand != NULL)
111  {
112  _ftprintf(stderr, _T("Unhandled%scommand: %s\n"), Command, SubCommand);
113  }
114 
115  /* And dump any available command */
116  _ftprintf(stderr, _T("---- Handled%scommands ----\n\n"), Command);
117  for (i = 0; i < HandlerListCount; ++i)
118  {
119  _ftprintf(stderr, _T("%s\t%s\n"), HandlersList[i].Command, HandlersList[i].Desc);
120  }
121 }
122 
124 {
125  TCHAR * String;
126 
127  /* Try to get textual error */
129  NULL, Error, 0, (TCHAR *)&String, 0, NULL) != 0)
130  {
131  /* And print it */
132  _ftprintf(stderr, _T("Error: %s\n"), String);
133  LocalFree(String);
134  }
135  else
136  {
137  /* Otherwise, just print the error number */
138  _ftprintf(stderr, _T("Error: %d\n"), Error);
139  }
140 
141  return Error;
142 }
static int argc
Definition: ServiceArgs.c:12
PWCHAR FileSystem
Definition: format.c:72
Type
Definition: Type.h:6
#define _tcsicmp
Definition: xmlstorage.h:205
void PrintDefaultUsage(const TCHAR *Command, const TCHAR *SubCommand, HandlerItem *HandlersList, int HandlerListCount)
Definition: common.c:102
int _tcscmp(const _TCHAR *s1, const _TCHAR *s2)
Definition: tcscmp.h:8
#define GetDriveType
Definition: winbase.h:3629
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
int PrintErrorMessage(DWORD Error)
Definition: common.c:123
static WCHAR String[]
Definition: stringtable.c:55
Definition: shell.h:41
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define argv
Definition: mplay32.c:18
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
#define FILE_SHARE_READ
Definition: compat.h:125
int FindHandler(int argc, const TCHAR *argv[], HandlerItem *HandlersList, int HandlerListCount, void(*UsageHelper)(const TCHAR *))
Definition: common.c:11
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define DRIVE_REMOTE
Definition: winbase.h:250
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:400
static HandlerItem HandlersList[]
Definition: dirty.c:15
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
HANDLE OpenVolume(const TCHAR *Volume, BOOLEAN AllowRemote, BOOLEAN NtfsOnly)
Definition: common.c:49
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:404
#define _ftprintf
Definition: tchar.h:518
#define OPEN_EXISTING
Definition: compat.h:426
char TCHAR
Definition: xmlstorage.h:189
#define _T(x)
Definition: vfdio.h:22
struct Command Command
#define MAX_PATH
Definition: compat.h:26
unsigned long DWORD
Definition: ntddk_ex.h:95
#define PATH_MAX
Definition: types.h:280
BOOL Error
Definition: chkdsk.c:66
int ret
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
static const WCHAR L[]
Definition: oid.c:1250
#define GENERIC_READ
Definition: compat.h:124
#define _stprintf
Definition: utility.h:124
#define GetVolumeInformation
Definition: winbase.h:3670
IN OUT PVCB OUT PDIRENT OUT PBCB IN BOOLEAN CreateFile
Definition: fatprocs.h:904
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1577
unsigned int UINT
Definition: ndis.h:50
FILE * stderr
pHandlerProc Handler
Definition: fsutil.h:13