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