More of DdeCreateStringHandleA, DdeFreeStringHAndle, DdeQueryStringA
[wine] / misc / network.c
1 /*
2  * Network functions
3  *
4  * This is the MPR.DLL stuff from Win32,  as well as the USER
5  * stuff by the same names in Win 3.x.  
6  *
7  */
8
9 #include <ctype.h>
10 #include <string.h>
11 #include <sys/types.h>
12 #include <pwd.h>
13 #include <unistd.h>
14
15 #include "windef.h"
16 #include "winnetwk.h"
17 #include "winuser.h"
18 #include "winerror.h"
19 #include "drive.h"
20 #include "wnet.h"
21 #include "debug.h"
22 #include "heap.h"
23
24 /********************************************************************
25  *  WNetAddConnection16 [USER.517]  Directs a local device to net
26  * 
27  * Redirects a local device (either a disk drive or printer port)
28  * to a shared device on a remote server.
29  */
30 UINT16 WINAPI WNetAddConnection16(LPCSTR lpNetPath, LPCSTR lpPassWord,
31                                 LPCSTR lpLocalName)
32 {       
33    return WNetAddConnectionA(lpNetPath, lpPassWord, lpLocalName);
34 }
35
36 /*********************************************************************
37  *  WNetAddConnection32 [MPR.50] 
38  */
39
40 UINT WINAPI WNetAddConnectionA(LPCSTR NetPath, LPCSTR PassWord,
41                             LPCSTR LocalName)
42 {
43    FIXME(wnet, "('%s', %p, '%s'): stub\n",
44          NetPath, PassWord, LocalName);
45    return WN_NO_NETWORK;
46 }
47
48 /* [MPR.51] */
49
50 UINT WINAPI WNetAddConnectionW(LPCWSTR NetPath, 
51                             LPCWSTR PassWord,
52                             LPCWSTR LocalName)
53 {
54    FIXME(wnet, " stub!\n");
55    SetLastError(WN_NO_NETWORK);
56    return WN_NO_NETWORK;
57 }
58
59 /* **************************************************************** 
60  * WNetAddConnection2_32A [MPR.46] 
61  */
62
63 UINT WINAPI
64 WNetAddConnection2A(LPNETRESOURCEA netresource, /* [in] */
65                        LPCSTR password,        /* [in] */     
66                        LPCSTR username,        /* [in] */
67                        DWORD flags             /* [in] */  )
68 {
69    FIXME(wnet, "(%p,%s,%s,0x%08lx), stub!\n", netresource,
70          password, username, (unsigned long) flags);
71    SetLastError(WN_NO_NETWORK);
72    return WN_NO_NETWORK;
73 }
74
75 /* ****************************************************************
76  * WNetAddConnection2W [MPR.47]
77  */
78
79 UINT WINAPI
80 WNetAddConnection2W(LPNETRESOURCEW netresource, /* [in] */
81                        LPCWSTR password,        /* [in] */     
82                        LPCWSTR username,        /* [in] */
83                        DWORD flags              /* [in] */  )
84 {
85    FIXME(wnet, ", stub!\n");
86    SetLastError(WN_NO_NETWORK);
87    return WN_NO_NETWORK;
88 }
89
90 /* ****************************************************************
91  * WNetAddConnection3_32A [MPR.48]
92  */
93
94 UINT WINAPI WNetAddConnection3A(HWND owner,
95                       LPNETRESOURCEA netresource,
96                       LPCSTR password,
97                       LPCSTR username,
98                       DWORD flags)
99 {
100    TRACE(wnet, "owner = 0x%x\n", owner);
101    return WNetAddConnection2A(netresource, 
102                                  password, username, flags);
103 }
104
105 /* ****************************************************************
106  * WNetAddConnection3W [MPR.49]
107  */
108
109 UINT WINAPI WNetAddConnection3W(HWND owner,
110                               LPNETRESOURCEW netresource,
111                               LPCWSTR username,
112                               LPCWSTR password,
113                               DWORD flags)
114 {
115    TRACE(wnet,"owner = 0x%x\n", owner);
116    return WNetAddConnection2W(netresource, username, password,
117                                  flags); 
118
119
120 /*******************************************************************
121  * WNetConnectionDialog1_32A [MPR.59]
122  */
123 UINT WINAPI WNetConnectionDialog1A (LPCONNECTDLGSTRUCTA lpConnDlgStruct)
124 { FIXME(wnet,"%p stub\n", lpConnDlgStruct);   
125   SetLastError(WN_NO_NETWORK);
126   return ERROR_NO_NETWORK;
127 }
128 /*******************************************************************
129  * WNetConnectionDialog1_32W [MPR.60]
130  */ 
131 UINT WINAPI WNetConnectionDialog1W (LPCONNECTDLGSTRUCTW lpConnDlgStruct)
132 { FIXME(wnet,"%p stub\n", lpConnDlgStruct);
133   SetLastError(WN_NO_NETWORK);
134   return ERROR_NO_NETWORK;
135 }
136  
137 /*******************************************************************
138  * WNetConnectionDialog_32 [MPR.61]
139  */ 
140 UINT WINAPI WNetConnectionDialog(HWND owner, DWORD flags  )
141 { FIXME(wnet,"owner = 0x%x, flags=0x%lx stub\n", owner,flags);
142   SetLastError(WN_NO_NETWORK);
143   return ERROR_NO_NETWORK;
144
145 }
146
147 /*******************************************************************
148  * WNetEnumCachedPasswords32 [MPR.61]
149  */
150 UINT WINAPI WNetEnumCachedPasswords(LPSTR sometext, DWORD count1,
151                 DWORD res_nr, DWORD *enumPasswordProc)
152 {
153     return ERROR_NO_NETWORK;
154 }
155
156 /********************************************************************
157  *   WNetCancelConnection       [USER.518]  undirects a local device
158  */
159 UINT16 WINAPI WNetCancelConnection16(LPCSTR lpName, BOOL16 bForce)
160 {
161     FIXME(wnet, "('%s', %04X): stub\n", lpName, bForce);
162     return WN_NO_NETWORK;
163 }
164
165
166 /**************************************************************************
167  *              WNetErrorText16       [USER.499]
168  */
169 int WINAPI WNetErrorText16(WORD nError,LPSTR lpszText,WORD cbText)
170 {
171         FIXME(wnet, "(%x,%p,%x): stub\n",nError,lpszText,cbText);
172         return FALSE;
173 }
174
175 /**************************************************************************
176  *              WNetOpenJob16       [USER.501]
177  */
178 int WINAPI WNetOpenJob16(LPSTR szQueue,LPSTR szJobTitle,WORD nCopies,LPWORD pfh)
179 {
180         FIXME(wnet, "('%s','%s',%x,%p): stub\n",
181               szQueue,szJobTitle,nCopies,pfh);
182         return WN_NET_ERROR;
183 }
184
185 /**************************************************************************
186  *              WNetCloseJob       [USER.502]
187  */
188 int WINAPI WNetCloseJob16(WORD fh,LPWORD pidJob,LPSTR szQueue)
189 {
190         FIXME(wnet, "(%x,%p,'%s'): stub\n",fh,pidJob,szQueue);
191         return WN_NET_ERROR;
192 }
193
194 /**************************************************************************
195  *              WNetAbortJob       [USER.503]
196  */
197 int WINAPI WNetAbortJob16(LPSTR szQueue,WORD wJobId)
198 {
199         FIXME(wnet, "('%s',%x): stub\n",szQueue,wJobId);
200         return WN_NET_ERROR;
201 }
202
203 /**************************************************************************
204  *              WNetHoldJob       [USER.504]
205  */
206 int WINAPI WNetHoldJob16(LPSTR szQueue,WORD wJobId)
207 {
208         FIXME(wnet, "('%s',%x): stub\n",szQueue,wJobId);
209         return WN_NET_ERROR;
210 }
211
212 /**************************************************************************
213  *              WNetReleaseJob       [USER.505]
214  */
215 int WINAPI WNetReleaseJob16(LPSTR szQueue,WORD wJobId)
216 {
217         FIXME(wnet, "('%s',%x): stub\n",szQueue,wJobId);
218         return WN_NET_ERROR;
219 }
220
221 /**************************************************************************
222  *              WNetCancelJob       [USER.506]
223  */
224 int WINAPI WNetCancelJob16(LPSTR szQueue,WORD wJobId)
225 {
226         FIXME(wnet, "('%s',%x): stub\n",szQueue,wJobId);
227         return WN_NET_ERROR;
228 }
229
230 /**************************************************************************
231  *              WNetSetJobCopies       [USER.507]
232  */
233 int WINAPI WNetSetJobCopies16(LPSTR szQueue,WORD wJobId,WORD nCopies)
234 {
235         FIXME(wnet, "('%s',%x,%x): stub\n",szQueue,wJobId,nCopies);
236         return WN_NET_ERROR;
237 }
238
239 /**************************************************************************
240  *              WNetWatchQueue       [USER.508]
241  */
242 int WINAPI WNetWatchQueue16(HWND16 hWnd,LPSTR szLocal,LPSTR szUser,WORD nQueue)
243 {
244         FIXME(wnet, "(%04x,'%s','%s',%x): stub\n",hWnd,szLocal,szUser,nQueue);
245         return WN_NET_ERROR;
246 }
247
248 /**************************************************************************
249  *              WNetUnwatchQueue       [USER.509]
250  */
251 int WINAPI WNetUnwatchQueue16(LPSTR szQueue)
252 {
253         FIXME(wnet, "('%s'): stub\n", szQueue);
254         return WN_NET_ERROR;
255 }
256
257 /**************************************************************************
258  *              WNetLockQueueData       [USER.510]
259  */
260 int WINAPI WNetLockQueueData16(LPSTR szQueue,LPSTR szUser,void *lplpQueueStruct)
261 {
262         FIXME(wnet, "('%s','%s',%p): stub\n",szQueue,szUser,lplpQueueStruct);
263         return WN_NET_ERROR;
264 }
265
266 /**************************************************************************
267  *              WNetUnlockQueueData       [USER.511]
268  */
269 int WINAPI WNetUnlockQueueData16(LPSTR szQueue)
270 {
271         FIXME(wnet, "('%s'): stub\n",szQueue);
272         return WN_NET_ERROR;
273 }
274
275
276 /********************************************************************
277  * WNetGetConnection16 [USER.512] reverse-resolves a local device
278  *
279  * RETURNS
280  * - WN_BAD_LOCALNAME     lpLocalName makes no sense
281  * - WN_NOT_CONNECTED     drive is a local drive
282  * - WN_MORE_DATA         buffer isn't big enough
283  * - WN_SUCCESS           success (net path in buffer)  
284  */
285 int WINAPI WNetGetConnection16(LPCSTR lpLocalName, 
286                                LPSTR lpRemoteName, UINT16 *cbRemoteName)
287 {
288     const char *path;
289
290     if (lpLocalName[1] == ':')
291     {
292         int drive = toupper(lpLocalName[0]) - 'A';
293         switch(DRIVE_GetType(drive))
294         {
295         case TYPE_INVALID:
296             return WN_BAD_LOCALNAME;
297         case TYPE_NETWORK:
298             path = DRIVE_GetLabel(drive);
299             if (strlen(path) + 1 > *cbRemoteName)
300             {
301                 *cbRemoteName = strlen(path) + 1;
302                 return WN_MORE_DATA;
303             }
304             strcpy( lpRemoteName, path );
305             *cbRemoteName = strlen(lpRemoteName) + 1;
306             return WN_SUCCESS;
307         default:
308             return WN_BAD_LOCALNAME;
309         }
310     }
311     return WN_BAD_LOCALNAME;
312 }
313
314 /**************************************************************************
315  *                              WNetGetConnectionA      [MPR.70]
316  */
317 DWORD WINAPI
318 WNetGetConnectionA(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
319 {
320         UINT16  x;
321         DWORD   ret = WNetGetConnection16(localname,remotename,&x);
322         *buflen = x;
323         return ret;
324 }
325
326 /**************************************************************************
327  *                              WNetGetConnectionW      [MPR.72]
328  */
329 DWORD WINAPI
330 WNetGetConnectionW(LPCWSTR localnameW,LPWSTR remotenameW,LPDWORD buflen)
331 {
332         UINT16  x;
333         CHAR    buf[200];       
334         LPSTR   lnA = HEAP_strdupWtoA(GetProcessHeap(),0,localnameW);
335         DWORD   ret = WNetGetConnection16(lnA,buf,&x);
336
337         lstrcpyAtoW(remotenameW,buf);
338         *buflen=lstrlenW(remotenameW);
339         HeapFree(GetProcessHeap(),0,lnA);
340         return ret;
341 }
342
343 /**************************************************************************
344  *                              WNetGetCaps             [USER.513]
345  */
346 int WINAPI WNetGetCaps16(WORD capability)
347 {
348         switch (capability) {
349                 case WNNC_SPEC_VERSION:
350                 {
351                         return 0x30a; /* WfW 3.11(and apparently other 3.1x) */
352                 }
353                 case WNNC_NET_TYPE:
354                 /* hi byte = network type, 
355                    lo byte = network vendor (Netware = 0x03) [15 types] */
356                 return WNNC_NET_MultiNet | WNNC_SUBNET_WinWorkgroups;
357
358                 case WNNC_DRIVER_VERSION:
359                 /* driver version of vendor */
360                 return 0x100; /* WfW 3.11 */
361
362                 case WNNC_USER:
363                 /* 1 = WNetGetUser is supported */
364                 return 1;
365
366                 case WNNC_CONNECTION:
367                 /* returns mask of the supported connection functions */
368                 return  WNNC_CON_AddConnection|WNNC_CON_CancelConnection
369                         |WNNC_CON_GetConnections/*|WNNC_CON_AutoConnect*/
370                         |WNNC_CON_BrowseDialog|WNNC_CON_RestoreConnection;
371
372                 case WNNC_PRINTING:
373                 /* returns mask of the supported printing functions */
374                 return  WNNC_PRT_OpenJob|WNNC_PRT_CloseJob|WNNC_PRT_HoldJob
375                         |WNNC_PRT_ReleaseJob|WNNC_PRT_CancelJob
376                         |WNNC_PRT_SetJobCopies|WNNC_PRT_WatchQueue
377                         |WNNC_PRT_UnwatchQueue|WNNC_PRT_LockQueueData
378                         |WNNC_PRT_UnlockQueueData|WNNC_PRT_AbortJob
379                         |WNNC_PRT_WriteJob;
380
381                 case WNNC_DIALOG:
382                 /* returns mask of the supported dialog functions */
383                 return  WNNC_DLG_DeviceMode|WNNC_DLG_BrowseDialog
384                         |WNNC_DLG_ConnectDialog|WNNC_DLG_DisconnectDialog
385                         |WNNC_DLG_ViewQueueDialog|WNNC_DLG_PropertyDialog
386                         |WNNC_DLG_ConnectionDialog
387                         /*|WNNC_DLG_PrinterConnectDialog
388                         |WNNC_DLG_SharesDialog|WNNC_DLG_ShareAsDialog*/;
389
390                 case WNNC_ADMIN:
391                 /* returns mask of the supported administration functions */
392                 /* not sure if long file names is a good idea */
393                 return  WNNC_ADM_GetDirectoryType|WNNC_ADM_DirectoryNotify
394                         |WNNC_ADM_LongNames/*|WNNC_ADM_SetDefaultDrive*/;
395
396                 case WNNC_ERROR:
397                 /* returns mask of the supported error functions */
398                 return  WNNC_ERR_GetError|WNNC_ERR_GetErrorText;
399
400                 case WNNC_PRINTMGREXT:
401                 /* returns the Print Manager version in major and 
402                    minor format if Print Manager functions are available */
403                 return 0x30e; /* printman version of WfW 3.11 */
404
405                 case 0xffff:
406                 /* Win 3.11 returns HMODULE of network driver here
407                 FIXME: what should we return ?
408                 logonoff.exe needs it, msmail crashes with wrong value */
409                 return 0;
410
411         default:
412                 return 0;
413         }
414 }
415
416 /**************************************************************************
417  *              WNetDeviceMode       [USER.514]
418  */
419 int WINAPI WNetDeviceMode16(HWND16 hWndOwner)
420 {
421         FIXME(wnet, "(%04x): stub\n",hWndOwner);
422         return WN_NO_NETWORK;
423 }
424
425 /**************************************************************************
426  *              WNetBrowseDialog       [USER.515]
427  */
428 int WINAPI WNetBrowseDialog16(HWND16 hParent,WORD nType,LPSTR szPath)
429 {
430         FIXME(wnet, "(%04x,%x,'%s'): stub\n",hParent,nType,szPath);
431         return WN_NO_NETWORK;
432 }
433
434 /**************************************************************************
435  *                              WNetGetUser                     [USER.516]
436  */
437 UINT16 WINAPI WNetGetUser16(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
438 {
439         FIXME(wnet, "(%p, %p, %p): stub\n", lpLocalName, lpUserName, lpSize);
440         return WN_NO_NETWORK;
441 }
442
443 /**************************************************************************
444  *                              WNetGetUser                     [MPR.86]
445  * FIXME: we should not return ourselves, but the owner of the drive lpLocalName
446  */
447 DWORD WINAPI WNetGetUserA(LPCSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize)
448 {
449         struct passwd   *pwd = getpwuid(getuid());
450
451         FIXME(wnet, "(%s, %p, %p), mostly stub\n", lpLocalName, lpUserName, lpSize);
452         if (pwd) {
453                 if (strlen(pwd->pw_name)+1>*lpSize) {
454                         *lpSize = strlen(pwd->pw_name)+1;
455                         SetLastError(ERROR_MORE_DATA);
456                         return ERROR_MORE_DATA;
457                 }
458                 strcpy(lpUserName,pwd->pw_name);
459                 if (lpSize)
460                         *lpSize = strlen(pwd->pw_name)+1;
461                 return WN_SUCCESS;
462         }
463         /* FIXME: wrong return value */
464         SetLastError(ERROR_NO_NETWORK);
465         return ERROR_NO_NETWORK;
466 }
467
468 /**************************************************************************
469  *              WNetGetError       [USER.519]
470  */
471 int WINAPI WNetGetError16(LPWORD nError)
472 {
473         FIXME(wnet, "(%p): stub\n",nError);
474         return WN_NO_NETWORK;
475 }
476
477 /**************************************************************************
478  *              WNetGetErrorText       [USER.520]
479  */
480 int WINAPI WNetGetErrorText16(WORD nError, LPSTR lpBuffer, LPWORD nBufferSize)
481 {
482         FIXME(wnet, "(%x,%p,%p): stub\n",nError,lpBuffer,nBufferSize);
483         return WN_NET_ERROR;
484 }
485
486 /**************************************************************************
487  *              WNetRestoreConnection       [USER.523]
488  */
489 int WINAPI WNetRestoreConnection16(HWND16 hwndOwner,LPSTR lpszDevice)
490 {
491         FIXME(wnet, "(%04x,'%s'): stub\n",hwndOwner,lpszDevice);
492         return WN_NO_NETWORK;
493 }
494
495 /**************************************************************************
496  *              WNetWriteJob       [USER.524]
497  */
498 int WINAPI WNetWriteJob16(HANDLE16 hJob,void *lpData,LPWORD lpcbData)
499 {
500         FIXME(wnet, "(%04x,%p,%p): stub\n",hJob,lpData,lpcbData);
501         return WN_NO_NETWORK;
502 }
503
504 /********************************************************************
505  *              WNetConnectDialog       [USER.525]
506  */
507 UINT16 WINAPI WNetConnectDialog(HWND16 hWndParent, WORD iType)
508 {
509         FIXME(wnet, "(%04x, %4X): stub\n", hWndParent, iType);
510         return WN_SUCCESS;
511 }
512
513 /**************************************************************************
514  *              WNetDisconnectDialog       [USER.526]
515  */
516 int WINAPI WNetDisconnectDialog16(HWND16 hwndOwner, WORD iType)
517 {
518         FIXME(wnet, "(%04x,%x): stub\n",hwndOwner,iType);
519         return WN_NO_NETWORK;
520 }
521
522 /**************************************************************************
523  *              WnetConnectionDialog     [USER.527]
524  */
525 UINT16 WINAPI WNetConnectionDialog16(HWND16 hWndParent, WORD iType)
526 {
527         FIXME(wnet, "(%04x, %4X): stub\n", hWndParent, iType);
528         return WN_SUCCESS;
529 }
530
531
532
533 /**************************************************************************
534  *              WNetViewQueueDialog       [USER.528]
535  */
536 int WINAPI WNetViewQueueDialog16(HWND16 hwndOwner,LPSTR lpszQueue)
537 {
538         FIXME(wnet, "(%04x,'%s'): stub\n",hwndOwner,lpszQueue);
539         return WN_NO_NETWORK;
540 }
541
542 /**************************************************************************
543  *              WNetPropertyDialog       [USER.529]
544  */
545 int WINAPI WNetPropertyDialog16(HWND16 hwndParent,WORD iButton,
546                               WORD nPropSel,LPSTR lpszName,WORD nType)
547 {
548         FIXME(wnet, "(%04x,%x,%x,'%s',%x): stub\n",
549               hwndParent,iButton,nPropSel,lpszName,nType);
550         return WN_NO_NETWORK;
551 }
552
553 /*********************************************************************
554  *  WNetGetDirectoryType [USER.530]  Decides whether resource is local
555  *
556  * RETURNS
557  *    on success,  puts one of the following in *lpType:
558  * - WNDT_NETWORK   on a network
559  * - WNDT_LOCAL     local
560  */
561 int WINAPI WNetGetDirectoryType16(LPSTR lpName, LPINT16 lpType)
562 {
563         UINT type = GetDriveTypeA(lpName);
564
565         if (type == DRIVE_DOESNOTEXIST)
566           type = GetDriveTypeA(NULL);
567         *lpType = (type==DRIVE_REMOTE)?WNDT_NETWORK:WNDT_NORMAL;
568         TRACE(wnet,"%s is %s\n",lpName,(*lpType==WNDT_NETWORK)?
569               "WNDT_NETWORK":"WNDT_NORMAL");
570         return WN_SUCCESS;
571 }
572
573 /*****************************************************************
574  *              WNetGetDirectoryTypeA     [MPR.109]
575  */
576
577 UINT WINAPI WNetGetDirectoryTypeA(LPSTR lpName,void *lpType)
578 {
579    return WNetGetDirectoryType16(lpName, lpType);
580 }
581
582 /**************************************************************************
583  *              WNetDirectoryNotify       [USER.531]
584  */
585 int WINAPI WNetDirectoryNotify16(HWND16 hwndOwner,void *lpDir,WORD wOper)
586 {
587         FIXME(wnet, "(%04x,%p,%x): stub\n",hwndOwner,lpDir,wOper);
588         return WN_NO_NETWORK;
589 }
590
591 /**************************************************************************
592  *              WNetGetPropertyText       [USER.532]
593  */
594 int WINAPI WNetGetPropertyText16(WORD iButton, WORD nPropSel, LPSTR lpszName,
595                           LPSTR lpszButtonName, WORD cbButtonName, WORD nType)
596 {
597         FIXME(wnet, "(%04x,%04x,'%s','%s',%04x): stub\n",
598               iButton,nPropSel,lpszName,lpszButtonName, nType);
599         return WN_NO_NETWORK;
600 }
601
602
603 /**************************************************************************
604  *                              WNetCloseEnum           [USER.???]
605  */
606 UINT16 WINAPI WNetCloseEnum(HANDLE16 hEnum)
607 {
608         FIXME(wnet, "(%04x): stub\n", hEnum);
609         return WN_NO_NETWORK;
610 }
611
612 /**************************************************************************
613  *                              WNetEnumResource        [USER.???]
614  */
615 UINT16 WINAPI WNetEnumResource(HANDLE16 hEnum, DWORD cRequ, 
616                                DWORD *lpCount, LPVOID lpBuf)
617 {
618         FIXME(wnet, "(%04x, %08lX, %p, %p): stub\n", 
619               hEnum, cRequ, lpCount, lpBuf);
620         return WN_NO_NETWORK;
621 }
622
623 /**************************************************************************
624  *                              WNetOpenEnum            [USER.???]
625  */
626 UINT16 WINAPI WNetOpenEnum16(DWORD dwScope, DWORD dwType, 
627                              LPNETRESOURCE16 lpNet, HANDLE16 *lphEnum)
628 {
629         FIXME(wnet, "(%08lX, %08lX, %p, %p): stub\n",
630               dwScope, dwType, lpNet, lphEnum);
631         return WN_NO_NETWORK;
632 }
633
634 /**************************************************************************
635  *                              WNetOpenEnumA           [MPR.92]
636  */
637 UINT WINAPI WNetOpenEnumA(DWORD dwScope, DWORD dwType, DWORD dwUsage,
638                               LPNETRESOURCEA lpNet, HANDLE *lphEnum)
639 {
640         FIXME(wnet, "(%08lX, %08lX, %08lX, %p, %p): stub\n",
641               dwScope, dwType, dwUsage, lpNet, lphEnum);
642         SetLastError(WN_NO_NETWORK);
643         return WN_NO_NETWORK;
644 }
645
646 /**************************************************************************
647  *                             WNetOpenEnumW           [MPR.93]
648  */
649 UINT WINAPI WNetOpenEnumW(DWORD dwScope, DWORD dwType, DWORD dwUsage,
650                               LPNETRESOURCEA lpNet, HANDLE *lphEnum)
651 {
652        FIXME(wnet, "(%08lX, %08lX, %08lX, %p, %p): stub\n",
653              dwScope, dwType, dwUsage, lpNet, lphEnum);
654        SetLastError(WN_NO_NETWORK);
655        return WN_NO_NETWORK;
656 }
657
658 /* ****************************************************************
659  *    WNetGetResourceInformationA [MPR.80]
660  * */
661
662 DWORD WINAPI 
663 WNetGetResourceInformationA(
664         LPNETRESOURCEA netres,LPVOID buf,LPDWORD buflen,LPSTR systemstr
665 ) {
666         FIXME(wnet,"(%p,%p,%p,%p): stub!\n",netres,buf,buflen,systemstr);
667   SetLastError(WN_NO_NETWORK);
668         return WN_NO_NETWORK;
669 }
670
671 /**************************************************************************
672  * WNetCachePassword [MPR.52]  Saves password in cache
673  *
674  * RETURNS
675  *    Success: WN_SUCCESS
676  *    Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BADVALUE, WN_NET_ERROR,
677  *             WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY
678  */
679 DWORD WINAPI WNetCachePassword(
680     LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */
681     WORD cbResource,  /* [in] Size of name */
682     LPSTR pbPassword, /* [in] Buffer containing password */
683     WORD cbPassword,  /* [in] Size of password */
684     BYTE nType)       /* [in] Type of password to cache */
685 {
686     FIXME(mpr,"(%s,%d,%s,%d,%d): stub\n", pbResource,cbResource,
687           pbPassword,cbPassword,nType);
688     return WN_SUCCESS;
689 }
690
691
692
693 /*****************************************************************
694  * WNetGetCachedPassword [MPR.69]  Retrieves password from cache
695  *
696  * RETURNS
697  *    Success: WN_SUCCESS
698  *    Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BAD_VALUE, 
699  *             WN_NET_ERROR, WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY
700  */
701 DWORD WINAPI WNetGetCachedPassword(
702     LPSTR pbResource,   /* [in]  Name of workgroup, computer, or resource */
703     WORD cbResource,    /* [in]  Size of name */
704     LPSTR pbPassword,   /* [out] Buffer to receive password */
705     LPWORD pcbPassword, /* [out] Receives size of password */
706     BYTE nType)         /* [in]  Type of password to retrieve */
707 {
708     FIXME(mpr,"(%s,%d,%p,%d,%d): stub\n",
709           pbResource,cbResource,pbPassword,*pcbPassword,nType);
710     return WN_ACCESS_DENIED;
711 }
712
713 /*****************************************************************
714  *     MultinetGetConnectionPerformanceA [MPR.25]
715  *
716  * RETURNS
717  *    Success: NO_ERROR
718  *    Failure: ERROR_NOT_SUPPORTED, ERROR_NOT_CONNECTED,
719  *             ERROR_NO_NET_OR_BAD_PATH, ERROR_BAD_DEVICE,
720  *             ERROR_BAD_NET_NAME, ERROR_INVALID_PARAMETER, 
721  *             ERROR_NO_NETWORK, ERROR_EXTENDED_ERROR
722  */
723 DWORD WINAPI MultinetGetConnectionPerformanceA(
724         LPNETRESOURCEA lpNetResource,
725         LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
726 ) {
727         FIXME(mpr,"(%p,%p): stub\n",lpNetResource,lpNetConnectInfoStruct);
728         return WN_NO_NETWORK;
729 }
730
731
732 /*****************************************************************
733  *  [MPR.22]
734  */
735
736 DWORD WINAPI _MPR_22(DWORD x)
737 {
738         FIXME(mpr,"(%lx): stub\n",x);
739         return 0;
740 }
741
742 /*****************************************************************
743  *  MultinetGetErrorTextA [MPR.28]
744  */
745
746 UINT WINAPI MultinetGetErrorTextA (DWORD x, DWORD y, DWORD z)
747 {       FIXME(mpr,"(%lx,%lx,%lx): stub\n",x,y,z);
748   return 0;
749 }
750
751 /*****************************************************************
752  *  MultinetGetErrorTextW [MPR.29]
753  */
754 UINT WINAPI MultinetGetErrorTextW (DWORD x, DWORD y, DWORD z)
755 {       FIXME(mpr,"(%lx,%lx,%lx): stub\n",x,y,z);
756   return 0;
757 }
758
759 /*****************************************************************
760  *  NPSGetProviderHandle [MPR.33]
761  */
762 DWORD WINAPI NPSGetProviderHandleA(DWORD x) {
763         FIXME(mpr,"(0x%08lx),stub!\n",x);
764         return 0;
765 }
766
767 /*****************************************************************
768  *  WNetCancelConnection232A [MPR.53]
769  */
770 DWORD WINAPI WNetCancelConnection2A(
771   LPCSTR lpName, 
772   DWORD dwFlags, 
773   BOOL fForce) {
774
775   FIXME(wnet,": stub\n");
776   return WN_SUCCESS;
777 }
778
779 /*****************************************************************
780  *  WNetCancelConnection232W [MPR.54]
781  */
782 DWORD WINAPI WNetCancelConnection2W(
783   LPCWSTR lpName, 
784   DWORD dwFlags, 
785   BOOL fForce) {
786
787   FIXME(wnet,": stub\n");
788   return WN_SUCCESS;
789 }
790
791 /*****************************************************************
792  *  WNetCancelConnection32A [MPR.55]
793  */
794 DWORD WINAPI WNetCancelConnectionA(
795   LPCSTR lpName, 
796   DWORD dwFlags, 
797   BOOL fForce) {
798
799   FIXME(wnet,": stub\n");
800   return WN_SUCCESS;
801 }
802
803 /*****************************************************************
804  *  WNetCancelConnection32W [MPR.56]
805  */
806 DWORD WINAPI WNetCancelConnectionW(
807   LPCWSTR lpName, 
808   DWORD dwFlags, 
809   BOOL fForce) {
810
811   FIXME(wnet,": stub\n");
812   return WN_SUCCESS;
813 }
814
815 /*****************************************************************
816  *  WNetGetUser32W [MPR.87]
817  */
818 DWORD WINAPI WNetGetUserW(
819   LPCWSTR  lpName,
820   LPWSTR   lpUserName,
821   LPDWORD  lpnLength) {
822
823   FIXME(wnet,": stub\n");
824        SetLastError(WN_NO_NETWORK);
825   return WN_NO_NETWORK;
826 }