Fixed vm86_enter race conditions.
[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 "winnls.h"
13 #include "winnetwk.h"
14 #include "debugtools.h"
15
16 DEFAULT_DEBUG_CHANNEL(mpr);
17
18
19 /*
20  * Browsing Functions
21  */
22
23 /*********************************************************************
24  * WNetOpenEnumA [MPR.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
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.@]
367  */
368 DWORD WINAPI WNetGetConnectionW( LPCWSTR lpLocalName, 
369                                  LPWSTR lpRemoteName, LPDWORD lpBufferSize )
370 {
371     CHAR  buf[200];
372     DWORD ret, x = sizeof(buf);
373     INT len = WideCharToMultiByte( CP_ACP, 0, lpLocalName, -1, NULL, 0, NULL, NULL );
374     LPSTR lnA = HeapAlloc( GetProcessHeap(), 0, len );
375
376     WideCharToMultiByte( CP_ACP, 0, lpLocalName, -1, lnA, len, NULL, NULL );
377     ret = WNetGetConnectionA( lnA, buf, &x );
378     HeapFree( GetProcessHeap(), 0, lnA );
379     if (ret == WN_SUCCESS)
380     {
381         x = MultiByteToWideChar( CP_ACP, 0, buf, -1, NULL, 0 );
382         if (x > *lpBufferSize)
383         {
384             *lpBufferSize = x;
385             return WN_MORE_DATA;
386         }
387         *lpBufferSize = MultiByteToWideChar( CP_ACP, 0, buf, -1, lpRemoteName, *lpBufferSize );
388     }
389     return ret;
390 }
391
392 /**************************************************************************
393  * WNetSetConnectionA [MPR.@]
394  */
395 DWORD WINAPI WNetSetConnectionA( LPCSTR lpName, DWORD dwProperty, 
396                                  LPVOID pvValue )
397 {
398     FIXME( "(%s, %08lX, %p): stub\n", debugstr_a(lpName), dwProperty, pvValue );
399
400     SetLastError(WN_NO_NETWORK);
401     return WN_NO_NETWORK;
402 }
403
404 /**************************************************************************
405  * WNetSetConnectionW [MPR.@]
406  */
407 DWORD WINAPI WNetSetConnectionW( LPCWSTR lpName, DWORD dwProperty, 
408                                  LPVOID pvValue )
409 {
410     FIXME( "(%s, %08lX, %p): stub\n", debugstr_w(lpName), dwProperty, pvValue );
411
412     SetLastError(WN_NO_NETWORK);
413     return WN_NO_NETWORK;
414 }
415
416 /*****************************************************************
417  * WNetGetUniversalNameA [MPR.@]
418  */
419 DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel, 
420                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
421 {
422     FIXME( "(%s, 0x%08lX, %p, %p): stub\n", 
423            debugstr_a(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
424
425     SetLastError(WN_NO_NETWORK);
426     return WN_NO_NETWORK;
427 }
428
429 /*****************************************************************
430  * WNetGetUniversalNameW [MPR.@]
431  */
432 DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel, 
433                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
434 {
435     FIXME( "(%s, 0x%08lX, %p, %p): stub\n", 
436            debugstr_w(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
437
438     SetLastError(WN_NO_NETWORK);
439     return WN_NO_NETWORK;
440 }
441
442
443
444 /*
445  * Other Functions
446  */
447
448 /**************************************************************************
449  * WNetGetUserA [MPR.@]
450  *
451  * FIXME: we should not return ourselves, but the owner of the drive lpName
452  */
453 DWORD WINAPI WNetGetUserA( LPCSTR lpName, LPSTR lpUserID, LPDWORD lpBufferSize )
454 {
455     struct passwd *pwd = getpwuid(getuid());
456
457     FIXME( "(%s, %p, %p): mostly stub\n", 
458            debugstr_a(lpName), lpUserID, lpBufferSize );
459
460     if (pwd)
461     {
462         if ( strlen(pwd->pw_name) + 1 > *lpBufferSize )
463         {
464             *lpBufferSize = strlen(pwd->pw_name) + 1;
465
466             SetLastError(ERROR_MORE_DATA);
467             return ERROR_MORE_DATA;
468         }
469
470         strcpy( lpUserID, pwd->pw_name );
471         *lpBufferSize = strlen(pwd->pw_name) + 1;
472         return WN_SUCCESS;
473     }
474
475     /* FIXME: wrong return value */
476     SetLastError(ERROR_NO_NETWORK);
477     return ERROR_NO_NETWORK;
478 }
479
480 /*****************************************************************
481  * WNetGetUserW [MPR.@]
482  */
483 DWORD WINAPI WNetGetUserW( LPCWSTR lpName, LPWSTR lpUserID, LPDWORD lpBufferSize ) 
484 {
485     FIXME( "(%s, %p, %p): mostly stub\n", 
486            debugstr_w(lpName), lpUserID, lpBufferSize );
487
488     SetLastError(WN_NO_NETWORK);
489     return WN_NO_NETWORK;
490 }
491
492 /*********************************************************************
493  * WNetConnectionDialog [MPR.@]
494  */ 
495 DWORD WINAPI WNetConnectionDialog( HWND hwnd, DWORD dwType )
496
497     FIXME( "(%04x, %08lX): stub\n", hwnd, dwType );
498
499     SetLastError(WN_NO_NETWORK);
500     return ERROR_NO_NETWORK;
501 }
502
503 /*********************************************************************
504  * WNetConnectionDialog1A [MPR.@]
505  */
506 DWORD WINAPI WNetConnectionDialog1A( LPCONNECTDLGSTRUCTA lpConnDlgStruct )
507
508     FIXME( "(%p): stub\n", lpConnDlgStruct );
509
510     SetLastError(WN_NO_NETWORK);
511     return ERROR_NO_NETWORK;
512 }
513
514 /*********************************************************************
515  * WNetConnectionDialog1W [MPR.@]
516  */ 
517 DWORD WINAPI WNetConnectionDialog1W( LPCONNECTDLGSTRUCTW lpConnDlgStruct )
518
519     FIXME( "(%p): stub\n", lpConnDlgStruct );
520
521     SetLastError(WN_NO_NETWORK);
522     return ERROR_NO_NETWORK;
523 }
524
525 /*********************************************************************
526  * WNetDisconnectDialog [MPR.@]
527  */ 
528 DWORD WINAPI WNetDisconnectDialog( HWND hwnd, DWORD dwType )
529
530     FIXME( "(%04x, %08lX): stub\n", hwnd, dwType );
531
532     SetLastError(WN_NO_NETWORK);
533     return ERROR_NO_NETWORK;
534 }
535
536 /*********************************************************************
537  * WNetDisconnectDialog1A [MPR.@]
538  */ 
539 DWORD WINAPI WNetDisconnectDialog1A( LPDISCDLGSTRUCTA lpConnDlgStruct )
540
541     FIXME( "(%p): stub\n", lpConnDlgStruct );
542
543     SetLastError(WN_NO_NETWORK);
544     return ERROR_NO_NETWORK;
545 }
546
547 /*********************************************************************
548  * WNetDisconnectDialog1W [MPR.@]
549  */ 
550 DWORD WINAPI WNetDisconnectDialog1W( LPDISCDLGSTRUCTW lpConnDlgStruct )
551
552     FIXME( "(%p): stub\n", lpConnDlgStruct );
553
554     SetLastError(WN_NO_NETWORK);
555     return ERROR_NO_NETWORK;
556 }
557
558 /*********************************************************************
559  * WNetGetLastErrorA [MPR.@]
560  */ 
561 DWORD WINAPI WNetGetLastErrorA( LPDWORD lpError,
562                                 LPSTR lpErrorBuf, DWORD nErrorBufSize,
563                                 LPSTR lpNameBuf, DWORD nNameBufSize )
564 {
565     FIXME( "(%p, %p, %ld, %p, %ld): stub\n", 
566            lpError, lpErrorBuf, nErrorBufSize, lpNameBuf, nNameBufSize );
567
568     SetLastError(WN_NO_NETWORK);
569     return ERROR_NO_NETWORK;
570 }
571
572 /*********************************************************************
573  * WNetGetLastErrorW [MPR.@]
574  */ 
575 DWORD WINAPI WNetGetLastErrorW( LPDWORD lpError,
576                                 LPWSTR lpErrorBuf, DWORD nErrorBufSize,
577                          LPWSTR lpNameBuf, DWORD nNameBufSize )
578 {
579     FIXME( "(%p, %p, %ld, %p, %ld): stub\n", 
580            lpError, lpErrorBuf, nErrorBufSize, lpNameBuf, nNameBufSize );
581
582     SetLastError(WN_NO_NETWORK);
583     return ERROR_NO_NETWORK;
584 }
585
586 /*********************************************************************
587  * WNetGetNetworkInformationA [MPR.@]
588  */ 
589 DWORD WINAPI WNetGetNetworkInformationA( LPCSTR lpProvider, 
590                                          LPNETINFOSTRUCT lpNetInfoStruct )
591 {
592     FIXME( "(%s, %p): stub\n", debugstr_a(lpProvider), lpNetInfoStruct );
593
594     SetLastError(WN_NO_NETWORK);
595     return ERROR_NO_NETWORK;
596 }
597
598 /*********************************************************************
599  * WNetGetNetworkInformationW [MPR.@]
600  */ 
601 DWORD WINAPI WNetGetNetworkInformationW( LPCWSTR lpProvider, 
602                                          LPNETINFOSTRUCT lpNetInfoStruct )
603 {
604     FIXME( "(%s, %p): stub\n", debugstr_w(lpProvider), lpNetInfoStruct );
605
606     SetLastError(WN_NO_NETWORK);
607     return ERROR_NO_NETWORK;
608 }
609
610 /*****************************************************************
611  *  WNetGetProviderNameA [MPR.@]
612  */
613 DWORD WINAPI WNetGetProviderNameA( DWORD dwNetType, 
614                                    LPSTR lpProvider, LPDWORD lpBufferSize )
615 {
616     FIXME( "(%ld, %p, %p): stub\n", dwNetType, lpProvider, lpBufferSize );
617
618     SetLastError(WN_NO_NETWORK);
619     return WN_NO_NETWORK;
620 }
621
622 /*****************************************************************
623  *  WNetGetProviderNameW [MPR.@]
624  */
625 DWORD WINAPI WNetGetProviderNameW( DWORD dwNetType,
626                                    LPWSTR lpProvider, LPDWORD lpBufferSize ) 
627 {
628     FIXME( "(%ld, %p, %p): stub\n", dwNetType, lpProvider, lpBufferSize );
629
630     SetLastError(WN_NO_NETWORK);
631     return WN_NO_NETWORK;
632 }
633