|
|
1.1 root 1: /*
2: * net.c
3: *
4: * Purpose:
5: * net functions
6: *
7: * Owner:
8: * MikeSart
9: */
10: #define UNICODE 1
11:
12: #include <windows.h>
13: #include <windowsx.h>
14: #include <string.h>
15: #include <time.h>
16: #include <lm.h>
17: #include "netwatch.h"
18: #include "rcids.h"
19:
20: typedef struct
21: {
22: DWORD dwType;
23: DWORD dwData;
24: TCHAR rgsz[];
25: } LBDATA;
26:
27: // in datetime.c
28: TCHAR *PutTime(time_t tm_t, TCHAR *szStr);
29: TCHAR *PutDate(time_t tm_t, TCHAR *szStr);
30: TCHAR *PutCounterTime(DWORD dw, TCHAR *szStr);
31:
32: // variables
33: TCHAR *szFmtLB[LBITEM_NUMITEMS];
34:
35: // returns TRUE - error
36: // if it fails initing, you should still call
37: // InitNetWatch(FALSE) to clean up
38: BOOL
39: InitNetWatch(BOOL fInit)
40: {
41: DWORD dwT;
42: TCHAR *szCommandLine;
43: BOOL fError = FALSE;
44:
45: if(fInit)
46: {
47: szAppName = AllocAndLoadString(IDS_APPNAME);
48: if(!szAppName)
49: fError = TRUE;
50:
51: // load formatting info for each listbox item
52: for(dwT = 0; dwT < LBITEM_NUMITEMS; dwT++)
53: {
54: szFmtLB[dwT] = AllocAndLoadString(IDS_FMTLB + dwT);
55: if(!szFmtLB[dwT])
56: fError = TRUE;
57: }
58:
59: if(szCommandLine = GetCommandLine())
60: {
1.1.1.2 ! root 61: if(*szCommandLine == '\"')
! 62: {
! 63: /*
! 64: * Scan, and skip over, subsequent characters until
! 65: * another double-quote or a null is encountered.
! 66: */
! 67: while(*++szCommandLine && (*szCommandLine != '\"'))
! 68: ;
! 69:
! 70: /*
! 71: * If we stopped on a double-quote (usual case), skip
! 72: * over it.
! 73: */
! 74: if(*szCommandLine == '\"')
! 75: szCommandLine++;
! 76: }
! 77: else
! 78: {
! 79: while(*szCommandLine > ' ')
! 80: szCommandLine++;
! 81: }
! 82:
! 83: /*
! 84: * Skip past any white space preceeding the second token.
! 85: */
! 86: while (*szCommandLine && (*szCommandLine <= ' '))
! 87: {
! 88: szCommandLine++;
! 89: }
! 90:
! 91: #ifdef NEVER
1.1 root 92: // skip first arg (our exe name)
93: while(*szCommandLine && (*szCommandLine != ' '))
94: szCommandLine++;
95:
96: // skip spaces
97: while(*szCommandLine && (*szCommandLine == ' '))
98: szCommandLine++;
1.1.1.2 ! root 99: #endif
1.1 root 100:
101: if(*szCommandLine)
102: {
103: if(lstrlen(szCommandLine) > UNCLEN)
104: szCommandLine[UNCLEN] = '\0';
105: if(!(szServerName = GlobalAllocPtr(GHND,
106: (lstrlen(szCommandLine) + 3) * sizeof(TCHAR))))
107: fError = TRUE;
108: else
109: {
110: if(szCommandLine[0] != '\\')
111: {
112: szServerName[0] = szServerName[1] = '\\';
113: lstrcpy(&szServerName[2], szCommandLine);
114: }
115: else
116: {
117: lstrcpy(szServerName, szCommandLine);
118: }
119: }
120: }
121: }
122: return fError;
123: }
124:
125: GlobalFreeNullPtr(szAppName);
126: GlobalFreeNullPtr(szServerName);
127: szAppName = szServerName = NULL;
128:
129: for(dwT = 0; dwT < LBITEM_NUMITEMS; dwT++)
130: {
131: GlobalFreeNullPtr(szFmtLB[dwT]);
132: szFmtLB[dwT] = NULL;
133: }
134:
135: return fError;
136: }
137:
138: LBDATA *
139: AllocExtraData1(DWORD dwType, DWORD dwData, TCHAR *sz1)
140: {
141: LBDATA *plbitem;
142: DWORD cb;
143:
144: if(!sz1)
145: sz1 = szNil;
146:
147: cb = sizeof(LBDATA) + ((wcslen(sz1) + 1) * sizeof(TCHAR));
148: plbitem = (LBDATA *)GlobalAllocPtr(GHND, cb);
149: if(plbitem)
150: {
151: plbitem->dwType = dwType;
152: plbitem->dwData = dwData;
153:
154: wcscpy(plbitem->rgsz, sz1);
155: }
156:
157: return plbitem;
158: }
159:
160: LBDATA *
161: AllocExtraDataUser(DWORD dwType, DWORD dwData, TCHAR *szNetName,
162: TCHAR *szUserName, TCHAR *szShareName, TCHAR *szShareRemark)
163: {
164: LBDATA *plbitem;
165: DWORD cb;
166: DWORD cch1, cch2, cch3;
167: DWORD cch4 = 0;
168: TCHAR *szT;
169:
170: cch1 = wcslen(szNetName) + 1;
171: cch2 = wcslen(szUserName) + 1;
172: cch3 = wcslen(szShareName) + 1;
173: if(szShareRemark && szShareRemark[0])
174: cch4 = wcslen(szShareRemark) + 4; // for 'sharename (comment)' style
175:
176: cb = sizeof(LBDATA) + ((cch1 + cch2 + cch3 + cch4 + 2) * sizeof(TCHAR));
177: plbitem = (LBDATA *)GlobalAllocPtr(GHND, cb);
178: if(plbitem)
179: {
180: plbitem->dwType = dwType;
181: plbitem->dwData = dwData;
182:
183: // add \\ to front of netname
184: plbitem->rgsz[0] = plbitem->rgsz[1] = '\\';
185: szT = wcscpy(plbitem->rgsz + 2, szNetName);
186: szT = wcscpy(szT + cch1, szUserName);
187: szT = wcscpy(szT + cch2, szShareName);
188: if(cch4)
189: {
190: wcscat(szT, TEXT(" ("));
191: wcscat(szT, szShareRemark);
192: wcscat(szT, TEXT(")"));
193: }
194: }
195:
196: return plbitem;
197: }
198:
199: BOOL
200: AddLBItem(HWND hwndLB, DWORD *pdwIndex, TCHAR *pszItem, DWORD dwData)
201: {
202: DWORD dwT;
203: static TCHAR szCurrentItem[256];
204: register DWORD dwIndex = *pdwIndex;
205:
206: // if the current item matches, just set the data
207: if((ListBox_GetText(hwndLB, dwIndex, szCurrentItem) != LB_ERR) &&
208: (!wcscmp(szCurrentItem, pszItem)))
209: {
210: GlobalFreeNullPtr((LPVOID)ListBox_GetItemData(hwndLB, dwIndex));
211: goto SetData;
212: }
213:
214: // if we found an exact match later, del everything up to that
215: dwT = ListBox_FindStringExact(hwndLB, dwIndex, pszItem);
216: if((dwT != LB_ERR) && (dwT > dwIndex))
217: {
218: DWORD dw;
219:
220: for(dw = dwIndex; dw < dwT; dw++)
221: {
222: GlobalFreeNullPtr((LPVOID)ListBox_GetItemData(hwndLB, dwIndex));
223: ListBox_DeleteString(hwndLB, dwIndex);
224: }
225:
226: GlobalFreeNullPtr((LPVOID)ListBox_GetItemData(hwndLB, dwIndex));
227: goto SetData;
228: }
229:
230: // ok, it's a new string, insert it
231: ListBox_InsertString(hwndLB, dwIndex, pszItem);
232:
233: SetData:
234: ListBox_SetItemData(hwndLB, dwIndex, dwData);
235: (*pdwIndex)++;
236:
237: return TRUE;
238: }
239:
240: NET_API_STATUS
241: FilesEnum(HWND hwndLB, DWORD *pdwIndex, TCHAR *sharename,
242: TCHAR *username, TCHAR *sharepath)
243: {
244: FILE_INFO_3 *fi3 = NULL;
245: NET_API_STATUS nas;
246: DWORD dwentriesread;
247: DWORD dwtotalentries;
1.1.1.2 ! root 248: TCHAR *psharepathend;
! 249:
! 250: // Reasoning: if you are passed c:\ as a sharepath, sometimes c: is opened
! 251: // as execute. But since we would be qualifying paths on c:\, it won't show
! 252: // c: as being open. So - remove the last \ if it's there.
! 253: if(sharepath && sharepath[0])
! 254: {
! 255: psharepathend = sharepath + lstrlen(sharepath) - 1;
! 256: if(*psharepathend == TEXT('\\'))
! 257: *psharepathend = '\0';
! 258: }
1.1 root 259:
260: nas = NetFileEnum(szServerName, sharepath, username, 3,
261: (LPBYTE *)&fi3, MAX_PREFERRED_LENGTH,
262: &dwentriesread, &dwtotalentries, NULL);
263: if(nas)
264: goto err;
265:
266: while(dwentriesread)
267: {
268: UINT nBitmap = 4; // assume read bitmap
269:
270: --dwentriesread;
271:
272: if((fi3[dwentriesread].fi3_permissions & PERM_FILE_WRITE) ||
273: (fi3[dwentriesread].fi3_permissions & PERM_FILE_CREATE))
274: nBitmap = 3;
275:
276: wsprintf(szBuffer, szFmtLB[LBITEM_FILE], nBitmap,
277: fi3[dwentriesread].fi3_pathname);
278:
279: AddLBItem(hwndLB, pdwIndex, szBuffer, (DWORD)AllocExtraData1(
280: LBITEM_FILE, fi3[dwentriesread].fi3_id, username));
281: }
282:
283: err:
284: NetApiBufferFree(fi3);
285: if(nas)
286: return nas | FILE_ENUM_ERROR;
287: return nas;
288: }
289:
290: NET_API_STATUS
291: UsersEnum(HWND hwndLB, DWORD *pdwIndex, TCHAR *sharename, TCHAR *sharepath,
292: TCHAR *shareremark, DWORD dwShareType)
293: {
294: DWORD dwentriesread;
295: DWORD dwtotalentries;
296: CONNECTION_INFO_1 *ci1 = NULL;
297: NET_API_STATUS nas;
298:
299: nas = NetConnectionEnum(szServerName, sharename, 1, (LPBYTE *)&ci1,
300: MAX_PREFERRED_LENGTH, &dwentriesread, &dwtotalentries,
301: NULL);
302: if(nas)
303: goto err;
304:
305: dwNumUsers += dwentriesread;
306: while(dwentriesread)
307: {
308: TCHAR *username;
309: TCHAR *netname;
310:
311: --dwentriesread;
312:
313: username = ci1[dwentriesread].coni1_username;
314: netname = ci1[dwentriesread].coni1_netname;
315: if(!username || !username[0])
316: username = szNil;
317: else
318: CharLower(username);
319: if(!netname || !netname[0])
320: netname = szNil;
321: else
322: CharUpper(netname);
323:
324: wsprintf(szBuffer, szFmtLB[LBITEM_USER], username, netname);
325:
326: AddLBItem(hwndLB, pdwIndex, szBuffer, (DWORD)AllocExtraDataUser(
327: LBITEM_USER, dwShareType, netname, username, sharename,
328: shareremark));
329:
330: if(ci1[dwentriesread].coni1_num_opens &&
331: unMenuFlags[IDM_SHOWFILES & 0xff] == MF_CHECKED && !nas)
332: nas = FilesEnum(hwndLB, pdwIndex, sharename, username,
333: sharepath);
334: }
335:
336: err:
337: NetApiBufferFree(ci1);
338: return nas;
339: }
340:
341: void
342: RefreshDisplay(HWND hwnd)
343: {
344: HWND hwndLB = GetWindow(hwnd, GW_CHILD);
345: SHARE_INFO_2 *shi2 = NULL;
346: DWORD dwIndex = 0;
347: DWORD dwentriesread;
348: DWORD dwtotalentries;
349: DWORD dwT;
350: NET_API_STATUS nas;
351: INT n;
352:
353: PunchTimer(FALSE);
354: SetCursor(LoadCursor(NULL, IDC_WAIT));
355: n = ListBox_GetCurSel(hwndLB);
356: SetWindowRedraw(hwndLB, FALSE);
357: dwNumUsers = 0;
358:
359: nas = NetShareEnum(szServerName, 2, (LPBYTE *)&shi2,
360: MAX_PREFERRED_LENGTH, &dwentriesread, &dwtotalentries, NULL);
361: if(nas)
362: goto err;
363:
364: while(dwentriesread)
365: {
366: TCHAR *sharename;
367: TCHAR *shareremark;
368: int nBitmap = 0; // assume normal directory share
369:
370: --dwentriesread;
371: sharename = shi2[dwentriesread].shi2_netname;
372: shareremark = shi2[dwentriesread].shi2_remark;
373:
374: if(!sharename)
375: continue;
376: if(!shareremark)
377: shareremark = szNil;
378:
379: // skip hidden shares
380: if((unMenuFlags[IDM_SHOWHIDDEN & 0xff] == MF_UNCHECKED) &&
381: (sharename[lstrlen(sharename) - 1] == TEXT('$')))
382: continue;
383:
384: if(shi2[dwentriesread].shi2_type == STYPE_IPC) // use IPC$ icon
385: nBitmap = 8;
386: if(shareremark[0])
387: {
388: wsprintf(szBuffer, szFmtLB[LBITEM_SHARE2],
389: nBitmap, sharename, shareremark);
390: }
391: else
392: {
393: wsprintf(szBuffer, szFmtLB[LBITEM_SHARE], nBitmap, sharename);
394: }
395:
396: if((unMenuFlags[IDM_SHOWINUSE & 0xff] != MF_CHECKED) ||
397: shi2[dwentriesread].shi2_current_uses)
398: {
399: AddLBItem(hwndLB, &dwIndex, szBuffer,
400: (DWORD)AllocExtraData1(LBITEM_SHARE, 0, sharename));
401: }
402:
403: if(shi2[dwentriesread].shi2_current_uses)
404: {
405: if(!nas || (nas & FILE_ENUM_ERROR))
406: nas = UsersEnum(hwndLB, &dwIndex, sharename,
407: shi2[dwentriesread].shi2_path, shareremark,
408: shi2[dwentriesread].shi2_type);
409: }
410: }
411:
412: err:
413: if(nas)
414: {
415: AddErrorStringToLB(nas);
416: dwIndex++;
417: }
418:
419: // delete extra strings dangling at the end
420: while((dwT = ListBox_GetItemData(hwndLB, dwIndex)) != LB_ERR)
421: {
422: GlobalFreeNullPtr((LPVOID)dwT);
423: ListBox_DeleteString(hwndLB, dwIndex);
424: }
425:
426: if((ListBox_GetCurSel(hwndLB) == LB_ERR) &&
427: (ListBox_SetCurSel(hwndLB, n) == LB_ERR))
428: ListBox_SetCurSel(hwndLB, 0);
429:
430: SetWindowRedraw(hwndLB, TRUE);
431: SetCursor(LoadCursor(NULL, IDC_ARROW));
432: UpdateWindowText(hwnd, FALSE);
433: NetApiBufferFree(shi2);
434: PunchTimer(TRUE);
435: }
436:
437: NET_API_STATUS
438: DisplayShareDetails(HWND hwnd, LBDATA *plbdata, WORD wAction)
439: {
440: PROPERTIES props;
441: NET_API_STATUS nas = 0;
442: SHARE_INFO_2 *shi2 = NULL;
443: TCHAR szMaxUses[11];
444: TCHAR szMaxCurrent[11];
445:
446: nas = NetShareGetInfo(szServerName, plbdata->rgsz, 2, (LPBYTE *)&shi2);
447: if(!nas && shi2)
448: {
449: props.rgIDSStart = IDS_SHAREPROPS;
450: if(shi2->shi2_type == STYPE_IPC)
451: props.dwrgBmp = 0xfffffff8; // bitmap #8 for IPC$ netname
452: else
453: props.dwrgBmp = 0xfffffff0; // bitmap #0 for folder netname
454:
455: props.rgsz[0] = shi2->shi2_netname;
456: props.rgsz[1] = shi2->shi2_path;
457: props.rgsz[2] = shi2->shi2_remark;
458: if(shi2->shi2_max_uses == SHI_USES_UNLIMITED)
459: {
460: props.rgsz[3] = szFromIDS2(IDS_NOLIMIT);
461: }
462: else
463: {
464: wsprintf(szMaxUses, szFmtNum, shi2->shi2_max_uses);
465: props.rgsz[3] = szMaxUses;
466: }
467: wsprintf(szMaxCurrent, szFmtNum, shi2->shi2_current_uses);
468: props.rgsz[4] = szMaxCurrent;
469: props.rgsz[5] = NULL;
470:
471: if(wAction == VK_DELETE)
472: {
473: // if no one is connected, nuke it, else confirm with user
474: if(!(shi2->shi2_current_uses) ||
475: (MessageBox(hwnd, szFromIDS1(IDS_AREYOUSURE + LBITEM_SHARE),
476: szAppName, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2) ==
477: IDYES))
478: {
479: nas = NetShareDel(szServerName, plbdata->rgsz, 0);
480: }
481: }
482: else
483: {
484: DialogBoxParam(ghInst, MAKEINTRESOURCE(DLG_PROPERTIES),
485: hwnd, PropDlgProc, (LPARAM)&props);
486: }
487: }
488:
489: NetApiBufferFree(shi2);
490: return nas;
491: }
492:
493: NET_API_STATUS
494: DisplayFileDetails(HWND hwnd, LBDATA *plbdata, WORD wAction)
495: {
496: PROPERTIES props;
497: NET_API_STATUS nas;
498: FILE_INFO_3 *fi3 = NULL;
499: TCHAR szNumLocks[11];
500: UINT nBitmap = 4; // assume read bitmap
501:
502: nas = NetFileGetInfo(szServerName, plbdata->dwData, 3, (LPBYTE *)&fi3);
503: if(!nas && fi3)
504: {
505: props.rgIDSStart = IDS_FILEPROPS;
506:
507: if((fi3->fi3_permissions & PERM_FILE_WRITE) ||
508: (fi3->fi3_permissions & PERM_FILE_CREATE))
509: nBitmap = 3;
510: props.dwrgBmp = 0xfffff072 | (nBitmap << 8);
511:
512: props.rgsz[0] = fi3->fi3_pathname;
513: props.rgsz[1] = fi3->fi3_username;
514: props.rgsz[2] = szFromIDS1(IDS_FILEPROPS + 10 + nBitmap);
515: wsprintf(szNumLocks, szFmtNum, fi3->fi3_num_locks);
516: props.rgsz[3] = szNumLocks;
517: props.rgsz[4] = NULL;
518: props.rgsz[5] = NULL;
519:
520: if(wAction == VK_DELETE)
521: {
522: wsprintf(szBuffer, szFromIDS1(IDS_AREYOUSURE + LBITEM_FILE),
523: plbdata->rgsz, fi3->fi3_pathname);
524: if(MessageBox(hwnd, szBuffer, szAppName,
525: MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2) == IDYES)
526: nas = NetFileClose(szServerName, plbdata->dwData);
527: }
528: else
529: {
530: DialogBoxParam(ghInst, MAKEINTRESOURCE(DLG_PROPERTIES),
531: hwnd, PropDlgProc, (LPARAM)&props);
532: }
533: }
534: NetApiBufferFree(fi3);
535: return nas;
536: }
537:
538: NET_API_STATUS
539: DisplayUserDetails(HWND hwnd, LBDATA *plbdata, WORD wAction)
540: {
541: PROPERTIES props;
542: NET_API_STATUS nas;
543: time_t tm_t;
544: SESSION_INFO_2 *sesi2 = NULL;
545: TCHAR szNumOpens[11];
546: TCHAR szConnectTime[50];
547: TCHAR szIdleTime[50];
548: TCHAR *szNetName = plbdata->rgsz;
549: TCHAR *szUserName = szNetName + lstrlen(szNetName) + 1;
550: TCHAR *szShareName = szUserName + lstrlen(szUserName) + 1;
551:
552: nas = NetSessionGetInfo(szServerName, szNetName, szUserName,
553: 2, (LPBYTE *)&sesi2);
554:
555: if(!nas && sesi2)
556: {
557: props.rgIDSStart = IDS_USERPROPS;
558: if(plbdata->dwData == STYPE_IPC)
559: props.dwrgBmp = 0xfffff817; // IPC$ share
560: else
561: props.dwrgBmp = 0xfffff017; // Drive share
562:
563: if(sesi2->sesi2_user_flags & SESS_GUEST)
564: {
565: lstrcpy(szBuffer, szUserName);
566: lstrcat(szBuffer, szFromIDS1(IDS_GUEST));
567: props.rgsz[0] = szBuffer;
568: }
569: else
570: props.rgsz[0] = szUserName;
571:
572: props.rgsz[1] = szNetName;
573: props.rgsz[2] = szShareName;
574:
575: time(&tm_t);
576: PutTime(tm_t - sesi2->sesi2_time, szIdleTime);
577: PutDate(tm_t - sesi2->sesi2_time, szConnectTime);
578: lstrcat(szConnectTime, TEXT(" "));
579: lstrcat(szConnectTime, szIdleTime);
580: props.rgsz[3] = szConnectTime;
581: props.rgsz[4] = PutCounterTime(sesi2->sesi2_idle_time, szIdleTime);
582:
583: wsprintf(szNumOpens, szFmtNum, sesi2->sesi2_num_opens);
584: props.rgsz[5] = szNumOpens;
585:
586: if(wAction == VK_DELETE)
587: {
1.1.1.2 ! root 588: // if user has open files, tell the del happy person this
! 589: // otherwise just reaffirm that they wanna hack em.
! 590: if(sesi2->sesi2_num_opens)
! 591: {
! 592: wsprintf(szBuffer, szFromIDS1(IDS_AREYOUSURE + LBITEM_USER),
! 593: szUserName);
! 594: }
! 595: else
! 596: {
! 597: wsprintf(szBuffer, szFromIDS1(IDS_DISUSER), szUserName);
! 598: }
! 599:
1.1 root 600: if(MessageBox(hwnd, szBuffer, szAppName,
601: MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2) == IDYES)
602: {
1.1.1.2 ! root 603: nas = NetSessionDel(szServerName, szNetName, szUserName);
1.1 root 604: }
605: }
606: else
607: {
608: DialogBoxParam(ghInst, MAKEINTRESOURCE(DLG_PROPERTIES),
609: hwnd, PropDlgProc, (LPARAM)&props);
610: }
611: }
612:
613: if(!nas && !sesi2)
614: nas = ERROR_NOT_CONNECTED;
615: NetApiBufferFree(sesi2);
616: return nas;
617: }
618:
619: void
620: HandleMenu(HWND hwnd)
621: {
622: HWND hwndLB = GetWindow(hwnd, GW_CHILD);
623: INT nIndex;
624: DWORD dwData;
625:
626: nIndex = ListBox_GetCurSel(hwndLB);
627: dwData = ListBox_GetItemData(hwndLB, nIndex);
628: if((nIndex == LB_ERR) || (dwData == LB_ERR) || !dwData)
629: goto err;
630:
631: switch(((LBDATA *)dwData)->dwType)
632: {
633: case LBITEM_FILE:
634: case LBITEM_SHARE:
635: case LBITEM_USER:
636: ModifyMenu(ghMenu, IDM_DELETERESOURCE, MF_BYCOMMAND | MF_STRING,
637: IDM_DELETERESOURCE,
638: szFromIDS1(IDM_DELETERESOURCE + ((LBDATA *)dwData)->dwType));
639: break;
640:
641: default:
642: goto err;
643: }
644:
645: return;
646:
647: err:
648: EnableMenuItem(ghMenu, IDM_DELETERESOURCE, MF_BYCOMMAND | MF_GRAYED);
649: }
650:
651: void
652: HandleWM_VKEY(HWND hwnd, WORD wAction)
653: {
654: HWND hwndLB = GetWindow(hwnd, GW_CHILD);
655: INT nIndex;
656: DWORD dwData;
657: NET_API_STATUS nas = 0;
658:
659: PunchTimer(FALSE);
660: nIndex = ListBox_GetCurSel(hwndLB);
661: dwData = ListBox_GetItemData(hwndLB, nIndex);
662: if((nIndex == LB_ERR) || (dwData == LB_ERR) || !dwData)
663: goto err;
664:
665: if((wAction == VK_RETURN) || (wAction == VK_DELETE))
666: {
667: switch(((LBDATA *)dwData)->dwType)
668: {
669: case LBITEM_FILE:
670: nas = DisplayFileDetails(hwnd, (LBDATA *)dwData, wAction);
671: break;
672:
673: case LBITEM_SHARE:
674: nas = DisplayShareDetails(hwnd, (LBDATA *)dwData, wAction);
675: break;
676:
677: case LBITEM_USER:
678: nas = DisplayUserDetails(hwnd, (LBDATA *)dwData, wAction);
679: break;
680: }
681: }
682:
683: err:
684: if(nas)
685: {
686: TCHAR *szErrMessage;
687:
688: if(szErrMessage = GetSystemErrMessage(nas))
689: {
690: MessageBox(hwnd, szErrMessage, szAppName, MB_ICONEXCLAMATION);
691: LocalFree((HLOCAL)szErrMessage);
692: }
693: }
694:
695: PunchTimer(TRUE);
696: if(nas || (wAction == VK_DELETE))
697: PostMessage(hwnd, WM_TIMER, 0, 0L);
698: }
699:
700: void
701: AddErrorStringToLB(NET_API_STATUS nas)
702: {
703: TCHAR *szErrMessage;
704:
705: if(nas & FILE_ENUM_ERROR)
706: wsprintf(szBuffer, szFmtLB[LBITEM_DENIED], szFromIDS1(IDS_ERRENUMFILES));
707: else
708: wsprintf(szBuffer, szFmtLB[LBITEM_DENIED], szFromIDS1(IDS_ERRENUMUSERS));
709:
710: if(szErrMessage = GetSystemErrMessage(nas))
711: {
712: lstrcat(szBuffer, TEXT(": "));
713: lstrcat(szBuffer, szErrMessage);
714: LocalFree((HLOCAL)szErrMessage);
715: }
716:
717: ListBox_InsertString(GetWindow(hwndMain, GW_CHILD), 0, szBuffer);
718: ListBox_SetItemData(GetWindow(hwndMain, GW_CHILD), 0, 0);
719: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.