From ad3b8eca694ed4d7a0ff17f955736725aad0cea6 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Mon, 24 Aug 2015 01:31:30 +0200 Subject: Windows: Protect against using a container file as its own keyfile. Normalizing path names to never use '/' but always '\'. --- src/Common/Dlgcode.c | 10 +++++ src/Common/Dlgcode.h | 1 + src/Common/Keyfiles.c | 31 ++++++++++++--- src/Common/Keyfiles.h | 3 +- src/Common/Language.xml | 1 + src/ExpandVolume/DlgExpandVolume.cpp | 6 +-- src/ExpandVolume/WinMain.cpp | 8 ++-- src/Format/Tcformat.c | 4 +- src/Mount/Mount.c | 73 +++++++++++++++++++++++------------- 9 files changed, 96 insertions(+), 41 deletions(-) diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index abad5e70..ead50a73 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -6184,6 +6184,16 @@ BOOL CheckFileExtension (char *fileName) return FALSE; } +void CorrectFileName (char* fileName) +{ + /* replace '/' by '\' */ + size_t i, len = strlen (fileName); + for (i = 0; i < len; i++) + { + if (fileName [i] == '/') + fileName [i] = '\\'; + } +} void IncreaseWrongPwdRetryCount (int count) { diff --git a/src/Common/Dlgcode.h b/src/Common/Dlgcode.h index e3f73e07..fa7a2b38 100644 --- a/src/Common/Dlgcode.h +++ b/src/Common/Dlgcode.h @@ -328,6 +328,7 @@ static BOOL CALLBACK CloseVolumeExplorerWindowsEnum( HWND hwnd, LPARAM driveNo); BOOL CloseVolumeExplorerWindows (HWND hwnd, int driveNo); BOOL CheckCapsLock (HWND hwnd, BOOL quiet); BOOL CheckFileExtension (char *fileName); +void CorrectFileName (char* fileName); void IncreaseWrongPwdRetryCount (int count); void ResetWrongPwdRetryCount (void); BOOL WrongPwdRetryCountOverLimit (void); diff --git a/src/Common/Keyfiles.c b/src/Common/Keyfiles.c index 26973252..549ffe6e 100644 --- a/src/Common/Keyfiles.c +++ b/src/Common/Keyfiles.c @@ -222,7 +222,7 @@ close: } -BOOL KeyFilesApply (HWND hwndDlg, Password *password, KeyFile *firstKeyFile) +BOOL KeyFilesApply (HWND hwndDlg, Password *password, KeyFile *firstKeyFile, const char* volumeFileName) { BOOL status = TRUE; KeyFile kfSubStruct; @@ -322,7 +322,7 @@ BOOL KeyFilesApply (HWND hwndDlg, Password *password, KeyFile *firstKeyFile) StringCbPrintfA (kfSub->FileName, sizeof(kfSub->FileName), "%s%c%s", kf->FileName, '\\', fBuf.name - ); + ); // Determine whether it's a path or a file if (stat (kfSub->FileName, &statStruct) != 0) @@ -346,6 +346,13 @@ BOOL KeyFilesApply (HWND hwndDlg, Password *password, KeyFile *firstKeyFile) continue; } + CorrectFileName (kfSub->FileName); + if (volumeFileName && (_stricmp (volumeFileName, kfSub->FileName) == 0)) + { + // skip if it is the current container file name + continue; + } + ++keyfileCount; // Apply keyfile to the pool @@ -474,13 +481,25 @@ BOOL CALLBACK KeyFilesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPa { if (SelectMultipleFiles (hwndDlg, "SELECT_KEYFILE", kf->FileName, sizeof(kf->FileName),bHistory)) { + bool containerFileSkipped = false; do { - param->FirstKeyFile = KeyFileAdd (param->FirstKeyFile, kf); - LoadKeyList (hwndDlg, param->FirstKeyFile); - - kf = (KeyFile *) malloc (sizeof (KeyFile)); + CorrectFileName (kf->FileName); + if (_stricmp (param->VolumeFileName, kf->FileName) == 0) + containerFileSkipped = true; + else + { + param->FirstKeyFile = KeyFileAdd (param->FirstKeyFile, kf); + LoadKeyList (hwndDlg, param->FirstKeyFile); + + kf = (KeyFile *) malloc (sizeof (KeyFile)); + } } while (SelectMultipleFilesNext (kf->FileName, sizeof(kf->FileName))); + + if (containerFileSkipped) + { + Warning ("SELECTED_KEYFILE_IS_CONTAINER_FILE", hwndDlg); + } } free (kf); diff --git a/src/Common/Keyfiles.h b/src/Common/Keyfiles.h index 61ca83e6..8400ebc3 100644 --- a/src/Common/Keyfiles.h +++ b/src/Common/Keyfiles.h @@ -30,6 +30,7 @@ typedef struct KeyFileStruct typedef struct { + char VolumeFileName[MAX_PATH + 1]; BOOL EnableKeyFiles; KeyFile *FirstKeyFile; } KeyFilesDlgParam; @@ -38,7 +39,7 @@ KeyFile *KeyFileAdd (KeyFile *firstKeyFile, KeyFile *keyFile); void KeyFileRemoveAll (KeyFile **firstKeyFile); KeyFile *KeyFileClone (KeyFile *keyFile); KeyFile *KeyFileCloneAll (KeyFile *firstKeyFile); -BOOL KeyFilesApply (HWND hwndDlg, Password *password, KeyFile *firstKeyFile); +BOOL KeyFilesApply (HWND hwndDlg, Password *password, KeyFile *firstKeyFilem, const char* volumeFileName); BOOL CALLBACK KeyFilesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); BOOL KeyfilesPopupMenu (HWND hwndDlg, POINT popupPosition, KeyFilesDlgParam *dialogParam); diff --git a/src/Common/Language.xml b/src/Common/Language.xml index 558cc6d6..c47b1b84 100644 --- a/src/Common/Language.xml +++ b/src/Common/Language.xml @@ -647,6 +647,7 @@ Select Keyfile Select a keyfile search path. WARNING: Note that only the path will be remembered, not the filenames! Select a directory where to store the keyfiles. + The current container file was selected as a keyfile. It will be skipped. Designed by Ross Anderson, Eli Biham, and Lars Knudsen. Published in 1998. 256-bit key, 128-bit block. Mode of operation is XTS. Serpent was one of the AES finalists. Please specify the size of the container you want to create.\n\nIf you create a dynamic (sparse-file) container, this parameter will specify its maximum possible size.\n\nNote that the minimum possible size of a FAT volume is 292 KB. The minimum possible size of an NTFS volume is 3792 KB. Please specify the size of the outer volume to be created (you will first create the outer volume and then a hidden volume within it). The minimum possible size of a volume within which a hidden volume is intended to be created is 340 KB. diff --git a/src/ExpandVolume/DlgExpandVolume.cpp b/src/ExpandVolume/DlgExpandVolume.cpp index 1f623bef..267e859e 100644 --- a/src/ExpandVolume/DlgExpandVolume.cpp +++ b/src/ExpandVolume/DlgExpandVolume.cpp @@ -59,7 +59,7 @@ BOOL CALLBACK ExpandVolProgressDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, L namespace VeraCryptExpander { /* defined in WinMain.c, referenced by ExpandVolumeWizard() */ -int ExtcvAskVolumePassword (HWND hwndDlg, Password *password, int *pkcs5, int *pim, BOOL* truecryptMode, char *titleStringId, BOOL enableMountOptions); +int ExtcvAskVolumePassword (HWND hwndDlg, const char* fileName, Password *password, int *pkcs5, int *pim, BOOL* truecryptMode, char *titleStringId, BOOL enableMountOptions); } @@ -500,7 +500,7 @@ void ExpandVolumeWizard (HWND hwndDlg, char *lpszVolume) OpenVolumeContext expandVol; BOOL truecryptMode = FALSE; - if (!VeraCryptExpander::ExtcvAskVolumePassword (hwndDlg, &VolumePassword, &VolumePkcs5, &VolumePim, &truecryptMode, "ENTER_NORMAL_VOL_PASSWORD", FALSE)) + if (!VeraCryptExpander::ExtcvAskVolumePassword (hwndDlg, lpszVolume, &VolumePassword, &VolumePkcs5, &VolumePim, &truecryptMode, "ENTER_NORMAL_VOL_PASSWORD", FALSE)) { goto ret; } @@ -509,7 +509,7 @@ void ExpandVolumeWizard (HWND hwndDlg, char *lpszVolume) WaitCursor(); if (KeyFilesEnable && FirstKeyFile) - KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile, lpszVolume); WaitCursor (); diff --git a/src/ExpandVolume/WinMain.cpp b/src/ExpandVolume/WinMain.cpp index 6bf40477..e02db649 100644 --- a/src/ExpandVolume/WinMain.cpp +++ b/src/ExpandVolume/WinMain.cpp @@ -367,7 +367,7 @@ GetItemLong (HWND hTree, int itemNo) return item.lParam; } -static char PasswordDlgVolume[MAX_PATH + 1]; +static char PasswordDlgVolume[MAX_PATH + 1] = {0}; static BOOL PasswordDialogDisableMountOptions; static char *PasswordDialogTitleStringId; @@ -655,7 +655,7 @@ BOOL CALLBACK ExtcvPasswordDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARA if (lw == IDOK) { if (mountOptions.ProtectHiddenVolume && hidVolProtKeyFilesParam.EnableKeyFiles) - KeyFilesApply (hwndDlg, &mountOptions.ProtectedHidVolPassword, hidVolProtKeyFilesParam.FirstKeyFile); + KeyFilesApply (hwndDlg, &mountOptions.ProtectedHidVolPassword, hidVolProtKeyFilesParam.FirstKeyFile, PasswordDlgVolume); GetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), (LPSTR) szXPwd->Text, MAX_PASSWORD + 1); szXPwd->Length = strlen ((char *) szXPwd->Text); @@ -780,7 +780,7 @@ int RestoreVolumeHeader (HWND hwndDlg, char *lpszVolume) return 0; } -int ExtcvAskVolumePassword (HWND hwndDlg, Password *password, int *pkcs5, int *pim, BOOL* truecryptMode, char *titleStringId, BOOL enableMountOptions) +int ExtcvAskVolumePassword (HWND hwndDlg, const char* fileName, Password *password, int *pkcs5, int *pim, BOOL* truecryptMode, char *titleStringId, BOOL enableMountOptions) { int result; PasswordDlgParam dlgParam; @@ -793,6 +793,8 @@ int ExtcvAskVolumePassword (HWND hwndDlg, Password *password, int *pkcs5, int *p dlgParam.pim = pim; dlgParam.truecryptMode = truecryptMode; + StringCbCopyA (PasswordDlgVolume, sizeof(PasswordDlgVolume), fileName); + result = DialogBoxParamW (hInst, MAKEINTRESOURCEW (IDD_PASSWORD_DLG), hwndDlg, (DLGPROC) ExtcvPasswordDlgProc, (LPARAM) &dlgParam); diff --git a/src/Format/Tcformat.c b/src/Format/Tcformat.c index 1ceff6a5..1469904b 100644 --- a/src/Format/Tcformat.c +++ b/src/Format/Tcformat.c @@ -7112,7 +7112,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa { WaitCursor (); - if (!KeyFilesApply (hwndDlg, &volumePassword, FirstKeyFile)) + if (!KeyFilesApply (hwndDlg, &volumePassword, FirstKeyFile, NULL)) { NormalCursor (); return 1; @@ -7217,7 +7217,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa if (KeyFilesEnable) { - KeyFilesApply (hwndDlg, &volumePassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &volumePassword, FirstKeyFile, NULL); } if (!bInPlaceEncNonSys) diff --git a/src/Mount/Mount.c b/src/Mount/Mount.c index 1fe83c84..9a5f67f7 100644 --- a/src/Mount/Mount.c +++ b/src/Mount/Mount.c @@ -429,6 +429,12 @@ BOOL VolumeSelected (HWND hwndDlg) return (GetWindowTextLength (GetDlgItem (hwndDlg, IDC_VOLUME)) > 0); } +void GetVolumePath (HWND hwndDlg, LPSTR szPath, int nMaxCount) +{ + GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), szPath, nMaxCount); + CorrectFileName (szPath); +} + /* Returns TRUE if the last partition/drive selected via the Select Device dialog box was the system partition/drive and if it is encrypted. WARNING: This function is very fast but not always reliable (for example, if the user manually types @@ -447,7 +453,7 @@ BOOL ActiveSysEncDeviceSelected (void) { int retCode = 0; - GetWindowText (GetDlgItem (MainDlg, IDC_VOLUME), szFileName, sizeof (szFileName)); + GetVolumePath (MainDlg, szFileName, sizeof (szFileName)); retCode = IsSystemDevicePath (szFileName, MainDlg, FALSE); @@ -496,7 +502,7 @@ static string ResolveAmbiguousSelection (HWND hwndDlg, int *driveNoPtr) if (VolumeSelected (MainDlg)) { // volPathInputField will contain the volume path (if any) from the input field below the drive list - GetWindowText (GetDlgItem (MainDlg, IDC_VOLUME), volPathInputField, sizeof (volPathInputField)); + GetVolumePath (MainDlg, volPathInputField, sizeof (volPathInputField)); if (!ambig) retPath = (string) volPathInputField; @@ -1096,7 +1102,7 @@ BOOL CheckSysEncMountWithoutPBA (HWND hwndDlg, const char *devicePath, BOOL quie if (strlen (devicePath) < 2) { - GetWindowText (GetDlgItem (MainDlg, IDC_VOLUME), szDevicePath, sizeof (szDevicePath)); + GetVolumePath (MainDlg, szDevicePath, sizeof (szDevicePath)); CreateFullVolumePath (szDiskFile, sizeof(szDiskFile), szDevicePath, &tmpbDevice); if (!tmpbDevice) @@ -1859,6 +1865,13 @@ BOOL CALLBACK PasswordChangeDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPAR PimValueChangedWarning = FALSE; ZeroMemory (&newKeyFilesParam, sizeof (newKeyFilesParam)); + if (NewPimValuePtr) + { + /* we are in the case of a volume. Store its name to use it in the key file dialog + * this will help avoid using the current container file as a key file + */ + StringCbCopyA (newKeyFilesParam.VolumeFileName, sizeof (newKeyFilesParam.VolumeFileName), szFileName); + } SetWindowTextW (hwndDlg, GetString ("IDD_PASSWORDCHANGE_DLG")); LocalizeDialog (hwndDlg, "IDD_PASSWORDCHANGE_DLG"); @@ -2379,7 +2392,7 @@ BOOL CALLBACK PasswordChangeDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPAR return 1; } - GetWindowText (GetDlgItem (hParent, IDC_VOLUME), szFileName, sizeof (szFileName)); + GetVolumePath (hParent, szFileName, sizeof (szFileName)); GetWindowText (GetDlgItem (hwndDlg, IDC_OLD_PASSWORD), (LPSTR) oldPassword.Text, sizeof (oldPassword.Text)); oldPassword.Length = (unsigned __int32) strlen ((char *) oldPassword.Text); @@ -2402,11 +2415,11 @@ BOOL CALLBACK PasswordChangeDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPAR WaitCursor (); if (KeyFilesEnable) - KeyFilesApply (hwndDlg, &oldPassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &oldPassword, FirstKeyFile, szFileName); if (newKeyFilesParam.EnableKeyFiles) { - if (!KeyFilesApply (hwndDlg, &newPassword, pwdChangeDlgMode == PCDM_CHANGE_PKCS5_PRF ? FirstKeyFile : newKeyFilesParam.FirstKeyFile)) + if (!KeyFilesApply (hwndDlg, &newPassword, pwdChangeDlgMode == PCDM_CHANGE_PKCS5_PRF ? FirstKeyFile : newKeyFilesParam.FirstKeyFile, szFileName)) { nStatus = ERR_DONT_REPORT; goto err; @@ -2781,7 +2794,7 @@ BOOL CALLBACK PasswordDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPa if (lw == IDOK) { if (mountOptions.ProtectHiddenVolume && hidVolProtKeyFilesParam.EnableKeyFiles) - KeyFilesApply (hwndDlg, &mountOptions.ProtectedHidVolPassword, hidVolProtKeyFilesParam.FirstKeyFile); + KeyFilesApply (hwndDlg, &mountOptions.ProtectedHidVolPassword, hidVolProtKeyFilesParam.FirstKeyFile, strlen (PasswordDlgVolume) > 0 ? PasswordDlgVolume : NULL); GetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD), (LPSTR) szXPwd->Text, MAX_PASSWORD + 1); szXPwd->Length = (unsigned __int32) strlen ((char *) szXPwd->Text); @@ -4202,7 +4215,7 @@ static BOOL Mount (HWND hwndDlg, int nDosDriveNo, char *szFileName, int pim) if (szFileName == NULL) { - GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), fileName, sizeof (fileName)); + GetVolumePath (hwndDlg, fileName, sizeof (fileName)); szFileName = fileName; } @@ -4245,7 +4258,7 @@ static BOOL Mount (HWND hwndDlg, int nDosDriveNo, char *szFileName, int pim) Password emptyPassword; emptyPassword.Length = 0; - KeyFilesApply (hwndDlg, &emptyPassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &emptyPassword, FirstKeyFile, szFileName); // try TrueCrypt mode first since it is quick, only if pim = 0 if (EffectiveVolumePim == 0) mounted = MountVolume (hwndDlg, nDosDriveNo, szFileName, &emptyPassword, 0, 0, TRUE, bCacheInDriver, bForceMount, &mountOptions, Silent, FALSE); @@ -4307,7 +4320,7 @@ static BOOL Mount (HWND hwndDlg, int nDosDriveNo, char *szFileName, int pim) WaitCursor (); if (KeyFilesEnable) - KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile, szFileName); mounted = MountVolume (hwndDlg, nDosDriveNo, szFileName, &VolumePassword, VolumePkcs5, VolumePim, VolumeTrueCryptMode, bCacheInDriver, bForceMount, &mountOptions, Silent, !Silent); NormalCursor (); @@ -4617,9 +4630,9 @@ static BOOL MountAllDevicesThreadCode (HWND hwndDlg, BOOL bPasswordPrompt) WaitCursor(); if (FirstCmdKeyFile) - KeyFilesApply (hwndDlg, &VolumePassword, FirstCmdKeyFile); + KeyFilesApply (hwndDlg, &VolumePassword, FirstCmdKeyFile, NULL); else if (KeyFilesEnable) - KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile, NULL); } @@ -4832,7 +4845,7 @@ static void ChangePassword (HWND hwndDlg) INT_PTR result; int newPimValue = -1; - GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), szFileName, sizeof (szFileName)); + GetVolumePath (hwndDlg, szFileName, sizeof (szFileName)); if (IsMountedVolume (szFileName)) { Warning (pwdChangeDlgMode == PCDM_CHANGE_PKCS5_PRF ? "MOUNTED_NO_PKCS5_PRF_CHANGE" : "MOUNTED_NOPWCHANGE", hwndDlg); @@ -5177,7 +5190,7 @@ static void DecryptNonSysDevice (HWND hwndDlg, BOOL bResolveAmbiguousSelection, char volPath [TC_MAX_PATH]; - GetWindowText (GetDlgItem (MainDlg, IDC_VOLUME), volPath, sizeof (volPath)); + GetVolumePath (MainDlg, volPath, sizeof (volPath)); scPath = volPath; } @@ -5856,7 +5869,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa BOOL reportBadPasswd = CmdVolumePassword.Length > 0; if (FirstCmdKeyFile) - KeyFilesApply (hwndDlg, &CmdVolumePassword, FirstCmdKeyFile); + KeyFilesApply (hwndDlg, &CmdVolumePassword, FirstCmdKeyFile, szFileName); mounted = MountVolume (hwndDlg, szDriveLetter[0] - 'A', szFileName, &CmdVolumePassword, EffectiveVolumePkcs5, CmdVolumePim, EffectiveVolumeTrueCryptMode, bCacheInDriver, bForceMount, @@ -5895,7 +5908,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa WaitCursor (); if (KeyFilesEnable && FirstKeyFile) - KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile, szFileName); mounted = MountVolume (hwndDlg, szDriveLetter[0] - 'A', szFileName, &VolumePassword, VolumePkcs5, VolumePim, VolumeTrueCryptMode, bCacheInDriver, bForceMount, &mountOptions, FALSE, TRUE); @@ -6629,7 +6642,11 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa return 1; if (mountOptions.ProtectHiddenVolume && hidVolProtKeyFilesParam.EnableKeyFiles) - KeyFilesApply (hwndDlg, &mountOptions.ProtectedHidVolPassword, hidVolProtKeyFilesParam.FirstKeyFile); + { + char selectedVolume [TC_MAX_PATH + 1]; + GetVolumePath (hwndDlg, selectedVolume, sizeof (selectedVolume)); + KeyFilesApply (hwndDlg, &mountOptions.ProtectedHidVolPassword, hidVolProtKeyFilesParam.FirstKeyFile, selectedVolume); + } } if (CheckMountList (hwndDlg, FALSE)) @@ -7024,7 +7041,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa } else { - GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), volPath, sizeof (volPath)); + GetVolumePath (hwndDlg, volPath, sizeof (volPath)); WaitCursor (); @@ -7047,7 +7064,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa } else { - GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), volPath, sizeof (volPath)); + GetVolumePath (hwndDlg, volPath, sizeof (volPath)); WaitCursor (); @@ -7323,7 +7340,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa wchar_t volPathLowerW[TC_MAX_PATH]; // volPathLower will contain the volume path (if any) from the input field below the drive list - GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), volPathLower, sizeof (volPathLower)); + GetVolumePath (hwndDlg, volPathLower, sizeof (volPathLower)); if (LOWORD (selectedDrive) != TC_MLIST_ITEM_NONSYS_VOL && !(VolumeSelected (hwndDlg) && IsMountedVolume (volPathLower))) @@ -7469,7 +7486,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa { char volPath[TC_MAX_PATH]; /* Volume to mount */ - GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), volPath, sizeof (volPath)); + GetVolumePath (hwndDlg, volPath, sizeof (volPath)); WaitCursor (); @@ -7496,7 +7513,7 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa { char volPath[TC_MAX_PATH]; /* Volume to mount */ - GetWindowText (GetDlgItem (hwndDlg, IDC_VOLUME), volPath, sizeof (volPath)); + GetVolumePath (hwndDlg, volPath, sizeof (volPath)); WaitCursor (); @@ -8980,7 +8997,7 @@ int BackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, const char *lps WaitCursor(); if (KeyFilesEnable && FirstKeyFile) - KeyFilesApply (hwndDlg, askPassword, FirstKeyFile); + KeyFilesApply (hwndDlg, askPassword, FirstKeyFile, lpszVolume); nStatus = OpenVolume (askVol, lpszVolume, askPassword, *askPkcs5, *askPim, VolumeTrueCryptMode, FALSE, bPreserveTimestamp, FALSE); @@ -9251,7 +9268,7 @@ int RestoreVolumeHeader (HWND hwndDlg, const char *lpszVolume) WaitCursor(); if (KeyFilesEnable && FirstKeyFile) - KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile, lpszVolume); nStatus = OpenVolume (&volume, lpszVolume, &VolumePassword, VolumePkcs5, VolumePim, VolumeTrueCryptMode,TRUE, bPreserveTimestamp, TRUE); @@ -9451,7 +9468,7 @@ int RestoreVolumeHeader (HWND hwndDlg, const char *lpszVolume) } if (KeyFilesEnable && FirstKeyFile) - KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile); + KeyFilesApply (hwndDlg, &VolumePassword, FirstKeyFile, bDevice? NULL : lpszVolume); // Decrypt volume header headerOffsetBackupFile = 0; @@ -10133,7 +10150,11 @@ void MountSelectedVolume (HWND hwndDlg, BOOL mountWithOptions) return; if (mountOptions.ProtectHiddenVolume && hidVolProtKeyFilesParam.EnableKeyFiles) - KeyFilesApply (hwndDlg, &mountOptions.ProtectedHidVolPassword, hidVolProtKeyFilesParam.FirstKeyFile); + { + char selectedVolume [TC_MAX_PATH + 1]; + GetVolumePath (hwndDlg, selectedVolume, sizeof (selectedVolume)); + KeyFilesApply (hwndDlg, &mountOptions.ProtectedHidVolPassword, hidVolProtKeyFilesParam.FirstKeyFile, selectedVolume); + } } if (CheckMountList (hwndDlg, FALSE)) -- cgit v1.2.3