|
|
1.1 root 1: /*
2: Copyright (c) 2010 TrueCrypt Developers Association. All rights reserved.
3:
4: Governed by the TrueCrypt License 3.0 the full text of which is contained in
5: the file License.txt included in TrueCrypt binary and source code distribution
6: packages.
7: */
8:
9: #include "Tcdefs.h"
10: #include "Platform/Finally.h"
11: #include "Platform/ForEach.h"
12: #include "BootEncryption.h"
13: #include "Dlgcode.h"
14: #include "Language.h"
15: #include "Mount.h"
16: #include "Resource.h"
17: #include "Xml.h"
18: #include "Favorites.h"
19:
20: using namespace std;
21:
22: namespace TrueCrypt
23: {
24: vector <FavoriteVolume> FavoriteVolumes;
25: vector <FavoriteVolume> SystemFavoriteVolumes;
26: list <FavoriteVolume> FavoritesOnArrivalMountRequired;
27: list <FavoriteVolume> FavoritesMountedOnArrivalStillConnected;
28: HMENU FavoriteVolumesMenu;
29:
30:
31: BOOL AddMountedVolumeToFavorites (HWND hwndDlg, int driveNo, bool systemFavorites)
32: {
33: VOLUME_PROPERTIES_STRUCT prop;
34: DWORD bytesReturned;
35:
36: memset (&prop, 0, sizeof (prop));
37: prop.driveNo = driveNo;
38:
39: if (!DeviceIoControl (hDriver, TC_IOCTL_GET_VOLUME_PROPERTIES, &prop, sizeof (prop), &prop, sizeof (prop), &bytesReturned, NULL))
40: {
41: handleWin32Error (hwndDlg);
42: return FALSE;
43: }
44:
45: FavoriteVolume favorite;
46: favorite.MountPoint = "X:\\";
47: favorite.MountPoint[0] = (char) (prop.driveNo + 'A');
48:
49: favorite.Path = WideToSingleString ((wchar_t *) prop.wszVolume);
50: if (favorite.Path.find ("\\??\\") == 0)
51: favorite.Path = favorite.Path.substr (4);
52:
53: if (IsVolumeDeviceHosted (favorite.Path.c_str()))
54: {
55: // Get GUID path
56: string volumeDevPath = favorite.Path;
57:
58: wchar_t resolvedVolumeDevPath[TC_MAX_PATH];
59: if (ResolveSymbolicLink (SingleStringToWide (volumeDevPath).c_str(), resolvedVolumeDevPath))
60: volumeDevPath = WideToSingleString (resolvedVolumeDevPath);
61:
62: char volumeName[TC_MAX_PATH];
63: HANDLE find = FindFirstVolume (volumeName, sizeof (volumeName));
64:
65: if (find != INVALID_HANDLE_VALUE)
66: {
67: do
68: {
69: char findVolumeDevPath[TC_MAX_PATH];
70: string vn = volumeName;
71:
72: if (QueryDosDevice (vn.substr (4, vn.size() - 5).c_str(), findVolumeDevPath, sizeof (findVolumeDevPath)) != 0
73: && volumeDevPath == findVolumeDevPath)
74: {
75: favorite.VolumePathId = volumeName;
76: break;
77: }
78:
79: } while (FindNextVolume (find, volumeName, sizeof (volumeName)));
80:
81: FindVolumeClose (find);
82: }
83: }
84:
85: favorite.ReadOnly = prop.readOnly ? true : false;
86: favorite.Removable = prop.removable ? true : false;
87: favorite.SystemEncryption = prop.partitionInInactiveSysEncScope ? true : false;
88: favorite.OpenExplorerWindow = (bExplore == TRUE);
89:
90: return OrganizeFavoriteVolumes (hwndDlg, systemFavorites, favorite);
91: }
92:
93:
94: static BOOL CALLBACK FavoriteVolumesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
95: {
96: /* This dialog is used both for System Favorites and non-system Favorites.
97:
98: The following options have different meaning in System Favorites mode:
99:
100: IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT => MOUNT_SYSTEM_FAVORITES_ON_BOOT
101: IDC_FAVORITE_DISABLE_HOTKEY => DISABLE_NONADMIN_SYS_FAVORITES_ACCESS
102:
103: */
104:
105: WORD lw = LOWORD (wParam);
106: static bool SystemFavoritesMode;
107: static vector <FavoriteVolume> Favorites;
108: static int SelectedItem;
109: static HWND FavoriteListControl;
110:
111: switch (msg)
112: {
113: case WM_INITDIALOG:
114: {
115: try
116: {
117: FavoriteListControl = GetDlgItem (hwndDlg, IDC_FAVORITE_VOLUMES_LIST);
118:
119: FavoriteVolumesDlgProcArguments *args = (FavoriteVolumesDlgProcArguments *) lParam;
120: SystemFavoritesMode = args->SystemFavorites;
121:
122: if (SystemFavoritesMode)
123: {
124: RECT rec;
125:
126: BootEncryptionStatus bootEncStatus = BootEncryption (hwndDlg).GetStatus();
127:
128: if (!bootEncStatus.DriveMounted)
129: throw ErrorException ("SYS_FAVORITES_REQUIRE_PBA");
130:
131: ShowWindow (GetDlgItem(hwndDlg, IDC_FAVORITE_MOUNT_ON_LOGON), SW_HIDE);
132: ShowWindow (GetDlgItem(hwndDlg, IDC_FAVORITE_MOUNT_ON_ARRIVAL), SW_HIDE);
133:
134: // MOUNT_SYSTEM_FAVORITES_ON_BOOT
135:
136: SetWindowTextW (GetDlgItem (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT), GetString ("MOUNT_SYSTEM_FAVORITES_ON_BOOT"));
137:
138: // DISABLE_NONADMIN_SYS_FAVORITES_ACCESS
139:
140: SetWindowTextW (GetDlgItem (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY), GetString ("DISABLE_NONADMIN_SYS_FAVORITES_ACCESS"));
141:
142: // Group box
143:
144: GetClientRect (GetDlgItem (hwndDlg, IDC_FAV_VOL_OPTIONS_GROUP_BOX), &rec);
145:
146: SetWindowPos (GetDlgItem (hwndDlg, IDC_FAV_VOL_OPTIONS_GROUP_BOX), 0, 0, 0,
147: rec.right,
148: rec.bottom - CompensateYDPI (90),
149: SWP_NOMOVE | SWP_NOZORDER);
150:
151: InvalidateRect (GetDlgItem (hwndDlg, IDC_FAV_VOL_OPTIONS_GROUP_BOX), NULL, TRUE);
152: }
153: else
154: {
155: ShowWindow (GetDlgItem(hwndDlg, IDC_FAV_VOL_OPTIONS_GLOBAL_SETTINGS_BOX), SW_HIDE);
156: }
157:
158: LocalizeDialog (hwndDlg, SystemFavoritesMode ? "SYSTEM_FAVORITES_DLG_TITLE" : "IDD_FAVORITE_VOLUMES");
159: Favorites.clear();
160:
161: LVCOLUMNW column;
162: SendMessageW (FavoriteListControl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
163:
164: memset (&column, 0, sizeof (column));
165: column.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM|LVCF_FMT;
166: column.pszText = GetString ("DRIVE");
167: column.cx = CompensateXDPI (38);
168: column.fmt = LVCFMT_CENTER;
169: SendMessageW (FavoriteListControl, LVM_INSERTCOLUMNW, 1, (LPARAM) &column);
170:
171: ++column.iSubItem;
172: column.fmt = LVCFMT_LEFT;
173: column.pszText = GetString ("LABEL");
174: column.cx = CompensateXDPI (160);
175: SendMessageW (FavoriteListControl, LVM_INSERTCOLUMNW, 2, (LPARAM) &column);
176:
177: ++column.iSubItem;
178: column.fmt = LVCFMT_LEFT;
179: column.pszText = GetString ("VOLUME");
180: column.cx = CompensateXDPI (330);
181: SendMessageW (FavoriteListControl, LVM_INSERTCOLUMNW, 3, (LPARAM) &column);
182:
183: SetControls (hwndDlg, FavoriteVolume(), SystemFavoritesMode, false);
184:
185: if (SystemFavoritesMode)
186: LoadFavoriteVolumes (Favorites, true);
187: else
188: Favorites = FavoriteVolumes;
189:
190: if (args->AddFavoriteVolume)
191: Favorites.push_back (args->NewFavoriteVolume);
192:
193: FillListControl (FavoriteListControl, Favorites);
194:
195: SelectedItem = -1;
196:
197: if (args->AddFavoriteVolume)
198: {
199: ListView_SetItemState (FavoriteListControl, Favorites.size() - 1, LVIS_SELECTED, LVIS_SELECTED);
200: ListView_EnsureVisible (FavoriteListControl, Favorites.size() - 1, FALSE);
201: }
202:
203: if (SystemFavoritesMode)
204: SetDlgItemTextW (hwndDlg, IDC_FAVORITES_HELP_LINK, GetString ("SYS_FAVORITES_HELP_LINK"));
205:
206: ToHyperlink (hwndDlg, IDC_FAVORITES_HELP_LINK);
207: }
208: catch (Exception &e)
209: {
210: e.Show (hwndDlg);
211: EndDialog (hwndDlg, IDCLOSE);
212: }
213: }
214: return 1;
215:
216: case WM_COMMAND:
217:
218: switch (lw)
219: {
220: case IDOK:
221:
222: /* Global System Favorites settings */
223:
224: if (SystemFavoritesMode)
225: {
226: BootEncryption BootEncObj (NULL);
227:
228: if (BootEncObj.GetStatus().DriveMounted)
229: {
230: try
231: {
232: uint32 reqConfig = IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT) ? TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES : 0;
233: if (reqConfig != (ReadDriverConfigurationFlags() & TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES))
234: BootEncObj.RegisterSystemFavoritesService (reqConfig ? TRUE : FALSE);
235:
236: SetDriverConfigurationFlag (TC_DRIVER_CONFIG_DISABLE_NONADMIN_SYS_FAVORITES_ACCESS, IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY));
237: }
238: catch (Exception &e)
239: {
240: e.Show (hwndDlg);
241: }
242: }
243: }
244:
245: /* (System) Favorites list */
246:
247: if (SelectedItem != -1 && !Favorites.empty())
248: SetFavoriteVolume (hwndDlg, Favorites[SelectedItem], SystemFavoritesMode);
249:
250: if (SaveFavoriteVolumes (Favorites, SystemFavoritesMode))
251: {
252: if (!SystemFavoritesMode)
253: {
254: bMountFavoritesOnLogon = FALSE;
255:
256: foreach (const FavoriteVolume &favorite, Favorites)
257: {
258: if (favorite.MountOnLogOn)
259: {
260: bMountFavoritesOnLogon = TRUE;
261: break;
262: }
263: }
264:
265: if (!bEnableBkgTask || bCloseBkgTaskWhenNoVolumes || IsNonInstallMode())
266: {
267: foreach (const FavoriteVolume favorite, Favorites)
268: {
269: if (favorite.MountOnArrival)
270: {
271: Warning ("FAVORITE_ARRIVAL_MOUNT_BACKGROUND_TASK_ERR");
272: break;
273: }
274: }
275: }
276:
277: FavoriteVolumes = Favorites;
278:
279: ManageStartupSeq();
280: SaveSettings (hwndDlg);
281: }
282: else
283: SystemFavoriteVolumes = Favorites;
284:
285: OnFavoriteVolumesUpdated();
286: LoadDriveLetters (GetDlgItem (MainDlg, IDC_DRIVELIST), 0);
287:
288: EndDialog (hwndDlg, IDOK);
289: }
290:
291: return 1;
292:
293: case IDCANCEL:
294: EndDialog (hwndDlg, IDCLOSE);
295: return 1;
296:
297: case IDC_FAVORITE_MOVE_DOWN:
298: if (SelectedItem != -1 && Favorites.size() > (size_t) SelectedItem + 1)
299: {
300: swap (Favorites[SelectedItem], Favorites[SelectedItem + 1]);
301:
302: FillListControl (FavoriteListControl, Favorites);
303: ++SelectedItem;
304: ListView_SetItemState (FavoriteListControl, SelectedItem, LVIS_SELECTED, LVIS_SELECTED);
305: ListView_EnsureVisible (FavoriteListControl, SelectedItem, FALSE);
306: }
307: return 1;
308:
309: case IDC_FAVORITE_MOVE_UP:
310: if (SelectedItem > 0)
311: {
312: swap (Favorites[SelectedItem], Favorites[SelectedItem - 1]);
313:
314: FillListControl (FavoriteListControl, Favorites);
315: --SelectedItem;
316: ListView_SetItemState (FavoriteListControl, SelectedItem, LVIS_SELECTED, LVIS_SELECTED);
317: ListView_EnsureVisible (FavoriteListControl, SelectedItem, FALSE);
318: }
319: return 1;
320:
321: case IDC_FAVORITE_REMOVE:
322: if (SelectedItem != -1)
323: {
324: Favorites.erase (Favorites.begin() + SelectedItem);
325: FillListControl (GetDlgItem (hwndDlg, IDC_FAVORITE_VOLUMES_LIST), Favorites);
326: SetControls (hwndDlg, FavoriteVolume(), SystemFavoritesMode, false);
327: SelectedItem = -1;
328: }
329: return 1;
330:
331:
332: case IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT: // Note that this option means "MOUNT_SYSTEM_FAVORITES_ON_BOOT" when SystemFavoritesMode is true
333: if (SystemFavoritesMode)
334: {
335: // MOUNT_SYSTEM_FAVORITES_ON_BOOT
336:
337: if (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT))
338: {
339: WarningDirect ((wstring (GetString ("SYS_FAVORITES_KEYBOARD_WARNING")) + L"\n\n" + GetString ("BOOT_PASSWORD_CACHE_KEYBOARD_WARNING")).c_str());
340:
341: if (!IsServerOS() && !IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY))
342: Info ("SYS_FAVORITES_ADMIN_ONLY_INFO");
343: }
344: }
345: return 1;
346:
347: case IDC_FAVORITE_DISABLE_HOTKEY: // Note that this option means "DISABLE_NONADMIN_SYS_FAVORITES_ACCESS" when SystemFavoritesMode is true
348: if (SystemFavoritesMode)
349: {
350: // DISABLE_NONADMIN_SYS_FAVORITES_ACCESS
351:
352: if (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY))
353: WarningDirect ((wstring (GetString ("SYS_FAVORITES_ADMIN_ONLY_WARNING")) + L"\n\n" + GetString ("SETTING_REQUIRES_REBOOT")).c_str());
354: else
355: Warning ("SETTING_REQUIRES_REBOOT");
356: }
357: return 1;
358:
359: case IDC_FAVORITES_HELP_LINK:
360: Applink (SystemFavoritesMode ? "sysfavorites" : "favorites", TRUE, "");
361: return 1;
362: }
363:
364: return 0;
365:
366: case WM_NOTIFY:
367: if (((LPNMHDR) lParam)->code == LVN_ITEMCHANGED)
368: {
369: static bool reentry = false;
370: if (reentry)
371: break;
372:
373: reentry = true;
374:
375: if (SelectedItem != -1)
376: {
377: SetFavoriteVolume (hwndDlg, Favorites[SelectedItem], SystemFavoritesMode);
378: FillListControlSubItems (FavoriteListControl, SelectedItem, Favorites[SelectedItem]);
379: }
380:
381: SelectedItem = ListView_GetNextItem (GetDlgItem (hwndDlg, IDC_FAVORITE_VOLUMES_LIST), -1, LVIS_SELECTED);
382:
383: if (SelectedItem != -1)
384: SetControls (hwndDlg, Favorites[SelectedItem], SystemFavoritesMode);
385: else
386: SetControls (hwndDlg, FavoriteVolume(), SystemFavoritesMode, false);
387:
388: reentry = false;
389: return 1;
390: }
391: break;
392:
393: case WM_CLOSE:
394: EndDialog (hwndDlg, IDCLOSE);
395: return 1;
396: }
397:
398: return 0;
399: }
400:
401:
402: static void FillFavoriteVolumesMenu ()
403: {
404: while (DeleteMenu (FavoriteVolumesMenu, 7, MF_BYPOSITION)) { }
405:
406: if (FavoriteVolumes.empty())
407: return;
408:
409: AppendMenu (FavoriteVolumesMenu, MF_SEPARATOR, 0, NULL);
410:
411: int i = 0;
412: foreach (const FavoriteVolume &favorite, FavoriteVolumes)
413: {
414: UINT flags = MF_STRING;
415:
416: if (favorite.DisconnectedDevice)
417: flags |= MF_GRAYED;
418:
419: wstring menuText = SingleStringToWide (favorite.Path);
420: if (favorite.DisconnectedDevice)
421: menuText = wstring (L"(") + GetString ("FAVORITE_DISCONNECTED_DEV") + L")";
422:
423: if (!favorite.Label.empty())
424: {
425: if (favorite.DisconnectedDevice)
426: menuText = favorite.Label + L" " + menuText;
427: else
428: menuText = favorite.Label;
429: }
430:
431: AppendMenuW (FavoriteVolumesMenu, flags, TC_FAVORITE_MENU_CMD_ID_OFFSET + i++,
432: (menuText + L"\t" + SingleStringToWide (favorite.MountPoint).substr (0, 2)).c_str());
433: }
434: }
435:
436:
437: static void FillListControl (HWND favoriteListControl, vector <FavoriteVolume> &favorites)
438: {
439: SendMessage (favoriteListControl, LVM_DELETEALLITEMS, 0, 0);
440:
441: int line = 0;
442: foreach (const FavoriteVolume favorite, favorites)
443: {
444: ListItemAdd (favoriteListControl, line, (char *) favorite.MountPoint.substr (0, 2).c_str());
445: FillListControlSubItems (favoriteListControl, line++, favorite);
446: }
447: }
448:
449:
450: static void FillListControlSubItems (HWND FavoriteListControl, int line, const FavoriteVolume &favorite)
451: {
452: ListSubItemSetW (FavoriteListControl, line, 1, (wchar_t *) favorite.Label.c_str());
453:
454: if (favorite.DisconnectedDevice)
455: ListSubItemSetW (FavoriteListControl, line, 2, (wchar_t *) (wstring (L"(") + GetString ("FAVORITE_DISCONNECTED_DEV") + L")").c_str());
456: else
457: ListSubItemSet (FavoriteListControl, line, 2, (char *) favorite.Path.c_str());
458: }
459:
460:
461: wstring GetFavoriteVolumeLabel (const string &volumePath)
462: {
463: foreach (const FavoriteVolume &favorite, FavoriteVolumes)
464: {
465: if (favorite.Path == volumePath)
466: return favorite.Label;
467: }
468:
469: foreach (const FavoriteVolume &favorite, SystemFavoriteVolumes)
470: {
471: if (favorite.Path == volumePath)
472: return favorite.Label;
473: }
474:
475: return wstring();
476: }
477:
478:
479: void LoadFavoriteVolumes ()
480: {
481: LoadFavoriteVolumes (FavoriteVolumes, false);
482:
483: try
484: {
485: LoadFavoriteVolumes (SystemFavoriteVolumes, true, true);
486: }
487: catch (...) { } // Ignore errors as SystemFavoriteVolumes list is used only for resolving volume paths to labels
488:
489: OnFavoriteVolumesUpdated();
490: }
491:
492:
493: void LoadFavoriteVolumes (vector <FavoriteVolume> &favorites, bool systemFavorites, bool noUacElevation)
494: {
495: favorites.clear();
496: string favoritesFilePath = systemFavorites ? GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES) : GetConfigPath (TC_APPD_FILENAME_FAVORITE_VOLUMES);
497:
498: if (systemFavorites && !IsAdmin() && !noUacElevation)
499: {
500: favoritesFilePath = GetConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES);
501:
502: try
503: {
504: BootEncryption bootEnc (MainDlg);
505: bootEnc.CopyFileAdmin (GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES).c_str(), favoritesFilePath.c_str());
506: }
507: catch (SystemException &e)
508: {
509: if (e.ErrorCode == ERROR_FILE_NOT_FOUND)
510: return;
511:
512: throw;
513: }
514: }
515:
516: DWORD size;
517: char *favoritesXml = LoadFile (favoritesFilePath.c_str(), &size);
518:
519: if (systemFavorites && !IsAdmin() && !noUacElevation)
520: DeleteFile (GetConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES));
521:
522: char *xml = favoritesXml;
523: char mountPoint[MAX_PATH], volume[MAX_PATH];
524:
525: if (xml == NULL)
526: return;
527:
528: while (xml = XmlFindElement (xml, "volume"))
529: {
530: FavoriteVolume favorite;
531:
532: XmlGetAttributeText (xml, "mountpoint", mountPoint, sizeof (mountPoint));
533: favorite.MountPoint = mountPoint;
534:
535: XmlGetNodeText (xml, volume, sizeof (volume));
536: favorite.Path = volume;
537:
538: char label[1024];
539: XmlGetAttributeText (xml, "label", label, sizeof (label));
540: favorite.Label = Utf8StringToWide (label);
541:
542: char boolVal[2];
543: XmlGetAttributeText (xml, "readonly", boolVal, sizeof (boolVal));
544: if (boolVal[0])
545: favorite.ReadOnly = (boolVal[0] == '1');
546:
547: XmlGetAttributeText (xml, "removable", boolVal, sizeof (boolVal));
548: if (boolVal[0])
549: favorite.Removable = (boolVal[0] == '1');
550:
551: XmlGetAttributeText (xml, "system", boolVal, sizeof (boolVal));
552: if (boolVal[0])
553: favorite.SystemEncryption = (boolVal[0] == '1');
554:
555: XmlGetAttributeText (xml, "noHotKeyMount", boolVal, sizeof (boolVal));
556: if (boolVal[0])
557: favorite.DisableHotkeyMount = (boolVal[0] == '1');
558:
559: XmlGetAttributeText (xml, "openExplorerWindow", boolVal, sizeof (boolVal));
560: if (boolVal[0])
561: favorite.OpenExplorerWindow = (boolVal[0] == '1');
562:
563: XmlGetAttributeText (xml, "mountOnArrival", boolVal, sizeof (boolVal));
564: if (boolVal[0])
565: favorite.MountOnArrival = (boolVal[0] == '1');
566:
567: XmlGetAttributeText (xml, "mountOnLogOn", boolVal, sizeof (boolVal));
568: if (boolVal[0])
569: favorite.MountOnLogOn = (boolVal[0] == '1');
570:
571: if (favorite.Path.find ("\\\\?\\Volume{") == 0 && favorite.Path.rfind ("}\\") == favorite.Path.size() - 2)
572: {
573: string resolvedPath = VolumeGuidPathToDevicePath (favorite.Path);
574: if (!resolvedPath.empty())
575: {
576: favorite.DisconnectedDevice = false;
577: favorite.VolumePathId = favorite.Path;
578: favorite.Path = resolvedPath;
579: }
580: else
581: favorite.DisconnectedDevice = true;
582: }
583:
584: favorites.push_back (favorite);
585: xml++;
586: }
587:
588: free (favoritesXml);
589: }
590:
591:
592: static void OnFavoriteVolumesUpdated ()
593: {
594: FillFavoriteVolumesMenu();
595:
596: FavoritesOnArrivalMountRequired.clear();
597:
598: foreach (const FavoriteVolume favorite, FavoriteVolumes)
599: {
600: if (favorite.MountOnArrival)
601: {
602: FavoritesOnArrivalMountRequired.push_back (favorite);
603:
604: if (IsMountedVolume (favorite.Path.c_str()))
605: {
606: bool present = false;
607:
608: foreach (const FavoriteVolume favoriteConnected, FavoritesMountedOnArrivalStillConnected)
609: {
610: if (favorite.Path == favoriteConnected.Path)
611: {
612: present = true;
613: break;
614: }
615: }
616:
617: if (!present)
618: FavoritesMountedOnArrivalStillConnected.push_back (favorite);
619: }
620: }
621: }
622: }
623:
624:
625: BOOL OrganizeFavoriteVolumes (HWND hwndDlg, bool systemFavorites, const FavoriteVolume &newFavorite)
626: {
627: FavoriteVolumesDlgProcArguments args;
628: args.SystemFavorites = systemFavorites;
629:
630: if (!newFavorite.Path.empty())
631: {
632: args.AddFavoriteVolume = true;
633: args.NewFavoriteVolume = newFavorite;
634: }
635: else
636: args.AddFavoriteVolume = false;
637:
638: return DialogBoxParamW (hInst, MAKEINTRESOURCEW (IDD_FAVORITE_VOLUMES), hwndDlg, (DLGPROC) FavoriteVolumesDlgProc, (LPARAM) &args) == IDOK;
639: }
640:
641:
642: static bool SaveFavoriteVolumes (const vector <FavoriteVolume> &favorites, bool systemFavorites)
643: {
644: FILE *f;
645: int cnt = 0;
646:
647: f = fopen (GetConfigPath (systemFavorites ? TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES : TC_APPD_FILENAME_FAVORITE_VOLUMES), "w,ccs=UTF-8");
648: if (f == NULL)
649: {
650: handleWin32Error (MainDlg);
651: return false;
652: }
653:
654: XmlWriteHeaderW (f);
655: fputws (L"\n\t<favorites>", f);
656:
657: foreach (const FavoriteVolume &favorite, favorites)
658: {
659: char tq[2048];
660:
661: if (systemFavorites && favorite.Path.find ("\\\\") == 0 && favorite.Path.find ("Volume{") == string::npos)
662: Warning ("SYSTEM_FAVORITE_NETWORK_PATH_ERR");
663:
664: XmlQuoteText (!favorite.VolumePathId.empty() ? favorite.VolumePathId.c_str() : favorite.Path.c_str(), tq, sizeof (tq));
665:
666: wstring s = L"\n\t\t<volume mountpoint=\"" + SingleStringToWide (favorite.MountPoint) + L"\"";
667:
668: if (!favorite.Label.empty())
669: s += L" label=\"" + favorite.Label + L"\"";
670:
671: if (favorite.ReadOnly)
672: s += L" readonly=\"1\"";
673:
674: if (favorite.Removable)
675: s += L" removable=\"1\"";
676:
677: if (favorite.SystemEncryption)
678: s += L" system=\"1\"";
679:
680: if (favorite.MountOnArrival)
681: s += L" mountOnArrival=\"1\"";
682:
683: if (favorite.MountOnLogOn)
684: s += L" mountOnLogOn=\"1\"";
685:
686: if (favorite.DisableHotkeyMount)
687: s += L" noHotKeyMount=\"1\"";
688:
689: if (favorite.OpenExplorerWindow)
690: s += L" openExplorerWindow=\"1\"";
691:
692: s += L">" + SingleStringToWide (tq) + L"</volume>";
693:
694: fwprintf (f, L"%ws", s.c_str());
695: cnt++;
696: }
697:
698: fputws (L"\n\t</favorites>", f);
699: XmlWriteFooterW (f);
700:
701: if (!CheckFileStreamWriteErrors (f, systemFavorites ? TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES : TC_APPD_FILENAME_FAVORITE_VOLUMES))
702: {
703: fclose (f);
704: return false;
705: }
706:
707: fclose (f);
708:
709: BootEncryption bootEnc (MainDlg);
710:
711: if (systemFavorites)
712: {
713: finally_do ({ remove (GetConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES)); });
714:
715: try
716: {
717: bootEnc.DeleteFileAdmin (GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES).c_str());
718: }
719: catch (UserAbort&) { return false; }
720: catch (...) { }
721:
722: try
723: {
724: if (cnt != 0)
725: {
726: bootEnc.CopyFileAdmin (GetConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES), GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES).c_str());
727:
728: if (!(ReadDriverConfigurationFlags() & TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES))
729: Info ("SYS_FAVORITE_VOLUMES_SAVED");
730: }
731: }
732: catch (Exception &e)
733: {
734: e.Show (NULL);
735: }
736: }
737:
738: if (cnt == 0)
739: {
740: if (systemFavorites)
741: {
742: try
743: {
744: bootEnc.DeleteFileAdmin (GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES).c_str());
745: }
746: catch (...) { }
747: }
748: else
749: remove (GetConfigPath (TC_APPD_FILENAME_FAVORITE_VOLUMES));
750: }
751:
752: return true;
753: }
754:
755:
756: static void SetControls (HWND hwndDlg, const FavoriteVolume &favorite, bool systemFavoritesMode, bool enable)
757: {
758: SetDlgItemTextW (hwndDlg, IDC_FAVORITE_LABEL, favorite.Label.c_str());
759: SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_ON_LOGON, favorite.MountOnLogOn);
760: SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_ON_ARRIVAL, favorite.MountOnArrival);
761: SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_READONLY, favorite.ReadOnly);
762: SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_REMOVABLE, favorite.Removable);
763:
764: if (systemFavoritesMode)
765: {
766: uint32 driverConfig = ReadDriverConfigurationFlags();
767:
768: // MOUNT_SYSTEM_FAVORITES_ON_BOOT
769: CheckDlgButton (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT, (driverConfig & TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES) ? BST_CHECKED : BST_UNCHECKED);
770:
771: // DISABLE_NONADMIN_SYS_FAVORITES_ACCESS
772: CheckDlgButton (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY, (driverConfig & TC_DRIVER_CONFIG_DISABLE_NONADMIN_SYS_FAVORITES_ACCESS) ? BST_CHECKED : BST_UNCHECKED);
773: }
774: else
775: {
776: SetCheckBox (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT, favorite.OpenExplorerWindow);
777: SetCheckBox (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY, favorite.DisableHotkeyMount);
778: }
779:
780: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOVE_UP), enable);
781: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOVE_DOWN), enable);
782: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_REMOVE), enable);
783: EnableWindow (GetDlgItem (hwndDlg, IDT_FAVORITE_LABEL), enable);
784: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_LABEL), enable);
785: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_ON_LOGON), enable && !systemFavoritesMode);
786: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_ON_ARRIVAL), enable && !systemFavoritesMode);
787: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_READONLY), enable);
788: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_REMOVABLE), enable);
789: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT), enable || systemFavoritesMode);
790: EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY), enable || systemFavoritesMode);
791: }
792:
793:
794: static void SetFavoriteVolume (HWND hwndDlg, FavoriteVolume &favorite, bool systemFavoritesMode)
795: {
796: wchar_t label[1024];
797: if (GetDlgItemTextW (hwndDlg, IDC_FAVORITE_LABEL, label, ARRAYSIZE (label)) != 0)
798: favorite.Label = label;
799: else
800: favorite.Label.clear();
801:
802: favorite.ReadOnly = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_MOUNT_READONLY) != 0);
803: favorite.Removable = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_MOUNT_REMOVABLE) != 0);
804:
805: if (!systemFavoritesMode)
806: {
807: favorite.MountOnLogOn = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_MOUNT_ON_LOGON) != 0);
808: favorite.MountOnArrival = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_MOUNT_ON_ARRIVAL) != 0);
809: favorite.DisableHotkeyMount = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY) != 0);
810: favorite.OpenExplorerWindow = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT) != 0);
811: }
812:
813: if (favorite.VolumePathId.empty()
814: && IsVolumeDeviceHosted (favorite.Path.c_str())
815: && favorite.Path.find ("\\\\?\\Volume{") != 0)
816: {
817: if (!favorite.Label.empty())
818: {
819: ErrorDirect ((GetString ("FAVORITE_LABEL_DEVICE_PATH_ERR") + wstring (L"\n\n") + SingleStringToWide (favorite.Path)).c_str());
820: favorite.Label.clear();
821: }
822:
823: if (favorite.MountOnArrival)
824: {
825: ErrorDirect ((GetString ("FAVORITE_ARRIVAL_MOUNT_DEVICE_PATH_ERR") + wstring (L"\n\n") + SingleStringToWide (favorite.Path)).c_str());
826: favorite.MountOnArrival = false;
827: }
828: }
829:
830: if (favorite.MountOnArrival && favorite.Path.find ("\\\\") == 0 && favorite.Path.find ("Volume{") == string::npos)
831: {
832: Error ("FAVORITE_ARRIVAL_MOUNT_NETWORK_PATH_ERR");
833: favorite.MountOnArrival = false;
834: }
835: }
836:
837:
838: void UpdateDeviceHostedFavoriteVolumes ()
839: {
840: try
841: {
842: LoadFavoriteVolumes();
843: }
844: catch (Exception &e)
845: {
846: e.Show (MainDlg);
847: }
848: }
849: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.