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