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