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