Added an unknown VxD error code.
[wine] / dlls / mpr / wnet.c
1 /*
2  * MPR WNet functions
3  */
4
5 #include <ctype.h>
6 #include <string.h>
7 #include <sys/types.h>
8 #include <pwd.h>
9 #include <unistd.h>
10
11 #include "winbase.h"
12 #include "winnetwk.h"
13 #include "heap.h"
14 #include "debugtools.h"
15
16 DEFAULT_DEBUG_CHANNEL(mpr);
17
18
19 /*
20  * Browsing Functions
21  */
22
23 /*********************************************************************
24  * WNetOpenEnumA [MPR.92]
25  */
26 DWORD WINAPI WNetOpenEnumA( DWORD dwScope, DWORD dwType, DWORD dwUsage,
27                             LPNETRESOURCEA lpNet, LPHANDLE lphEnum )
28 {
29     FIXME( "(%08lX, %08lX, %08lX, %p, %p): stub\n",
30             dwScope, dwType, dwUsage, lpNet, lphEnum );
31
32     SetLastError(WN_NO_NETWORK);
33     return WN_NO_NETWORK;
34 }
35
36 /*********************************************************************
37  * WNetOpenEnumW [MPR.93]
38  */
39 DWORD WINAPI WNetOpenEnumW( DWORD dwScope, DWORD dwType, DWORD dwUsage,
40                             LPNETRESOURCEW lpNet, LPHANDLE lphEnum )
41 {
42    FIXME( "(%08lX, %08lX, %08lX, %p, %p): stub\n",
43           dwScope, dwType, dwUsage, lpNet, lphEnum );
44
45    SetLastError(WN_NO_NETWORK);
46    return WN_NO_NETWORK;
47 }
48
49 /*********************************************************************
50  * WNetEnumResourceA [MPR.66]
51  */
52 DWORD WINAPI WNetEnumResourceA( HANDLE hEnum, LPDWORD lpcCount, 
53                                 LPVOID lpBuffer, LPDWORD lpBufferSize )
54 {
55     FIXME( "(%04X, %p, %p, %p): stub\n", 
56             hEnum, lpcCount, lpBuffer, lpBufferSize );
57
58     SetLastError(WN_NO_NETWORK);
59     return WN_NO_NETWORK;
60 }
61
62 /*********************************************************************
63  * WNetEnumResourceW [MPR.67]
64  */
65 DWORD WINAPI WNetEnumResourceW( HANDLE hEnum, LPDWORD lpcCount, 
66                                 LPVOID lpBuffer, LPDWORD lpBufferSize )
67 {
68     FIXME( "(%04X, %p, %p, %p): stub\n", 
69             hEnum, lpcCount, lpBuffer, lpBufferSize );
70
71     SetLastError(WN_NO_NETWORK);
72     return WN_NO_NETWORK;
73 }
74
75 /*********************************************************************
76  * WNetCloseEnum [MPR.58]
77  */
78 DWORD WINAPI WNetCloseEnum( HANDLE hEnum )
79 {
80     FIXME( "(%04X): stub\n", hEnum );
81
82     SetLastError(WN_NO_NETWORK);
83     return WN_NO_NETWORK;
84 }
85
86 /*********************************************************************
87  * WNetGetResourceInformationA [MPR.80]
88  */
89 DWORD WINAPI WNetGetResourceInformationA( LPNETRESOURCEA lpNetResource, 
90                                           LPVOID lpBuffer, LPDWORD cbBuffer, 
91                                           LPSTR *lplpSystem )
92 {
93     FIXME( "(%p, %p, %p, %p): stub\n",
94            lpNetResource, lpBuffer, cbBuffer, lplpSystem );
95
96     SetLastError(WN_NO_NETWORK);
97     return WN_NO_NETWORK;
98 }
99
100 /*********************************************************************
101  * WNetGetResourceInformationW [MPR.80]
102  */
103 DWORD WINAPI WNetGetResourceInformationW( LPNETRESOURCEW lpNetResource, 
104                                           LPVOID lpBuffer, LPDWORD cbBuffer, 
105                                           LPWSTR *lplpSystem )
106 {
107     FIXME( "(%p, %p, %p, %p): stub\n",
108            lpNetResource, lpBuffer, cbBuffer, lplpSystem );
109
110     SetLastError(WN_NO_NETWORK);
111     return WN_NO_NETWORK;
112 }
113
114 /*********************************************************************
115  * WNetGetResourceParentA [MPR.83]
116  */
117 DWORD WINAPI WNetGetResourceParentA( LPNETRESOURCEA lpNetResource,
118                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
119 {
120     FIXME( "(%p, %p, %p): stub\n", 
121            lpNetResource, lpBuffer, lpBufferSize );
122
123     SetLastError(WN_NO_NETWORK);
124     return WN_NO_NETWORK;
125 }
126
127 /*********************************************************************
128  * WNetGetResourceParentW [MPR.84]
129  */
130 DWORD WINAPI WNetGetResourceParentW( LPNETRESOURCEW lpNetResource,
131                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
132 {
133     FIXME( "(%p, %p, %p): stub\n", 
134            lpNetResource, lpBuffer, lpBufferSize );
135
136     SetLastError(WN_NO_NETWORK);
137     return WN_NO_NETWORK;
138 }
139
140
141
142 /*
143  * Connection Functions
144  */
145
146 /*********************************************************************
147  *  WNetAddConnectionA [MPR.50] 
148  */
149 DWORD WINAPI WNetAddConnectionA( LPCSTR lpRemoteName, LPCSTR lpPassword,
150                                  LPCSTR lpLocalName )
151 {
152     FIXME( "(%s, %p, %s): stub\n", 
153            debugstr_a(lpRemoteName), lpPassword, debugstr_a(lpLocalName) );
154
155     SetLastError(WN_NO_NETWORK);
156     return WN_NO_NETWORK;
157 }
158
159 /*********************************************************************
160  *  WNetAddConnectionW [MPR.51] 
161  */
162 DWORD WINAPI WNetAddConnectionW( LPCWSTR lpRemoteName, LPCWSTR lpPassword,
163                                  LPCWSTR lpLocalName )
164 {
165     FIXME( "(%s, %p, %s): stub\n", 
166            debugstr_w(lpRemoteName), lpPassword, debugstr_w(lpLocalName) );
167
168     SetLastError(WN_NO_NETWORK);
169     return WN_NO_NETWORK;
170 }
171
172 /*********************************************************************
173  *  WNetAddConnection2A [MPR.46] 
174  */
175 DWORD WINAPI WNetAddConnection2A( LPNETRESOURCEA lpNetResource,
176                                   LPCSTR lpPassword, LPCSTR lpUserID, 
177                                   DWORD dwFlags )
178 {
179     FIXME( "(%p, %p, %s, 0x%08lX): stub\n", 
180            lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags );
181
182     SetLastError(WN_NO_NETWORK);
183     return WN_NO_NETWORK;
184 }
185
186 /*********************************************************************
187  * WNetAddConnection2W [MPR.47]
188  */
189 DWORD WINAPI WNetAddConnection2W( LPNETRESOURCEW lpNetResource,
190                                   LPCWSTR lpPassword, LPCWSTR lpUserID, 
191                                   DWORD dwFlags )
192 {
193     FIXME( "(%p, %p, %s, 0x%08lX): stub\n", 
194            lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags );
195
196     SetLastError(WN_NO_NETWORK);
197     return WN_NO_NETWORK;
198 }
199
200 /*********************************************************************
201  * WNetAddConnection3A [MPR.48]
202  */
203 DWORD WINAPI WNetAddConnection3A( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
204                                   LPCSTR lpPassword, LPCSTR lpUserID, 
205                                   DWORD dwFlags )
206 {
207     FIXME( "(%04x, %p, %p, %s, 0x%08lX), stub\n", 
208            hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags );
209
210     SetLastError(WN_NO_NETWORK);
211     return WN_NO_NETWORK;
212 }
213
214 /*********************************************************************
215  * WNetAddConnection3W [MPR.49]
216  */
217 DWORD WINAPI WNetAddConnection3W( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
218                                   LPCWSTR lpPassword, LPCWSTR lpUserID, 
219                                   DWORD dwFlags )
220 {
221     FIXME( "(%04x, %p, %p, %s, 0x%08lX), stub\n", 
222            hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags );
223
224     SetLastError(WN_NO_NETWORK);
225     return WN_NO_NETWORK;
226
227
228 /*****************************************************************
229  *  WNetUseConnectionA [MPR.100]
230  */
231 DWORD WINAPI WNetUseConnectionA( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
232                                  LPCSTR lpPassword, LPCSTR lpUserID, DWORD dwFlags,
233                                  LPSTR lpAccessName, LPDWORD lpBufferSize, 
234                                  LPDWORD lpResult )
235 {
236     FIXME( "(%04x, %p, %p, %s, 0x%08lX, %s, %p, %p), stub\n", 
237            hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags,
238            debugstr_a(lpAccessName), lpBufferSize, lpResult );
239
240     SetLastError(WN_NO_NETWORK);
241     return WN_NO_NETWORK;
242 }
243
244 /*****************************************************************
245  *  WNetUseConnectionW [MPR.101]
246  */
247 DWORD WINAPI WNetUseConnectionW( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
248                                  LPCWSTR lpPassword, LPCWSTR lpUserID, DWORD dwFlags,
249                                  LPWSTR lpAccessName, LPDWORD lpBufferSize,
250                                  LPDWORD lpResult )
251 {
252     FIXME( "(%04x, %p, %p, %s, 0x%08lX, %s, %p, %p), stub\n", 
253            hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,
254            debugstr_w(lpAccessName), lpBufferSize, lpResult );
255
256     SetLastError(WN_NO_NETWORK);
257     return WN_NO_NETWORK;
258 }
259
260 /*********************************************************************
261  *  WNetCancelConnectionA [MPR.55]
262  */
263 DWORD WINAPI WNetCancelConnectionA( LPCSTR lpName, BOOL fForce )
264 {
265     FIXME( "(%s, %d), stub\n", debugstr_a(lpName), fForce );
266
267     return WN_SUCCESS;
268 }
269
270 /*********************************************************************
271  *  WNetCancelConnectionW [MPR.56]
272  */
273 DWORD WINAPI WNetCancelConnectionW( LPCWSTR lpName, BOOL fForce ) 
274 {
275     FIXME( "(%s, %d), stub\n", debugstr_w(lpName), fForce );
276
277     return WN_SUCCESS;
278 }
279
280 /*********************************************************************
281  *  WNetCancelConnection2A [MPR.53]
282  */
283 DWORD WINAPI WNetCancelConnection2A( LPCSTR lpName, DWORD dwFlags, BOOL fForce ) 
284 {
285     FIXME( "(%s, %08lX, %d), stub\n", debugstr_a(lpName), dwFlags, fForce );
286
287     return WN_SUCCESS;
288 }
289
290 /*********************************************************************
291  *  WNetCancelConnection2W [MPR.54]
292  */
293 DWORD WINAPI WNetCancelConnection2W( LPCWSTR lpName, DWORD dwFlags, BOOL fForce ) 
294 {
295     FIXME( "(%s, %08lX, %d), stub\n", debugstr_w(lpName), dwFlags, fForce );
296
297     return WN_SUCCESS;
298 }
299
300 /*****************************************************************
301  *  WNetRestoreConnectionA [MPR.96]
302  */
303 DWORD WINAPI WNetRestoreConnectionA( HWND hwndOwner, LPSTR lpszDevice )
304 {
305     FIXME( "(%04X, %s), stub\n", hwndOwner, debugstr_a(lpszDevice) );
306
307     SetLastError(WN_NO_NETWORK);
308     return WN_NO_NETWORK;
309 }
310
311 /*****************************************************************
312  *  WNetRestoreConnectionW [MPR.97]
313  */
314 DWORD WINAPI WNetRestoreConnectionW( HWND hwndOwner, LPWSTR lpszDevice )
315 {
316     FIXME( "(%04X, %s), stub\n", hwndOwner, debugstr_w(lpszDevice) );
317
318     SetLastError(WN_NO_NETWORK);
319     return WN_NO_NETWORK;
320 }
321
322 /**************************************************************************
323  * WNetGetConnectionA [MPR.71]
324  *
325  * RETURNS
326  * - WN_BAD_LOCALNAME     lpLocalName makes no sense
327  * - WN_NOT_CONNECTED     drive is a local drive
328  * - WN_MORE_DATA         buffer isn't big enough
329  * - WN_SUCCESS           success (net path in buffer)  
330  *
331  */
332 DWORD WINAPI WNetGetConnectionA( LPCSTR lpLocalName, 
333                                  LPSTR lpRemoteName, LPDWORD lpBufferSize )
334 {
335     char label[40];
336
337     TRACE( "local %s\n", lpLocalName );
338     if (lpLocalName[1] == ':')
339     {
340         switch(GetDriveTypeA(lpLocalName))
341         {
342         case DRIVE_REMOTE:
343             if (!GetVolumeInformationA( lpLocalName, label, sizeof(label),
344                                         NULL, NULL, NULL, NULL, 0 )) label[0] = 0;
345             if (strlen(label) + 1 > *lpBufferSize)
346             {
347                 *lpBufferSize = strlen(label) + 1;
348                 return WN_MORE_DATA;
349             }
350             strcpy( lpRemoteName, label );
351             *lpBufferSize = strlen(lpRemoteName) + 1;
352             return WN_SUCCESS;
353         case DRIVE_REMOVABLE:
354         case DRIVE_FIXED:
355         case DRIVE_CDROM:
356           TRACE("file is local\n");
357           return WN_NOT_CONNECTED;
358         default:
359             return WN_BAD_LOCALNAME;
360         }
361     }
362     return WN_BAD_LOCALNAME;
363 }
364
365 /**************************************************************************
366  * WNetGetConnectionW [MPR.72]
367  */
368 DWORD WINAPI WNetGetConnectionW( LPCWSTR lpLocalName, 
369                                  LPWSTR lpRemoteName, LPDWORD lpBufferSize )
370 {
371     CHAR  buf[200];
372     DWORD x = sizeof(buf);
373     LPSTR lnA = HEAP_strdupWtoA( GetProcessHeap(), 0, lpLocalName );
374     DWORD ret = WNetGetConnectionA( lnA, buf, &x );
375     HeapFree( GetProcessHeap(), 0, lnA );
376     if (ret == WN_SUCCESS)
377     {
378         x = MultiByteToWideChar( CP_ACP, 0, buf, -1, NULL, 0 );
379         if (x > *lpBufferSize)
380         {
381             *lpBufferSize = x;
382             return WN_MORE_DATA;
383         }
384         *lpBufferSize = MultiByteToWideChar( CP_ACP, 0, buf, -1, lpRemoteName, *lpBufferSize );
385     }
386     return ret;
387 }
388
389 /**************************************************************************
390  * WNetSetConnectionA [MPR.72]
391  */
392 DWORD WINAPI WNetSetConnectionA( LPCSTR lpName, DWORD dwProperty, 
393                                  LPVOID pvValue )
394 {
395     FIXME( "(%s, %08lX, %p): stub\n", debugstr_a(lpName), dwProperty, pvValue );
396
397     SetLastError(WN_NO_NETWORK);
398     return WN_NO_NETWORK;
399 }
400
401 /**************************************************************************
402  * WNetSetConnectionW [MPR.72]
403  */
404 DWORD WINAPI WNetSetConnectionW( LPCWSTR lpName, DWORD dwProperty, 
405                                  LPVOID pvValue )
406 {
407     FIXME( "(%s, %08lX, %p): stub\n", debugstr_w(lpName), dwProperty, pvValue );
408
409     SetLastError(WN_NO_NETWORK);
410     return WN_NO_NETWORK;
411 }
412
413 /*****************************************************************
414  * WNetGetUniversalNameA [MPR.85]
415  */
416 DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel, 
417                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
418 {
419     FIXME( "(%s, 0x%08lX, %p, %p): stub\n", 
420            debugstr_a(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
421
422     SetLastError(WN_NO_NETWORK);
423     return WN_NO_NETWORK;
424 }
425
426 /*****************************************************************
427  * WNetGetUniversalNameW [MPR.86]
428  */
429 DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel, 
430                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
431 {
432     FIXME( "(%s, 0x%08lX, %p, %p): stub\n", 
433            debugstr_w(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
434
435     SetLastError(WN_NO_NETWORK);
436     return WN_NO_NETWORK;
437 }
438
439
440
441 /*
442  * Other Functions
443  */
444
445 /**************************************************************************
446  * WNetGetUserA [MPR.86]
447  *
448  * FIXME: we should not return ourselves, but the owner of the drive lpName
449  */
450 DWORD WINAPI WNetGetUserA( LPCSTR lpName, LPSTR lpUserID, LPDWORD lpBufferSize )
451 {
452     struct passwd *pwd = getpwuid(getuid());
453
454     FIXME( "(%s, %p, %p): mostly stub\n", 
455            debugstr_a(lpName), lpUserID, lpBufferSize );
456
457     if (pwd)
458     {
459         if ( strlen(pwd->pw_name) + 1 > *lpBufferSize )
460         {
461             *lpBufferSize = strlen(pwd->pw_name) + 1;
462
463             SetLastError(ERROR_MORE_DATA);
464             return ERROR_MORE_DATA;
465         }
466
467         strcpy( lpUserID, pwd->pw_name );
468         *lpBufferSize = strlen(pwd->pw_name) + 1;
469         return WN_SUCCESS;
470     }
471
472     /* FIXME: wrong return value */
473     SetLastError(ERROR_NO_NETWORK);
474     return ERROR_NO_NETWORK;
475 }
476
477 /*****************************************************************
478  * WNetGetUserW [MPR.87]
479  */
480 DWORD WINAPI WNetGetUserW( LPCWSTR lpName, LPWSTR lpUserID, LPDWORD lpBufferSize ) 
481 {
482     FIXME( "(%s, %p, %p): mostly stub\n", 
483            debugstr_w(lpName), lpUserID, lpBufferSize );
484
485     SetLastError(WN_NO_NETWORK);
486     return WN_NO_NETWORK;
487 }
488
489 /*********************************************************************
490  * WNetConnectionDialog [MPR.61]
491  */ 
492 DWORD WINAPI WNetConnectionDialog( HWND hwnd, DWORD dwType )
493
494     FIXME( "(%04x, %08lX): stub\n", hwnd, dwType );
495
496     SetLastError(WN_NO_NETWORK);
497     return ERROR_NO_NETWORK;
498 }
499
500 /*********************************************************************
501  * WNetConnectionDialog1A [MPR.59]
502  */
503 DWORD WINAPI WNetConnectionDialog1A( LPCONNECTDLGSTRUCTA lpConnDlgStruct )
504
505     FIXME( "(%p): stub\n", lpConnDlgStruct );
506
507     SetLastError(WN_NO_NETWORK);
508     return ERROR_NO_NETWORK;
509 }
510
511 /*********************************************************************
512  * WNetConnectionDialog1W [MPR.60]
513  */ 
514 DWORD WINAPI WNetConnectionDialog1W( LPCONNECTDLGSTRUCTW lpConnDlgStruct )
515
516     FIXME( "(%p): stub\n", lpConnDlgStruct );
517
518     SetLastError(WN_NO_NETWORK);
519     return ERROR_NO_NETWORK;
520 }
521
522 /*********************************************************************
523  * WNetDisconnectDialog [MPR.64]
524  */ 
525 DWORD WINAPI WNetDisconnectDialog( HWND hwnd, DWORD dwType )
526
527     FIXME( "(%04x, %08lX): stub\n", hwnd, dwType );
528
529     SetLastError(WN_NO_NETWORK);
530     return ERROR_NO_NETWORK;
531 }
532
533 /*********************************************************************
534  * WNetDisconnectDialog1A [MPR.62]
535  */ 
536 DWORD WINAPI WNetDisconnectDialog1A( LPDISCDLGSTRUCTA lpConnDlgStruct )
537
538     FIXME( "(%p): stub\n", lpConnDlgStruct );
539
540     SetLastError(WN_NO_NETWORK);
541     return ERROR_NO_NETWORK;
542 }
543
544 /*********************************************************************
545  * WNetDisconnectDialog1W [MPR.63]
546  */ 
547 DWORD WINAPI WNetDisconnectDialog1W( LPDISCDLGSTRUCTW lpConnDlgStruct )
548
549     FIXME( "(%p): stub\n", lpConnDlgStruct );
550
551     SetLastError(WN_NO_NETWORK);
552     return ERROR_NO_NETWORK;
553 }
554
555 /*********************************************************************
556  * WNetGetLastErrorA [MPR.75]
557  */ 
558 DWORD WINAPI WNetGetLastErrorA( LPDWORD lpError,
559                                 LPSTR lpErrorBuf, DWORD nErrorBufSize,
560                                 LPSTR lpNameBuf, DWORD nNameBufSize )
561 {
562     FIXME( "(%p, %p, %ld, %p, %ld): stub\n", 
563            lpError, lpErrorBuf, nErrorBufSize, lpNameBuf, nNameBufSize );
564
565     SetLastError(WN_NO_NETWORK);
566     return ERROR_NO_NETWORK;
567 }
568
569 /*********************************************************************
570  * WNetGetLastErrorW [MPR.76]
571  */ 
572 DWORD WINAPI WNetGetLastErrorW( LPDWORD lpError,
573                                 LPWSTR lpErrorBuf, DWORD nErrorBufSize,
574                          LPWSTR lpNameBuf, DWORD nNameBufSize )
575 {
576     FIXME( "(%p, %p, %ld, %p, %ld): stub\n", 
577            lpError, lpErrorBuf, nErrorBufSize, lpNameBuf, nNameBufSize );
578
579     SetLastError(WN_NO_NETWORK);
580     return ERROR_NO_NETWORK;
581 }
582
583 /*********************************************************************
584  * WNetGetNetworkInformationA [MPR.77]
585  */ 
586 DWORD WINAPI WNetGetNetworkInformationA( LPCSTR lpProvider, 
587                                          LPNETINFOSTRUCT lpNetInfoStruct )
588 {
589     FIXME( "(%s, %p): stub\n", debugstr_a(lpProvider), lpNetInfoStruct );
590
591     SetLastError(WN_NO_NETWORK);
592     return ERROR_NO_NETWORK;
593 }
594
595 /*********************************************************************
596  * WNetGetNetworkInformationW [MPR.77]
597  */ 
598 DWORD WINAPI WNetGetNetworkInformationW( LPCWSTR lpProvider, 
599                                          LPNETINFOSTRUCT lpNetInfoStruct )
600 {
601     FIXME( "(%s, %p): stub\n", debugstr_w(lpProvider), lpNetInfoStruct );
602
603     SetLastError(WN_NO_NETWORK);
604     return ERROR_NO_NETWORK;
605 }
606
607 /*****************************************************************
608  *  WNetGetProviderNameA [MPR.79]
609  */
610 DWORD WINAPI WNetGetProviderNameA( DWORD dwNetType, 
611                                    LPSTR lpProvider, LPDWORD lpBufferSize )
612 {
613     FIXME( "(%ld, %p, %p): stub\n", dwNetType, lpProvider, lpBufferSize );
614
615     SetLastError(WN_NO_NETWORK);
616     return WN_NO_NETWORK;
617 }
618
619 /*****************************************************************
620  *  WNetGetProviderNameW [MPR.80]
621  */
622 DWORD WINAPI WNetGetProviderNameW( DWORD dwNetType,
623                                    LPWSTR lpProvider, LPDWORD lpBufferSize ) 
624 {
625     FIXME( "(%ld, %p, %p): stub\n", dwNetType, lpProvider, lpBufferSize );
626
627     SetLastError(WN_NO_NETWORK);
628     return WN_NO_NETWORK;
629 }
630