|
|
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.