1 // Windows/Net.cpp
2
3 #include "StdAfx.h"
4
5 #include "../Common/MyBuffer.h"
6
7 #ifndef _UNICODE
8 #include "../Common/StringConvert.h"
9 #endif
10
11 #include "Net.h"
12
13 #ifndef _UNICODE
14 extern bool g_IsNT;
15 #endif
16
17 extern "C"
18 {
19 #if !defined(WNetGetResourceParent)
20 // #if defined(Z7_OLD_WIN_SDK)
21 // #if (WINVER >= 0x0400)
22 DWORD APIENTRY WNetGetResourceParentA(IN LPNETRESOURCEA lpNetResource,
23 OUT LPVOID lpBuffer, IN OUT LPDWORD lpcbBuffer);
24 DWORD APIENTRY WNetGetResourceParentW(IN LPNETRESOURCEW lpNetResource,
25 OUT LPVOID lpBuffer, IN OUT LPDWORD lpcbBuffer);
26 #ifdef UNICODE
27 #define WNetGetResourceParent WNetGetResourceParentW
28 #else
29 #define WNetGetResourceParent WNetGetResourceParentA
30 #endif
31
32 DWORD APIENTRY WNetGetResourceInformationA(IN LPNETRESOURCEA lpNetResource,
33 OUT LPVOID lpBuffer, IN OUT LPDWORD lpcbBuffer, OUT LPSTR *lplpSystem);
34 DWORD APIENTRY WNetGetResourceInformationW(IN LPNETRESOURCEW lpNetResource,
35 OUT LPVOID lpBuffer, IN OUT LPDWORD lpcbBuffer, OUT LPWSTR *lplpSystem);
36 #ifdef UNICODE
37 #define WNetGetResourceInformation WNetGetResourceInformationW
38 #else
39 #define WNetGetResourceInformation WNetGetResourceInformationA
40 #endif
41 // #endif // (WINVER >= 0x0400)
42 #endif
43 }
44
45 namespace NWindows {
46 namespace NNet {
47
Open(DWORD scope,DWORD type,DWORD usage,LPNETRESOURCE netResource)48 DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCE netResource)
49 {
50 Close();
51 const DWORD result = ::WNetOpenEnum(scope, type, usage, netResource, &_handle);
52 _handleAllocated = (result == NO_ERROR);
53 return result;
54 }
55
56 #ifndef _UNICODE
Open(DWORD scope,DWORD type,DWORD usage,LPNETRESOURCEW netResource)57 DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCEW netResource)
58 {
59 Close();
60 const DWORD result = ::WNetOpenEnumW(scope, type, usage, netResource, &_handle);
61 _handleAllocated = (result == NO_ERROR);
62 return result;
63 }
64 #endif
65
SetComplexString(bool & defined,CSysString & destString,LPCTSTR srcString)66 static void SetComplexString(bool &defined, CSysString &destString, LPCTSTR srcString)
67 {
68 defined = (srcString != NULL);
69 if (defined)
70 destString = srcString;
71 else
72 destString.Empty();
73 }
74
ConvertNETRESOURCEToCResource(const NETRESOURCE & netResource,CResource & resource)75 static void ConvertNETRESOURCEToCResource(const NETRESOURCE &netResource, CResource &resource)
76 {
77 resource.Scope = netResource.dwScope;
78 resource.Type = netResource.dwType;
79 resource.DisplayType = netResource.dwDisplayType;
80 resource.Usage = netResource.dwUsage;
81 SetComplexString(resource.LocalNameIsDefined, resource.LocalName, netResource.lpLocalName);
82 SetComplexString(resource.RemoteNameIsDefined, resource.RemoteName, netResource.lpRemoteName);
83 SetComplexString(resource.CommentIsDefined, resource.Comment, netResource.lpComment);
84 SetComplexString(resource.ProviderIsDefined, resource.Provider, netResource.lpProvider);
85 }
86
SetComplexString2(LPTSTR * destString,bool defined,const CSysString & srcString)87 static void SetComplexString2(LPTSTR *destString, bool defined, const CSysString &srcString)
88 {
89 if (defined)
90 *destString = srcString.Ptr_non_const();
91 else
92 *destString = NULL;
93 }
94
ConvertCResourceToNETRESOURCE(const CResource & resource,NETRESOURCE & netResource)95 static void ConvertCResourceToNETRESOURCE(const CResource &resource, NETRESOURCE &netResource)
96 {
97 netResource.dwScope = resource.Scope;
98 netResource.dwType = resource.Type;
99 netResource.dwDisplayType = resource.DisplayType;
100 netResource.dwUsage = resource.Usage;
101 SetComplexString2(&netResource.lpLocalName, resource.LocalNameIsDefined, resource.LocalName);
102 SetComplexString2(&netResource.lpRemoteName, resource.RemoteNameIsDefined, resource.RemoteName);
103 SetComplexString2(&netResource.lpComment, resource.CommentIsDefined, resource.Comment);
104 SetComplexString2(&netResource.lpProvider, resource.ProviderIsDefined, resource.Provider);
105 }
106
107 #ifndef _UNICODE
108
SetComplexString(bool & defined,UString & destString,LPCWSTR src)109 static void SetComplexString(bool &defined, UString &destString, LPCWSTR src)
110 {
111 defined = (src != NULL);
112 if (defined)
113 destString = src;
114 else
115 destString.Empty();
116 }
117
ConvertNETRESOURCEToCResource(const NETRESOURCEW & netResource,CResourceW & resource)118 static void ConvertNETRESOURCEToCResource(const NETRESOURCEW &netResource, CResourceW &resource)
119 {
120 resource.Scope = netResource.dwScope;
121 resource.Type = netResource.dwType;
122 resource.DisplayType = netResource.dwDisplayType;
123 resource.Usage = netResource.dwUsage;
124 SetComplexString(resource.LocalNameIsDefined, resource.LocalName, netResource.lpLocalName);
125 SetComplexString(resource.RemoteNameIsDefined, resource.RemoteName, netResource.lpRemoteName);
126 SetComplexString(resource.CommentIsDefined, resource.Comment, netResource.lpComment);
127 SetComplexString(resource.ProviderIsDefined, resource.Provider, netResource.lpProvider);
128 }
129
SetComplexString2(LPWSTR * destString,bool defined,const UString & srcString)130 static void SetComplexString2(LPWSTR *destString, bool defined, const UString &srcString)
131 {
132 if (defined)
133 *destString = srcString.Ptr_non_const();
134 else
135 *destString = NULL;
136 }
137
ConvertCResourceToNETRESOURCE(const CResourceW & resource,NETRESOURCEW & netResource)138 static void ConvertCResourceToNETRESOURCE(const CResourceW &resource, NETRESOURCEW &netResource)
139 {
140 netResource.dwScope = resource.Scope;
141 netResource.dwType = resource.Type;
142 netResource.dwDisplayType = resource.DisplayType;
143 netResource.dwUsage = resource.Usage;
144 SetComplexString2(&netResource.lpLocalName, resource.LocalNameIsDefined, resource.LocalName);
145 SetComplexString2(&netResource.lpRemoteName, resource.RemoteNameIsDefined, resource.RemoteName);
146 SetComplexString2(&netResource.lpComment, resource.CommentIsDefined, resource.Comment);
147 SetComplexString2(&netResource.lpProvider, resource.ProviderIsDefined, resource.Provider);
148 }
149
ConvertResourceWToResource(const CResourceW & resourceW,CResource & resource)150 static void ConvertResourceWToResource(const CResourceW &resourceW, CResource &resource)
151 {
152 *(CResourceBase *)&resource = *(CResourceBase *)&resourceW;
153 resource.LocalName = GetSystemString(resourceW.LocalName);
154 resource.RemoteName = GetSystemString(resourceW.RemoteName);
155 resource.Comment = GetSystemString(resourceW.Comment);
156 resource.Provider = GetSystemString(resourceW.Provider);
157 }
158
ConvertResourceToResourceW(const CResource & resource,CResourceW & resourceW)159 static void ConvertResourceToResourceW(const CResource &resource, CResourceW &resourceW)
160 {
161 *(CResourceBase *)&resourceW = *(CResourceBase *)&resource;
162 resourceW.LocalName = GetUnicodeString(resource.LocalName);
163 resourceW.RemoteName = GetUnicodeString(resource.RemoteName);
164 resourceW.Comment = GetUnicodeString(resource.Comment);
165 resourceW.Provider = GetUnicodeString(resource.Provider);
166 }
167 #endif
168
Open(DWORD scope,DWORD type,DWORD usage,const CResource * resource)169 DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, const CResource *resource)
170 {
171 NETRESOURCE netResource;
172 LPNETRESOURCE pointer = NULL;
173 if (resource)
174 {
175 ConvertCResourceToNETRESOURCE(*resource, netResource);
176 pointer = &netResource;
177 }
178 return Open(scope, type, usage, pointer);
179 }
180
181 #ifndef _UNICODE
Open(DWORD scope,DWORD type,DWORD usage,const CResourceW * resource)182 DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, const CResourceW *resource)
183 {
184 if (g_IsNT)
185 {
186 NETRESOURCEW netResource;
187 LPNETRESOURCEW pointer = NULL;
188 if (resource)
189 {
190 ConvertCResourceToNETRESOURCE(*resource, netResource);
191 pointer = &netResource;
192 }
193 return Open(scope, type, usage, pointer);
194 }
195 CResource resourceA;
196 CResource *pointer = NULL;
197 if (resource)
198 {
199 ConvertResourceWToResource(*resource, resourceA);
200 pointer = &resourceA;
201 }
202 return Open(scope, type, usage, pointer);
203 }
204 #endif
205
Close()206 DWORD CEnum::Close()
207 {
208 if (!_handleAllocated)
209 return NO_ERROR;
210 const DWORD result = ::WNetCloseEnum(_handle);
211 _handleAllocated = (result != NO_ERROR);
212 return result;
213 }
214
Next(LPDWORD lpcCount,LPVOID lpBuffer,LPDWORD lpBufferSize)215 DWORD CEnum::Next(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
216 {
217 return ::WNetEnumResource(_handle, lpcCount, lpBuffer, lpBufferSize);
218 }
219
220 #ifndef _UNICODE
NextW(LPDWORD lpcCount,LPVOID lpBuffer,LPDWORD lpBufferSize)221 DWORD CEnum::NextW(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
222 {
223 return ::WNetEnumResourceW(_handle, lpcCount, lpBuffer, lpBufferSize);
224 }
225 #endif
226
Next(CResource & resource)227 DWORD CEnum::Next(CResource &resource)
228 {
229 const DWORD kBufferSize = 16384;
230 CByteArr byteBuffer(kBufferSize);
231 LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (void *) (BYTE *)(byteBuffer);
232 ZeroMemory(lpnrLocal, kBufferSize);
233 DWORD bufferSize = kBufferSize;
234 DWORD numEntries = 1;
235 const DWORD result = Next(&numEntries, lpnrLocal, &bufferSize);
236 if (result != NO_ERROR)
237 return result;
238 if (numEntries != 1)
239 return (DWORD)E_FAIL;
240 ConvertNETRESOURCEToCResource(lpnrLocal[0], resource);
241 return result;
242 }
243
244 #ifndef _UNICODE
Next(CResourceW & resource)245 DWORD CEnum::Next(CResourceW &resource)
246 {
247 if (g_IsNT)
248 {
249 const DWORD kBufferSize = 16384;
250 CByteArr byteBuffer(kBufferSize);
251 LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (void *) (BYTE *)(byteBuffer);
252 ZeroMemory(lpnrLocal, kBufferSize);
253 DWORD bufferSize = kBufferSize;
254 DWORD numEntries = 1;
255 const DWORD result = NextW(&numEntries, lpnrLocal, &bufferSize);
256 if (result != NO_ERROR)
257 return result;
258 if (numEntries != 1)
259 return (DWORD)E_FAIL;
260 ConvertNETRESOURCEToCResource(lpnrLocal[0], resource);
261 return result;
262 }
263 CResource resourceA;
264 const DWORD result = Next(resourceA);
265 ConvertResourceToResourceW(resourceA, resource);
266 return result;
267 }
268 #endif
269
270
GetResourceParent(const CResource & resource,CResource & parentResource)271 DWORD GetResourceParent(const CResource &resource, CResource &parentResource)
272 {
273 const DWORD kBufferSize = 16384;
274 CByteArr byteBuffer(kBufferSize);
275 LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (void *) (BYTE *)(byteBuffer);
276 ZeroMemory(lpnrLocal, kBufferSize);
277 DWORD bufferSize = kBufferSize;
278 NETRESOURCE netResource;
279 ConvertCResourceToNETRESOURCE(resource, netResource);
280 const DWORD result = ::WNetGetResourceParent(&netResource, lpnrLocal, &bufferSize);
281 if (result != NO_ERROR)
282 return result;
283 ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource);
284 return result;
285 }
286
287 #ifndef _UNICODE
GetResourceParent(const CResourceW & resource,CResourceW & parentResource)288 DWORD GetResourceParent(const CResourceW &resource, CResourceW &parentResource)
289 {
290 if (g_IsNT)
291 {
292 const DWORD kBufferSize = 16384;
293 CByteArr byteBuffer(kBufferSize);
294 LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (void *) (BYTE *)(byteBuffer);
295 ZeroMemory(lpnrLocal, kBufferSize);
296 DWORD bufferSize = kBufferSize;
297 NETRESOURCEW netResource;
298 ConvertCResourceToNETRESOURCE(resource, netResource);
299 const DWORD result = ::WNetGetResourceParentW(&netResource, lpnrLocal, &bufferSize);
300 if (result != NO_ERROR)
301 return result;
302 ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource);
303 return result;
304 }
305 CResource resourceA, parentResourceA;
306 ConvertResourceWToResource(resource, resourceA);
307 const DWORD result = GetResourceParent(resourceA, parentResourceA);
308 ConvertResourceToResourceW(parentResourceA, parentResource);
309 return result;
310 }
311 #endif
312
GetResourceInformation(const CResource & resource,CResource & destResource,CSysString & systemPathPart)313 DWORD GetResourceInformation(const CResource &resource,
314 CResource &destResource, CSysString &systemPathPart)
315 {
316 const DWORD kBufferSize = 16384;
317 CByteArr byteBuffer(kBufferSize);
318 LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) (void *) (BYTE *)(byteBuffer);
319 ZeroMemory(lpnrLocal, kBufferSize);
320 DWORD bufferSize = kBufferSize;
321 NETRESOURCE netResource;
322 ConvertCResourceToNETRESOURCE(resource, netResource);
323 LPTSTR lplpSystem;
324 const DWORD result = ::WNetGetResourceInformation(&netResource,
325 lpnrLocal, &bufferSize, &lplpSystem);
326 if (result != NO_ERROR)
327 return result;
328 if (lplpSystem != NULL)
329 systemPathPart = lplpSystem;
330 ConvertNETRESOURCEToCResource(lpnrLocal[0], destResource);
331 return result;
332 }
333
334 #ifndef _UNICODE
GetResourceInformation(const CResourceW & resource,CResourceW & destResource,UString & systemPathPart)335 DWORD GetResourceInformation(const CResourceW &resource,
336 CResourceW &destResource, UString &systemPathPart)
337 {
338 if (g_IsNT)
339 {
340 const DWORD kBufferSize = 16384;
341 CByteArr byteBuffer(kBufferSize);
342 LPNETRESOURCEW lpnrLocal = (LPNETRESOURCEW) (void *) (BYTE *)(byteBuffer);
343 ZeroMemory(lpnrLocal, kBufferSize);
344 DWORD bufferSize = kBufferSize;
345 NETRESOURCEW netResource;
346 ConvertCResourceToNETRESOURCE(resource, netResource);
347 LPWSTR lplpSystem;
348 const DWORD result = ::WNetGetResourceInformationW(&netResource,
349 lpnrLocal, &bufferSize, &lplpSystem);
350 if (result != NO_ERROR)
351 return result;
352 if (lplpSystem != 0)
353 systemPathPart = lplpSystem;
354 ConvertNETRESOURCEToCResource(lpnrLocal[0], destResource);
355 return result;
356 }
357 CResource resourceA, destResourceA;
358 ConvertResourceWToResource(resource, resourceA);
359 AString systemPathPartA;
360 const DWORD result = GetResourceInformation(resourceA, destResourceA, systemPathPartA);
361 ConvertResourceToResourceW(destResourceA, destResource);
362 systemPathPart = GetUnicodeString(systemPathPartA);
363 return result;
364 }
365 #endif
366
AddConnection2(const CResource & resource,LPCTSTR password,LPCTSTR userName,DWORD flags)367 DWORD AddConnection2(const CResource &resource,
368 LPCTSTR password, LPCTSTR userName, DWORD flags)
369 {
370 NETRESOURCE netResource;
371 ConvertCResourceToNETRESOURCE(resource, netResource);
372 return ::WNetAddConnection2(&netResource,
373 password, userName, flags);
374 }
375
376 DWORD AddConnection2(const CResource &resource, LPCTSTR password, LPCTSTR userName, DWORD flags);
377
378 #ifndef _UNICODE
AddConnection2(const CResourceW & resource,LPCWSTR password,LPCWSTR userName,DWORD flags)379 DWORD AddConnection2(const CResourceW &resource, LPCWSTR password, LPCWSTR userName, DWORD flags)
380 {
381 if (g_IsNT)
382 {
383 NETRESOURCEW netResource;
384 ConvertCResourceToNETRESOURCE(resource, netResource);
385 return ::WNetAddConnection2W(&netResource,password, userName, flags);
386 }
387 CResource resourceA;
388 ConvertResourceWToResource(resource, resourceA);
389 const CSysString passwordA (GetSystemString(password));
390 const CSysString userNameA (GetSystemString(userName));
391 return AddConnection2(resourceA,
392 password ? (LPCTSTR)passwordA: 0,
393 userName ? (LPCTSTR)userNameA: 0,
394 flags);
395 }
396 #endif
397
398 }}
399