xref: /aosp_15_r20/external/lzma/CPP/Windows/Net.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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