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