From 909255d55f7c7e4884a33c932fb4665b5cf944e9 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sun, 29 Sep 2019 14:44:22 +0200 Subject: Windows: Use periodic update of connected devices only if there is a Favorite that uses VolumeID. Add command option to disable the period update of devices. --- src/Common/Dlgcode.c | 5 +- src/Common/Dlgcode.h | 3 ++ src/Mount/Favorites.cpp | 125 ++++++++++++++++++++++++++++++------------------ src/Mount/Mount.c | 23 +++++---- 4 files changed, 101 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 66a22a26..495d32bf 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -188,6 +188,9 @@ BOOL MountVolumesAsSystemFavorite = FALSE; BOOL FavoriteMountOnArrivalInProgress = FALSE; BOOL MultipleMountOperationInProgress = FALSE; +volatile BOOL NeedPeriodicDeviceListUpdate = FALSE; +BOOL DisablePeriodicDeviceListUpdate = FALSE; + BOOL WaitDialogDisplaying = FALSE; /* Handle to the device driver */ @@ -12530,7 +12533,7 @@ wstring FindDeviceByVolumeID (const BYTE volumeID [VOLUME_ID_SIZE], BOOL bFromSe /* not mounted. Look for it in the local drives*/ - if (bFromService) + if (bFromService || !NeedPeriodicDeviceListUpdate) { for (int devNumber = 0; devNumber < MAX_HOST_DRIVE_NUMBER; devNumber++) { diff --git a/src/Common/Dlgcode.h b/src/Common/Dlgcode.h index 5ff97af1..3df68227 100644 --- a/src/Common/Dlgcode.h +++ b/src/Common/Dlgcode.h @@ -165,6 +165,9 @@ extern BOOL MountVolumesAsSystemFavorite; extern BOOL FavoriteMountOnArrivalInProgress; extern BOOL MultipleMountOperationInProgress; +extern volatile BOOL NeedPeriodicDeviceListUpdate; +extern BOOL DisablePeriodicDeviceListUpdate; + #ifndef SETUP extern BOOL bLanguageSetInSetup; #endif diff --git a/src/Mount/Favorites.cpp b/src/Mount/Favorites.cpp index 284c0b5c..eafc4734 100644 --- a/src/Mount/Favorites.cpp +++ b/src/Mount/Favorites.cpp @@ -243,76 +243,84 @@ namespace VeraCrypt switch (lw) { case IDOK: - - /* Global System Favorites settings */ - - if (SystemFavoritesMode) { - BootEncryption BootEncObj (NULL); + BOOL bInitialOptionValue = NeedPeriodicDeviceListUpdate; - if (BootEncObj.GetStatus().DriveMounted) + /* Global System Favorites settings */ + + if (SystemFavoritesMode) { - try - { - uint32 reqConfig = IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT) ? TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES : 0; - if (reqConfig != (ReadDriverConfigurationFlags() & TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES)) - BootEncObj.SetDriverConfigurationFlag (TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES, reqConfig ? true : false); + BootEncryption BootEncObj (NULL); - SetDriverConfigurationFlag (TC_DRIVER_CONFIG_DISABLE_NONADMIN_SYS_FAVORITES_ACCESS, IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY)); - } - catch (Exception &e) + if (BootEncObj.GetStatus().DriveMounted) { - e.Show (hwndDlg); + try + { + uint32 reqConfig = IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT) ? TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES : 0; + if (reqConfig != (ReadDriverConfigurationFlags() & TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES)) + BootEncObj.SetDriverConfigurationFlag (TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES, reqConfig ? true : false); + + SetDriverConfigurationFlag (TC_DRIVER_CONFIG_DISABLE_NONADMIN_SYS_FAVORITES_ACCESS, IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_DISABLE_HOTKEY)); + } + catch (Exception &e) + { + e.Show (hwndDlg); + } } } - } - /* (System) Favorites list */ + /* (System) Favorites list */ - if (SelectedItem != -1 && !Favorites.empty()) - SetFavoriteVolume (hwndDlg, Favorites[SelectedItem], SystemFavoritesMode); + if (SelectedItem != -1 && !Favorites.empty()) + SetFavoriteVolume (hwndDlg, Favorites[SelectedItem], SystemFavoritesMode); - if (SaveFavoriteVolumes (hwndDlg, Favorites, SystemFavoritesMode)) - { - if (!SystemFavoritesMode) + if (SaveFavoriteVolumes (hwndDlg, Favorites, SystemFavoritesMode)) { - bMountFavoritesOnLogon = FALSE; - - foreach (const FavoriteVolume &favorite, Favorites) + if (!SystemFavoritesMode) { - if (favorite.MountOnLogOn) + bMountFavoritesOnLogon = FALSE; + + foreach (const FavoriteVolume &favorite, Favorites) { - bMountFavoritesOnLogon = TRUE; - break; + if (favorite.MountOnLogOn) + { + bMountFavoritesOnLogon = TRUE; + break; + } } - } - if (!bEnableBkgTask || bCloseBkgTaskWhenNoVolumes || IsNonInstallMode()) - { - foreach (const FavoriteVolume favorite, Favorites) + if (!bEnableBkgTask || bCloseBkgTaskWhenNoVolumes || IsNonInstallMode()) { - if (favorite.MountOnArrival) + foreach (const FavoriteVolume favorite, Favorites) { - Warning ("FAVORITE_ARRIVAL_MOUNT_BACKGROUND_TASK_ERR", hwndDlg); - break; + if (favorite.MountOnArrival) + { + Warning ("FAVORITE_ARRIVAL_MOUNT_BACKGROUND_TASK_ERR", hwndDlg); + break; + } } } - } - FavoriteVolumes = Favorites; + if (!bInitialOptionValue && NeedPeriodicDeviceListUpdate) + { + // a favorite was set to use VolumeID. We update the list of devices available for mounting as early as possible + UpdateMountableHostDeviceList (); + } - ManageStartupSeq(); - SaveSettings (hwndDlg); - } - else - SystemFavoriteVolumes = Favorites; + FavoriteVolumes = Favorites; - OnFavoriteVolumesUpdated(); - LoadDriveLetters (hwndDlg, GetDlgItem (MainDlg, IDC_DRIVELIST), 0); + ManageStartupSeq(); + SaveSettings (hwndDlg); + } + else + SystemFavoriteVolumes = Favorites; - EndDialog (hwndDlg, IDOK); - } + OnFavoriteVolumesUpdated(); + LoadDriveLetters (hwndDlg, GetDlgItem (MainDlg, IDC_DRIVELIST), 0); + EndDialog (hwndDlg, IDOK); + } + } return 1; case IDCANCEL: @@ -554,6 +562,7 @@ namespace VeraCrypt void LoadFavoriteVolumes (vector &favorites, bool systemFavorites, bool noUacElevation) { + bool bVolumeIdInUse = false; favorites.clear(); wstring favoritesFilePath = systemFavorites ? GetServiceConfigPath (TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES, false) : GetConfigPath (TC_APPD_FILENAME_FAVORITE_VOLUMES); @@ -701,10 +710,21 @@ namespace VeraCrypt favorite.Pkcs5 = -1; } + if (!systemFavorites && favorite.UseVolumeID) + bVolumeIdInUse = true; + favorites.push_back (favorite); xml++; } + if (!systemFavorites) + { + if (bVolumeIdInUse && !DisablePeriodicDeviceListUpdate) + NeedPeriodicDeviceListUpdate = TRUE; + else + NeedPeriodicDeviceListUpdate = FALSE; + } + free (favoritesXml); } @@ -763,6 +783,7 @@ namespace VeraCrypt { FILE *f; int cnt = 0; + bool bVolumeIdInUse = false; f = _wfopen (GetConfigPath (systemFavorites ? TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES : TC_APPD_FILENAME_FAVORITE_VOLUMES), L"w,ccs=UTF-8"); if (f == NULL) @@ -827,7 +848,11 @@ namespace VeraCrypt s += L" useLabelInExplorer=\"1\""; if (favorite.UseVolumeID && !IsRepeatedByteArray (0, favorite.VolumeID, sizeof (favorite.VolumeID))) + { s += L" useVolumeID=\"1\""; + if (!systemFavorites) + bVolumeIdInUse = true; + } s += L">" + wstring (tq) + L""; @@ -838,6 +863,14 @@ namespace VeraCrypt fputws (L"\n\t", f); XmlWriteFooter (f); + if (!systemFavorites) + { + if (bVolumeIdInUse && !DisablePeriodicDeviceListUpdate) + NeedPeriodicDeviceListUpdate = TRUE; + else + NeedPeriodicDeviceListUpdate = FALSE; + } + if (!CheckFileStreamWriteErrors (hwndDlg, f, systemFavorites ? TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES : TC_APPD_FILENAME_FAVORITE_VOLUMES)) { fclose (f); diff --git a/src/Mount/Mount.c b/src/Mount/Mount.c index dd437090..ed57a617 100644 --- a/src/Mount/Mount.c +++ b/src/Mount/Mount.c @@ -512,8 +512,11 @@ static void InitMainDialog (HWND hwndDlg) e.Show (NULL); } - // initialize the list of devices available for mounting as early as possible - UpdateMountableHostDeviceList (); + if (NeedPeriodicDeviceListUpdate) + { + // initialize the list of devices available for mounting as early as possible + UpdateMountableHostDeviceList (); + } if (Silent) LoadDriveLetters (hwndDlg, NULL, 0); @@ -7337,7 +7340,8 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa { if (wParam == TIMER_ID_UPDATE_DEVICE_LIST) { - UpdateMountableHostDeviceList (); + if (NeedPeriodicDeviceListUpdate) + UpdateMountableHostDeviceList (); } else { @@ -8873,6 +8877,7 @@ void ExtractCommandLine (HWND hwndDlg, wchar_t *lpszCommandLine) OptionTryEmptyPassword, OptionNoWaitDlg, OptionSecureDesktop, + OptionDisableDeviceUpdate, }; argument args[]= @@ -8901,6 +8906,7 @@ void ExtractCommandLine (HWND hwndDlg, wchar_t *lpszCommandLine) { OptionTryEmptyPassword, L"/tryemptypass", NULL, FALSE }, { OptionNoWaitDlg, L"/nowaitdlg", NULL, FALSE }, { OptionSecureDesktop, L"/secureDesktop", NULL, FALSE }, + { OptionDisableDeviceUpdate, L"/disableDeviceUpdate", NULL, FALSE }, }; argumentspec as; @@ -8991,6 +8997,12 @@ void ExtractCommandLine (HWND hwndDlg, wchar_t *lpszCommandLine) } break; + case OptionDisableDeviceUpdate: + { + DisablePeriodicDeviceListUpdate = TRUE; + } + break; + case OptionCache: { wchar_t szTmp[16] = {0}; @@ -9530,8 +9542,6 @@ static VOID WINAPI SystemFavoritesServiceMain (DWORD argc, LPTSTR *argv) SystemFavoritesServiceSetStatus (SERVICE_START_PENDING, 120000); SystemFavoritesServiceLogInfo (wstring (L"Initializing list of host devices")); - // initialize the list of devices available for mounting as early as possible - UpdateMountableHostDeviceList (); SystemFavoritesServiceLogInfo (wstring (L"Starting System Favorites mounting process")); @@ -10112,9 +10122,6 @@ BOOL MountFavoriteVolumes (HWND hwnd, BOOL systemFavorites, BOOL logOnMount, BOO { Sleep (5000); - SystemFavoritesServiceLogInfo (wstring (L"Updating list of host devices")); - UpdateMountableHostDeviceList (); - SystemFavoritesServiceLogInfo (wstring (L"Trying to mount skipped system favorites")); // Update the service status to avoid being killed -- cgit v1.2.3