Fix subclassing to support nested messages.
[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 <stdarg.h>
25 #include <string.h>
26 #include <sys/types.h>
27 #ifdef HAVE_UNISTD_H
28 # include <unistd.h>
29 #endif
30
31 #include "windef.h"
32 #include "winbase.h"
33 #include "winnls.h"
34 #include "winnetwk.h"
35 #include "wine/debug.h"
36
37 WINE_DEFAULT_DEBUG_CHANNEL(mpr);
38
39
40 /*
41  * Browsing Functions
42  */
43
44 /*********************************************************************
45  * WNetOpenEnumA [MPR.@]
46  */
47 DWORD WINAPI WNetOpenEnumA( DWORD dwScope, DWORD dwType, DWORD dwUsage,
48                             LPNETRESOURCEA lpNet, LPHANDLE lphEnum )
49 {
50     FIXME( "(%08lX, %08lX, %08lX, %p, %p): stub\n",
51             dwScope, dwType, dwUsage, lpNet, lphEnum );
52
53     SetLastError(WN_NO_NETWORK);
54     return WN_NO_NETWORK;
55 }
56
57 /*********************************************************************
58  * WNetOpenEnumW [MPR.@]
59  */
60 DWORD WINAPI WNetOpenEnumW( DWORD dwScope, DWORD dwType, DWORD dwUsage,
61                             LPNETRESOURCEW lpNet, LPHANDLE lphEnum )
62 {
63    FIXME( "(%08lX, %08lX, %08lX, %p, %p): stub\n",
64           dwScope, dwType, dwUsage, lpNet, lphEnum );
65
66    SetLastError(WN_NO_NETWORK);
67    return WN_NO_NETWORK;
68 }
69
70 /*********************************************************************
71  * WNetEnumResourceA [MPR.@]
72  */
73 DWORD WINAPI WNetEnumResourceA( HANDLE hEnum, LPDWORD lpcCount,
74                                 LPVOID lpBuffer, LPDWORD lpBufferSize )
75 {
76     FIXME( "(%p, %p, %p, %p): stub\n",
77             hEnum, lpcCount, lpBuffer, lpBufferSize );
78
79     SetLastError(WN_NO_NETWORK);
80     return WN_NO_NETWORK;
81 }
82
83 /*********************************************************************
84  * WNetEnumResourceW [MPR.@]
85  */
86 DWORD WINAPI WNetEnumResourceW( HANDLE hEnum, LPDWORD lpcCount,
87                                 LPVOID lpBuffer, LPDWORD lpBufferSize )
88 {
89     FIXME( "(%p, %p, %p, %p): stub\n",
90             hEnum, lpcCount, lpBuffer, lpBufferSize );
91
92     SetLastError(WN_NO_NETWORK);
93     return WN_NO_NETWORK;
94 }
95
96 /*********************************************************************
97  * WNetCloseEnum [MPR.@]
98  */
99 DWORD WINAPI WNetCloseEnum( HANDLE hEnum )
100 {
101     FIXME( "(%p): stub\n", hEnum );
102
103     SetLastError(WN_NO_NETWORK);
104     return WN_NO_NETWORK;
105 }
106
107 /*********************************************************************
108  * WNetGetResourceInformationA [MPR.@]
109  */
110 DWORD WINAPI WNetGetResourceInformationA( LPNETRESOURCEA lpNetResource,
111                                           LPVOID lpBuffer, LPDWORD cbBuffer,
112                                           LPSTR *lplpSystem )
113 {
114     FIXME( "(%p, %p, %p, %p): stub\n",
115            lpNetResource, lpBuffer, cbBuffer, lplpSystem );
116
117     SetLastError(WN_NO_NETWORK);
118     return WN_NO_NETWORK;
119 }
120
121 /*********************************************************************
122  * WNetGetResourceInformationW [MPR.@]
123  */
124 DWORD WINAPI WNetGetResourceInformationW( LPNETRESOURCEW lpNetResource,
125                                           LPVOID lpBuffer, LPDWORD cbBuffer,
126                                           LPWSTR *lplpSystem )
127 {
128     FIXME( "(%p, %p, %p, %p): stub\n",
129            lpNetResource, lpBuffer, cbBuffer, lplpSystem );
130
131     SetLastError(WN_NO_NETWORK);
132     return WN_NO_NETWORK;
133 }
134
135 /*********************************************************************
136  * WNetGetResourceParentA [MPR.@]
137  */
138 DWORD WINAPI WNetGetResourceParentA( LPNETRESOURCEA lpNetResource,
139                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
140 {
141     FIXME( "(%p, %p, %p): stub\n",
142            lpNetResource, lpBuffer, lpBufferSize );
143
144     SetLastError(WN_NO_NETWORK);
145     return WN_NO_NETWORK;
146 }
147
148 /*********************************************************************
149  * WNetGetResourceParentW [MPR.@]
150  */
151 DWORD WINAPI WNetGetResourceParentW( LPNETRESOURCEW lpNetResource,
152                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
153 {
154     FIXME( "(%p, %p, %p): stub\n",
155            lpNetResource, lpBuffer, lpBufferSize );
156
157     SetLastError(WN_NO_NETWORK);
158     return WN_NO_NETWORK;
159 }
160
161
162
163 /*
164  * Connection Functions
165  */
166
167 /*********************************************************************
168  *  WNetAddConnectionA [MPR.@]
169  */
170 DWORD WINAPI WNetAddConnectionA( LPCSTR lpRemoteName, LPCSTR lpPassword,
171                                  LPCSTR lpLocalName )
172 {
173     FIXME( "(%s, %p, %s): stub\n",
174            debugstr_a(lpRemoteName), lpPassword, debugstr_a(lpLocalName) );
175
176     SetLastError(WN_NO_NETWORK);
177     return WN_NO_NETWORK;
178 }
179
180 /*********************************************************************
181  *  WNetAddConnectionW [MPR.@]
182  */
183 DWORD WINAPI WNetAddConnectionW( LPCWSTR lpRemoteName, LPCWSTR lpPassword,
184                                  LPCWSTR lpLocalName )
185 {
186     FIXME( "(%s, %p, %s): stub\n",
187            debugstr_w(lpRemoteName), lpPassword, debugstr_w(lpLocalName) );
188
189     SetLastError(WN_NO_NETWORK);
190     return WN_NO_NETWORK;
191 }
192
193 /*********************************************************************
194  *  WNetAddConnection2A [MPR.@]
195  */
196 DWORD WINAPI WNetAddConnection2A( LPNETRESOURCEA lpNetResource,
197                                   LPCSTR lpPassword, LPCSTR lpUserID,
198                                   DWORD dwFlags )
199 {
200     FIXME( "(%p, %p, %s, 0x%08lX): stub\n",
201            lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags );
202
203     SetLastError(WN_NO_NETWORK);
204     return WN_NO_NETWORK;
205 }
206
207 /*********************************************************************
208  * WNetAddConnection2W [MPR.@]
209  */
210 DWORD WINAPI WNetAddConnection2W( LPNETRESOURCEW lpNetResource,
211                                   LPCWSTR lpPassword, LPCWSTR lpUserID,
212                                   DWORD dwFlags )
213 {
214     FIXME( "(%p, %p, %s, 0x%08lX): stub\n",
215            lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags );
216
217     SetLastError(WN_NO_NETWORK);
218     return WN_NO_NETWORK;
219 }
220
221 /*********************************************************************
222  * WNetAddConnection3A [MPR.@]
223  */
224 DWORD WINAPI WNetAddConnection3A( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
225                                   LPCSTR lpPassword, LPCSTR lpUserID,
226                                   DWORD dwFlags )
227 {
228     FIXME( "(%p, %p, %p, %s, 0x%08lX), stub\n",
229            hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags );
230
231     SetLastError(WN_NO_NETWORK);
232     return WN_NO_NETWORK;
233 }
234
235 /*********************************************************************
236  * WNetAddConnection3W [MPR.@]
237  */
238 DWORD WINAPI WNetAddConnection3W( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
239                                   LPCWSTR lpPassword, LPCWSTR lpUserID,
240                                   DWORD dwFlags )
241 {
242     FIXME( "(%p, %p, %p, %s, 0x%08lX), stub\n",
243            hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags );
244
245     SetLastError(WN_NO_NETWORK);
246     return WN_NO_NETWORK;
247 }
248
249 /*****************************************************************
250  *  WNetUseConnectionA [MPR.@]
251  */
252 DWORD WINAPI WNetUseConnectionA( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
253                                  LPCSTR lpPassword, LPCSTR lpUserID, DWORD dwFlags,
254                                  LPSTR lpAccessName, LPDWORD lpBufferSize,
255                                  LPDWORD lpResult )
256 {
257     FIXME( "(%p, %p, %p, %s, 0x%08lX, %s, %p, %p), stub\n",
258            hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags,
259            debugstr_a(lpAccessName), lpBufferSize, lpResult );
260
261     SetLastError(WN_NO_NETWORK);
262     return WN_NO_NETWORK;
263 }
264
265 /*****************************************************************
266  *  WNetUseConnectionW [MPR.@]
267  */
268 DWORD WINAPI WNetUseConnectionW( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
269                                  LPCWSTR lpPassword, LPCWSTR lpUserID, DWORD dwFlags,
270                                  LPWSTR lpAccessName, LPDWORD lpBufferSize,
271                                  LPDWORD lpResult )
272 {
273     FIXME( "(%p, %p, %p, %s, 0x%08lX, %s, %p, %p), stub\n",
274            hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,
275            debugstr_w(lpAccessName), lpBufferSize, lpResult );
276
277     SetLastError(WN_NO_NETWORK);
278     return WN_NO_NETWORK;
279 }
280
281 /*********************************************************************
282  *  WNetCancelConnectionA [MPR.@]
283  */
284 DWORD WINAPI WNetCancelConnectionA( LPCSTR lpName, BOOL fForce )
285 {
286     FIXME( "(%s, %d), stub\n", debugstr_a(lpName), fForce );
287
288     return WN_SUCCESS;
289 }
290
291 /*********************************************************************
292  *  WNetCancelConnectionW [MPR.@]
293  */
294 DWORD WINAPI WNetCancelConnectionW( LPCWSTR lpName, BOOL fForce )
295 {
296     FIXME( "(%s, %d), stub\n", debugstr_w(lpName), fForce );
297
298     return WN_SUCCESS;
299 }
300
301 /*********************************************************************
302  *  WNetCancelConnection2A [MPR.@]
303  */
304 DWORD WINAPI WNetCancelConnection2A( LPCSTR lpName, DWORD dwFlags, BOOL fForce )
305 {
306     FIXME( "(%s, %08lX, %d), stub\n", debugstr_a(lpName), dwFlags, fForce );
307
308     return WN_SUCCESS;
309 }
310
311 /*********************************************************************
312  *  WNetCancelConnection2W [MPR.@]
313  */
314 DWORD WINAPI WNetCancelConnection2W( LPCWSTR lpName, DWORD dwFlags, BOOL fForce )
315 {
316     FIXME( "(%s, %08lX, %d), stub\n", debugstr_w(lpName), dwFlags, fForce );
317
318     return WN_SUCCESS;
319 }
320
321 /*****************************************************************
322  *  WNetRestoreConnectionA [MPR.@]
323  */
324 DWORD WINAPI WNetRestoreConnectionA( HWND hwndOwner, LPSTR lpszDevice )
325 {
326     FIXME( "(%p, %s), stub\n", hwndOwner, debugstr_a(lpszDevice) );
327
328     SetLastError(WN_NO_NETWORK);
329     return WN_NO_NETWORK;
330 }
331
332 /*****************************************************************
333  *  WNetRestoreConnectionW [MPR.@]
334  */
335 DWORD WINAPI WNetRestoreConnectionW( HWND hwndOwner, LPWSTR lpszDevice )
336 {
337     FIXME( "(%p, %s), stub\n", hwndOwner, debugstr_w(lpszDevice) );
338
339     SetLastError(WN_NO_NETWORK);
340     return WN_NO_NETWORK;
341 }
342
343 /**************************************************************************
344  * WNetGetConnectionA [MPR.@]
345  *
346  * RETURNS
347  * - WN_BAD_LOCALNAME     lpLocalName makes no sense
348  * - WN_NOT_CONNECTED     drive is a local drive
349  * - WN_MORE_DATA         buffer isn't big enough
350  * - WN_SUCCESS           success (net path in buffer)
351  *
352  */
353 DWORD WINAPI WNetGetConnectionA( LPCSTR lpLocalName,
354                                  LPSTR lpRemoteName, LPDWORD lpBufferSize )
355 {
356     char label[40];
357
358     TRACE( "local %s\n", lpLocalName );
359     if (lpLocalName[1] == ':')
360     {
361         switch(GetDriveTypeA(lpLocalName))
362         {
363         case DRIVE_REMOTE:
364             if (!GetVolumeInformationA( lpLocalName, label, sizeof(label),
365                                         NULL, NULL, NULL, NULL, 0 )) label[0] = 0;
366             if (strlen(label) + 1 > *lpBufferSize)
367             {
368                 *lpBufferSize = strlen(label) + 1;
369                 return WN_MORE_DATA;
370             }
371             strcpy( lpRemoteName, label );
372             *lpBufferSize = strlen(lpRemoteName) + 1;
373             return WN_SUCCESS;
374         case DRIVE_REMOVABLE:
375         case DRIVE_FIXED:
376         case DRIVE_CDROM:
377           TRACE("file is local\n");
378           return WN_NOT_CONNECTED;
379         default:
380             return WN_BAD_LOCALNAME;
381         }
382     }
383     return WN_BAD_LOCALNAME;
384 }
385
386 /**************************************************************************
387  * WNetGetConnectionW [MPR.@]
388  */
389 DWORD WINAPI WNetGetConnectionW( LPCWSTR lpLocalName,
390                                  LPWSTR lpRemoteName, LPDWORD lpBufferSize )
391 {
392     CHAR  buf[200];
393     DWORD ret, x = sizeof(buf);
394     INT len = WideCharToMultiByte( CP_ACP, 0, lpLocalName, -1, NULL, 0, NULL, NULL );
395     LPSTR lnA = HeapAlloc( GetProcessHeap(), 0, len );
396
397     WideCharToMultiByte( CP_ACP, 0, lpLocalName, -1, lnA, len, NULL, NULL );
398     ret = WNetGetConnectionA( lnA, buf, &x );
399     HeapFree( GetProcessHeap(), 0, lnA );
400     if (ret == WN_SUCCESS)
401     {
402         x = MultiByteToWideChar( CP_ACP, 0, buf, -1, NULL, 0 );
403         if (x > *lpBufferSize)
404         {
405             *lpBufferSize = x;
406             return WN_MORE_DATA;
407         }
408         *lpBufferSize = MultiByteToWideChar( CP_ACP, 0, buf, -1, lpRemoteName, *lpBufferSize );
409     }
410     return ret;
411 }
412
413 /**************************************************************************
414  * WNetSetConnectionA [MPR.@]
415  */
416 DWORD WINAPI WNetSetConnectionA( LPCSTR lpName, DWORD dwProperty,
417                                  LPVOID pvValue )
418 {
419     FIXME( "(%s, %08lX, %p): stub\n", debugstr_a(lpName), dwProperty, pvValue );
420
421     SetLastError(WN_NO_NETWORK);
422     return WN_NO_NETWORK;
423 }
424
425 /**************************************************************************
426  * WNetSetConnectionW [MPR.@]
427  */
428 DWORD WINAPI WNetSetConnectionW( LPCWSTR lpName, DWORD dwProperty,
429                                  LPVOID pvValue )
430 {
431     FIXME( "(%s, %08lX, %p): stub\n", debugstr_w(lpName), dwProperty, pvValue );
432
433     SetLastError(WN_NO_NETWORK);
434     return WN_NO_NETWORK;
435 }
436
437 /*****************************************************************
438  * WNetGetUniversalNameA [MPR.@]
439  */
440 DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel,
441                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
442 {
443     FIXME( "(%s, 0x%08lX, %p, %p): stub\n",
444            debugstr_a(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
445
446     SetLastError(WN_NO_NETWORK);
447     return WN_NO_NETWORK;
448 }
449
450 /*****************************************************************
451  * WNetGetUniversalNameW [MPR.@]
452  */
453 DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel,
454                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
455 {
456     FIXME( "(%s, 0x%08lX, %p, %p): stub\n",
457            debugstr_w(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
458
459     SetLastError(WN_NO_NETWORK);
460     return WN_NO_NETWORK;
461 }
462
463
464
465 /*
466  * Other Functions
467  */
468
469 /**************************************************************************
470  * WNetGetUserA [MPR.@]
471  *
472  * FIXME: we should not return ourselves, but the owner of the drive lpName
473  */
474 DWORD WINAPI WNetGetUserA( LPCSTR lpName, LPSTR lpUserID, LPDWORD lpBufferSize )
475 {
476     if (GetUserNameA( lpUserID, lpBufferSize )) return WN_SUCCESS;
477     return GetLastError();
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( "(%p, %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( "(%p, %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 }