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 namespace NWindows {
18 namespace NNet {
19 
Open(DWORD scope,DWORD type,DWORD usage,LPNETRESOURCE netResource)20 DWORD 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
Open(DWORD scope,DWORD type,DWORD usage,LPNETRESOURCEW netResource)29 DWORD 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 
SetComplexString(bool & defined,CSysString & destString,LPCTSTR srcString)38 static 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 
ConvertNETRESOURCEToCResource(const NETRESOURCE & netResource,CResource & resource)47 static 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 
SetComplexString2(LPTSTR * destString,bool defined,const CSysString & srcString)59 static 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 
ConvertCResourceToNETRESOURCE(const CResource & resource,NETRESOURCE & netResource)67 static 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 
SetComplexString(bool & defined,UString & destString,LPCWSTR src)81 static 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 
ConvertNETRESOURCEToCResource(const NETRESOURCEW & netResource,CResourceW & resource)90 static 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 
SetComplexString2(LPWSTR * destString,bool defined,const UString & srcString)102 static 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 
ConvertCResourceToNETRESOURCE(const CResourceW & resource,NETRESOURCEW & netResource)110 static 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 
ConvertResourceWToResource(const CResourceW & resourceW,CResource & resource)122 static 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 
ConvertResourceToResourceW(const CResource & resource,CResourceW & resourceW)131 static 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 
Open(DWORD scope,DWORD type,DWORD usage,const CResource * resource)141 DWORD 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
Open(DWORD scope,DWORD type,DWORD usage,const CResourceW * resource)154 DWORD 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 
Close()178 DWORD 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 
Next(LPDWORD lpcCount,LPVOID lpBuffer,LPDWORD lpBufferSize)187 DWORD CEnum::Next(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
188 {
189   return ::WNetEnumResource(_handle, lpcCount, lpBuffer, lpBufferSize);
190 }
191 
192 #ifndef _UNICODE
NextW(LPDWORD lpcCount,LPVOID lpBuffer,LPDWORD lpBufferSize)193 DWORD CEnum::NextW(LPDWORD lpcCount, LPVOID lpBuffer, LPDWORD lpBufferSize)
194 {
195   return ::WNetEnumResourceW(_handle, lpcCount, lpBuffer, lpBufferSize);
196 }
197 #endif
198 
Next(CResource & resource)199 DWORD 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
Next(CResourceW & resource)217 DWORD 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 
GetResourceParent(const CResource & resource,CResource & parentResource)243 DWORD 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
GetResourceParent(const CResourceW & resource,CResourceW & parentResource)260 DWORD 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 
GetResourceInformation(const CResource & resource,CResource & destResource,CSysString & systemPathPart)285 DWORD 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
GetResourceInformation(const CResourceW & resource,CResourceW & destResource,UString & systemPathPart)307 DWORD 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 
AddConnection2(const CResource & resource,LPCTSTR password,LPCTSTR userName,DWORD flags)339 DWORD 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 
348 DWORD AddConnection2(const CResource &resource, LPCTSTR password, LPCTSTR userName, DWORD flags);
349 
350 #ifndef _UNICODE
AddConnection2(const CResourceW & resource,LPCWSTR password,LPCWSTR userName,DWORD flags)351 DWORD 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 }}
371