ReactOS 0.4.16-dev-2613-g9533ad7
cmdUse.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS net command
4 * FILE: base/applications/network/net/cmdUse.c
5 * PURPOSE:
6 *
7 * PROGRAMMERS: Pierre Schweitzer
8 */
9
10#include "net.h"
11
12static
15{
16 DWORD dRet;
17 HANDLE hEnum;
18 LPNETRESOURCE lpRes;
19 DWORD dSize = 0x1000;
20 DWORD dCount = -1;
21 LPNETRESOURCE lpCur;
22
23 ConPrintf(StdOut, L"%s\t\t\t%s\t\t\t\t%s\n", L"Local", L"Remote", L"Provider");
24
26 if (dRet != WN_SUCCESS)
27 {
28 return 1;
29 }
30
31 lpRes = HeapAlloc(GetProcessHeap(), 0, dSize);
32 if (!lpRes)
33 {
34 WNetCloseEnum(hEnum);
35 return 1;
36 }
37
38 do
39 {
40 dSize = 0x1000;
41 dCount = -1;
42
43 memset(lpRes, 0, dSize);
44 dRet = WNetEnumResource(hEnum, &dCount, lpRes, &dSize);
45 if (dRet == WN_SUCCESS || dRet == WN_MORE_DATA)
46 {
47 lpCur = lpRes;
48 for (; dCount; dCount--)
49 {
50 if (!Local || _wcsicmp(lpCur->lpLocalName, Local) == 0)
51 {
52 ConPrintf(StdOut, L"%s\t\t\t%s\t\t%s\n", lpCur->lpLocalName, lpCur->lpRemoteName, lpCur->lpProvider);
53 }
54
55 lpCur++;
56 }
57 }
58 } while (dRet != WN_NO_MORE_ENTRIES);
59
60 HeapFree(GetProcessHeap(), 0, lpRes);
61 WNetCloseEnum(hEnum);
62
63 return 0;
64}
65
66static
67VOID
69{
70 WCHAR szStatusBuffer[16];
72
73 swprintf(szStatusBuffer, L"%lu", Status);
74 PrintMessageStringV(3502, szStatusBuffer);
75
79 {
80 ConPrintf(StdErr, L"\n%s", Buffer);
82 }
83}
84
85static
86BOOL
88{
89 /* Check for "X:" format */
90 return (DevName[0] && iswalpha(DevName[0]) && DevName[1] == L':' && !DevName[2]);
91}
92
93INT
95 INT argc,
96 WCHAR **argv)
97{
99
100 if (argc == 2)
101 {
103 if (Status == NO_ERROR)
105 else
107
108 return 0;
109 }
110 else if (argc == 3)
111 {
112 if (!ValidateDeviceName(argv[2]))
113 {
114 PrintMessageStringV(3952, L"DeviceName");
115 return 1;
116 }
117
119 if (Status == NO_ERROR)
121 else
123
124 return 0;
125 }
126
127 Delete = 0;
128 if (_wcsicmp(argv[2], L"/DELETE") == 0)
129 {
130 Delete = 3;
131 }
132 else
133 {
134 if ((argv[2][0] != '*' && argv[2][1] != 0) &&
136 {
137 PrintMessageStringV(3952, L"DeviceName");
138 return 1;
139 }
140 }
141
142 if (_wcsicmp(argv[3], L"/DELETE") == 0)
143 {
144 Delete = 2;
145 }
146
147 if (Delete != 0)
148 {
149 if (!ValidateDeviceName(argv[Delete]) || argv[Delete][0] == L'*')
150 {
151 PrintMessageStringV(3952, L"DeviceName");
152 return 1;
153 }
154
156 if (Status != NO_ERROR)
158
159 return Status;
160 }
161 else
162 {
164 NETRESOURCE lpNet = { 0 };
165 WCHAR Access[256];
166 DWORD OutFlags = 0, Size = ARRAYSIZE(Access);
167 size_t Len;
168
169 Len = wcslen(argv[3]);
170 if (Len < 4)
171 {
172 PrintMessageStringV(3952, L"Name");
173 return 1;
174 }
175
176 if (argv[3][0] != L'\\' || argv[3][1] != L'\\')
177 {
178 PrintMessageStringV(3952, L"Name");
179 return 1;
180 }
181
182 if (argc > 4)
183 {
184 LPWSTR Cpy;
185 Len = wcslen(argv[4]);
186 if (Len > 12)
187 {
188 Cpy = HeapAlloc(GetProcessHeap(), 0, (Len + 1) * sizeof(WCHAR));
189 if (Cpy)
190 {
191 size_t i;
192 for (i = 0; i < Len; ++i)
193 Cpy[i] = towupper(argv[4][i]);
194
195 if (wcsstr(Cpy, L"/PERSISTENT:") == Cpy)
196 {
197 LPWSTR Arg = Cpy + 12;
198 if (Len == 14 && Arg[0] == 'N' && Arg[1] == 'O')
199 {
200 Persist = FALSE;
201 }
202 else if (Len == 15 && Arg[0] == 'Y' && Arg[1] == 'E' && Arg[2] == 'S')
203 {
204 Persist = TRUE;
205 }
206 else
207 {
208 HeapFree(GetProcessHeap(), 0, Cpy);
209 PrintMessageStringV(3952, L"Persistent");
210 return 1;
211 }
212 }
213 HeapFree(GetProcessHeap(), 0, Cpy);
214 }
215 }
216
217 }
218
220 lpNet.lpLocalName = (argv[2][0] != L'*') ? argv[2] : NULL;
221 lpNet.lpRemoteName = argv[3];
222 lpNet.lpComment = L"";
223 lpNet.lpProvider = NULL;
224
225 Status = WNetUseConnection(NULL, &lpNet, NULL, NULL, CONNECT_REDIRECT | (Persist ? CONNECT_UPDATE_PROFILE : 0), Access, &Size, &OutFlags);
226 if (argv[2][0] == L'*' && Status == NO_ERROR && OutFlags == CONNECT_LOCALDRIVE)
227 PrintMessageStringV(3919, argv[3], Access);
228 else if (Status != NO_ERROR)
230
231 return Status;
232 }
233}
static VOID PrintErrorMessage(DWORD dwError)
Definition: at.c:311
VOID PrintMessageStringV(DWORD dwMessage,...)
Definition: main.c:93
BOOL Delete(LPCTSTR ServiceName)
Definition: delete.c:12
Definition: bufpool.h:45
static DWORD EnumerateConnections(LPCWSTR Local)
Definition: cmdUse.c:14
static VOID PrintError(DWORD Status)
Definition: cmdUse.c:68
INT cmdUse(INT argc, WCHAR **argv)
Definition: cmdUse.c:94
static BOOL ValidateDeviceName(PWSTR DevName)
Definition: cmdUse.c:87
void ConPrintf(FILE *fp, LPCWSTR psz,...)
#define StdOut
Definition: conutils_noros.h:6
#define StdErr
Definition: conutils_noros.h:7
#define NO_ERROR
Definition: dderror.h:5
#define Len
Definition: deflate.h:82
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
MonoAssembly int argc
Definition: metahost.c:107
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:159
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
_ACRTIMP wchar_t *__cdecl wcsstr(const wchar_t *, const wchar_t *)
Definition: wcs.c:2993
#define swprintf
Definition: precomp.h:40
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
Status
Definition: gdiplustypes.h:25
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
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
static IPersist Persist
Definition: atl.c:503
#define argv
Definition: mplay32.c:18
short WCHAR
Definition: pedump.c:58
#define iswalpha(_c)
Definition: ctype.h:664
Deprecated header file that includes net_sockets.h.
#define memset(x, y, z)
Definition: compat.h:39
#define towupper(c)
Definition: wctype.h:99
LPSTR lpLocalName
Definition: winnetwk.h:171
LPSTR lpComment
Definition: winnetwk.h:173
LPSTR lpProvider
Definition: winnetwk.h:174
LPSTR lpRemoteName
Definition: winnetwk.h:172
DWORD dwType
Definition: winnetwk.h:168
#define LANG_USER_DEFAULT
Definition: tnerror.cpp:50
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
int32_t INT
Definition: typedefs.h:58
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
#define FORMAT_MESSAGE_IGNORE_INSERTS
Definition: winbase.h:397
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:400
#define FORMAT_MESSAGE_ALLOCATE_BUFFER
Definition: winbase.h:396
#define RESOURCE_CONNECTED
Definition: winnetwk.h:58
#define CONNECT_REDIRECT
Definition: winnetwk.h:94
#define CONNECT_UPDATE_PROFILE
Definition: winnetwk.h:87
#define RESOURCETYPE_DISK
Definition: winnetwk.h:64
#define WN_MORE_DATA
Definition: winnetwk.h:117
#define CONNECT_LOCALDRIVE
Definition: winnetwk.h:95
#define WN_SUCCESS
Definition: winnetwk.h:111
#define WNetEnumResource
Definition: winnetwk.h:599
#define WNetUseConnection
Definition: winnetwk.h:609
#define WNetOpenEnum
Definition: winnetwk.h:598
#define WNetCancelConnection2
Definition: winnetwk.h:607
#define WN_NO_MORE_ENTRIES
Definition: winnetwk.h:146
DWORD WINAPI WNetCloseEnum(HANDLE hEnum)
Definition: wnet.c:1762