mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 11:08:02 -06:00
Windows: Support setting volume label in Explorer through mount option. Support using favorite label as label in Explorer.
This commit is contained in:
@@ -109,6 +109,9 @@ typedef struct
|
|||||||
uint32 BytesPerPhysicalSector;
|
uint32 BytesPerPhysicalSector;
|
||||||
int VolumePim;
|
int VolumePim;
|
||||||
int ProtectedHidVolPim;
|
int ProtectedHidVolPim;
|
||||||
|
wchar_t wszLabel[33]; // maximum label length is 32 for NTFS and 11 for FAT32
|
||||||
|
BOOL bIsNTFS; // output only
|
||||||
|
BOOL bDriverSetLabel;
|
||||||
} MOUNT_STRUCT;
|
} MOUNT_STRUCT;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@@ -123,6 +126,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
unsigned __int32 ulMountedDrives; /* Bitfield of all mounted drive letters */
|
unsigned __int32 ulMountedDrives; /* Bitfield of all mounted drive letters */
|
||||||
wchar_t wszVolume[26][TC_MAX_PATH]; /* Volume names of mounted volumes */
|
wchar_t wszVolume[26][TC_MAX_PATH]; /* Volume names of mounted volumes */
|
||||||
|
wchar_t wszLabel[26][33]; /* Labels of mounted volumes */
|
||||||
unsigned __int64 diskLength[26];
|
unsigned __int64 diskLength[26];
|
||||||
int ea[26];
|
int ea[26];
|
||||||
int volumeType[26]; /* Volume type (e.g. PROP_VOL_TYPE_OUTER, PROP_VOL_TYPE_OUTER_VOL_WRITE_PREVENTED, etc.) */
|
int volumeType[26]; /* Volume type (e.g. PROP_VOL_TYPE_OUTER, PROP_VOL_TYPE_OUTER_VOL_WRITE_PREVENTED, etc.) */
|
||||||
@@ -149,6 +153,8 @@ typedef struct
|
|||||||
int hiddenVolProtection; /* Hidden volume protection status (e.g. HIDVOL_PROT_STATUS_NONE, HIDVOL_PROT_STATUS_ACTIVE, etc.) */
|
int hiddenVolProtection; /* Hidden volume protection status (e.g. HIDVOL_PROT_STATUS_NONE, HIDVOL_PROT_STATUS_ACTIVE, etc.) */
|
||||||
int volFormatVersion;
|
int volFormatVersion;
|
||||||
int volumePim;
|
int volumePim;
|
||||||
|
wchar_t wszLabel[33];
|
||||||
|
BOOL bDriverSetLabel;
|
||||||
} VOLUME_PROPERTIES_STRUCT;
|
} VOLUME_PROPERTIES_STRUCT;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ typedef struct
|
|||||||
BOOL RecoveryMode;
|
BOOL RecoveryMode;
|
||||||
int ProtectedHidVolPkcs5Prf;
|
int ProtectedHidVolPkcs5Prf;
|
||||||
int ProtectedHidVolPim;
|
int ProtectedHidVolPim;
|
||||||
|
wchar_t Label[33]; /* maximum label length is 32 for NTFS and 11 for FAT32 */
|
||||||
} MountOptions;
|
} MountOptions;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ BEGIN
|
|||||||
PUSHBUTTON "Cancel",IDCANCEL,248,190,50,14
|
PUSHBUTTON "Cancel",IDCANCEL,248,190,50,14
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_MOUNT_OPTIONS DIALOGEX 0, 0, 277, 224
|
IDD_MOUNT_OPTIONS DIALOGEX 0, 0, 277, 231
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
CAPTION "VeraCrypt - Mount Options"
|
CAPTION "VeraCrypt - Mount Options"
|
||||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||||
@@ -78,22 +78,24 @@ BEGIN
|
|||||||
CONTROL "Mount partition &using system encryption without pre-boot authentication",IDC_MOUNT_SYSENC_PART_WITHOUT_PBA,
|
CONTROL "Mount partition &using system encryption without pre-boot authentication",IDC_MOUNT_SYSENC_PART_WITHOUT_PBA,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,53,259,11
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,53,259,11
|
||||||
CONTROL "&Protect hidden volume against damage caused by writing to outer volume",IDC_PROTECT_HIDDEN_VOL,
|
CONTROL "&Protect hidden volume against damage caused by writing to outer volume",IDC_PROTECT_HIDDEN_VOL,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,86,252,10
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,97,252,10
|
||||||
EDITTEXT IDC_PASSWORD_PROT_HIDVOL,112,104,151,14,ES_PASSWORD | ES_AUTOHSCROLL
|
EDITTEXT IDC_PASSWORD_PROT_HIDVOL,112,115,151,14,ES_PASSWORD | ES_AUTOHSCROLL
|
||||||
COMBOBOX IDC_PKCS5_PRF_ID,112,125,91,90,CBS_DROPDOWNLIST | WS_TABSTOP
|
COMBOBOX IDC_PKCS5_PRF_ID,112,136,91,90,CBS_DROPDOWNLIST | WS_TABSTOP
|
||||||
EDITTEXT IDC_PIM,112,145,42,14,ES_RIGHT | ES_PASSWORD | ES_AUTOHSCROLL | ES_NUMBER | NOT WS_VISIBLE
|
EDITTEXT IDC_PIM,112,156,42,14,ES_RIGHT | ES_PASSWORD | ES_AUTOHSCROLL | ES_NUMBER | NOT WS_VISIBLE
|
||||||
LTEXT "(Empty or 0 for default iterations)",IDC_PIM_HELP,158,148,112,8,NOT WS_VISIBLE
|
LTEXT "(Empty or 0 for default iterations)",IDC_PIM_HELP,158,159,112,8,NOT WS_VISIBLE
|
||||||
CONTROL "&Display password",IDC_SHOW_PASSWORD_MO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,165,90,10
|
CONTROL "&Display password",IDC_SHOW_PASSWORD_MO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,174,90,10
|
||||||
CONTROL "U&se keyfiles",IDC_KEYFILES_ENABLE_HIDVOL_PROT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,178,90,10
|
CONTROL "U&se keyfiles",IDC_KEYFILES_ENABLE_HIDVOL_PROT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,187,90,10
|
||||||
PUSHBUTTON "&Keyfiles...",IDC_KEYFILES_HIDVOL_PROT,204,174,60,14
|
PUSHBUTTON "&Keyfiles...",IDC_KEYFILES_HIDVOL_PROT,204,183,60,14
|
||||||
DEFPUSHBUTTON "OK",IDOK,211,7,60,14
|
DEFPUSHBUTTON "OK",IDOK,211,7,60,14
|
||||||
PUSHBUTTON "Cancel",IDCANCEL,211,24,60,14
|
PUSHBUTTON "Cancel",IDCANCEL,211,24,60,14
|
||||||
LTEXT "What is hidden volume protection?",IDC_LINK_HIDVOL_PROTECTION_INFO,16,193,247,10,SS_NOTIFY
|
LTEXT "What is hidden volume protection?",IDC_LINK_HIDVOL_PROTECTION_INFO,16,202,247,10,SS_NOTIFY
|
||||||
RTEXT "P&assword to hidden volume:\n(if empty, cache is used)",IDT_HIDDEN_PROT_PASSWD,15,103,91,17,0,WS_EX_RIGHT
|
RTEXT "P&assword to hidden volume:\n(if empty, cache is used)",IDT_HIDDEN_PROT_PASSWD,15,114,91,17,0,WS_EX_RIGHT
|
||||||
GROUPBOX "Hidden Volume Protection",IDT_HIDDEN_VOL_PROTECTION,6,72,265,139
|
GROUPBOX "Hidden Volume Protection",IDT_HIDDEN_VOL_PROTECTION,6,83,265,136
|
||||||
RTEXT "PKCS-5 PRF:",IDT_PKCS5_PRF,15,126,91,17
|
RTEXT "PKCS-5 PRF:",IDT_PKCS5_PRF,15,137,91,17
|
||||||
RTEXT "Volume PIM:",IDT_PIM,15,148,91,17,NOT WS_VISIBLE
|
RTEXT "Volume PIM:",IDT_PIM,15,159,91,17,NOT WS_VISIBLE
|
||||||
CONTROL "Use PIM",IDC_PIM_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,152,97,10
|
CONTROL "Use PIM",IDC_PIM_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,112,161,97,10
|
||||||
|
LTEXT "Volume Label in Windows:",IDT_VOLUME_LABEL,12,70,95,8
|
||||||
|
EDITTEXT IDC_VOLUME_LABEL,112,67,150,14,ES_AUTOHSCROLL
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_KEYFILES DIALOGEX 0, 0, 345, 237
|
IDD_KEYFILES DIALOGEX 0, 0, 345, 237
|
||||||
@@ -352,7 +354,7 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
LEFTMARGIN, 7
|
LEFTMARGIN, 7
|
||||||
TOPMARGIN, 7
|
TOPMARGIN, 7
|
||||||
BOTTOMMARGIN, 218
|
BOTTOMMARGIN, 225
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_KEYFILES, DIALOG
|
IDD_KEYFILES, DIALOG
|
||||||
|
|||||||
@@ -3216,7 +3216,8 @@ BOOL CALLBACK RawDevicesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM l
|
|||||||
#ifdef TCMOUNT
|
#ifdef TCMOUNT
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wstring favoriteLabel = GetFavoriteVolumeLabel (device.Path);
|
bool useInExplorer = false;
|
||||||
|
wstring favoriteLabel = GetFavoriteVolumeLabel (device.Path, useInExplorer);
|
||||||
if (!favoriteLabel.empty())
|
if (!favoriteLabel.empty())
|
||||||
ListSubItemSetW (hList, item.iItem, 3, (wchar_t *) favoriteLabel.c_str());
|
ListSubItemSetW (hList, item.iItem, 3, (wchar_t *) favoriteLabel.c_str());
|
||||||
}
|
}
|
||||||
@@ -4349,6 +4350,58 @@ BOOL CloseVolumeExplorerWindows (HWND hwnd, int driveNo)
|
|||||||
return explorerCloseSent;
|
return explorerCloseSent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL UpdateDriveCustomLabel (int driveNo, wchar_t* effectiveLabel, BOOL bSetValue)
|
||||||
|
{
|
||||||
|
wchar_t wszRegPath[MAX_PATH];
|
||||||
|
wchar_t driveStr[] = {L'A' + (wchar_t) driveNo, 0};
|
||||||
|
HKEY hKey;
|
||||||
|
LSTATUS lStatus;
|
||||||
|
DWORD cbLabelLen = (DWORD) ((wcslen (effectiveLabel) + 1) * sizeof (wchar_t));
|
||||||
|
BOOL bToBeDeleted = FALSE;
|
||||||
|
|
||||||
|
StringCbPrintfW (wszRegPath, sizeof (wszRegPath), L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\DriveIcons\\%s\\DefaultLabel", driveStr);
|
||||||
|
|
||||||
|
if (bSetValue)
|
||||||
|
lStatus = RegCreateKeyExW (HKEY_CURRENT_USER, wszRegPath, NULL, NULL, 0,
|
||||||
|
KEY_READ | KEY_WRITE | KEY_SET_VALUE, NULL, &hKey, NULL);
|
||||||
|
else
|
||||||
|
lStatus = RegOpenKeyExW (HKEY_CURRENT_USER, wszRegPath, 0, KEY_READ | KEY_WRITE | KEY_SET_VALUE, &hKey);
|
||||||
|
if (ERROR_SUCCESS == lStatus)
|
||||||
|
{
|
||||||
|
if (bSetValue)
|
||||||
|
lStatus = RegSetValueExW (hKey, NULL, NULL, REG_SZ, (LPCBYTE) effectiveLabel, cbLabelLen);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wchar_t storedLabel[34] = {0};
|
||||||
|
DWORD cbStoredLen = sizeof (storedLabel) - 1, dwType;
|
||||||
|
lStatus = RegQueryValueExW (hKey, NULL, NULL, &dwType, (LPBYTE) storedLabel, &cbStoredLen);
|
||||||
|
if ((ERROR_SUCCESS == lStatus) && (REG_SZ == dwType) && (0 == wcscmp(storedLabel, effectiveLabel)))
|
||||||
|
{
|
||||||
|
// same label stored. mark key for deletion
|
||||||
|
bToBeDeleted = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RegCloseKey (hKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bToBeDeleted)
|
||||||
|
{
|
||||||
|
StringCbPrintfW (wszRegPath, sizeof (wszRegPath), L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\DriveIcons\\%s", driveStr);
|
||||||
|
lStatus = RegOpenKeyExW (HKEY_CURRENT_USER, wszRegPath, 0, KEY_READ | KEY_WRITE | KEY_SET_VALUE, &hKey);
|
||||||
|
if (ERROR_SUCCESS == lStatus)
|
||||||
|
{
|
||||||
|
lStatus = RegDeleteKeyExW (hKey, L"DefaultLabel", 0, NULL);
|
||||||
|
RegCloseKey (hKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete drive letter of nothing else is present under it
|
||||||
|
RegDeleteKeyExW (HKEY_CURRENT_USER, wszRegPath, 0, NULL);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ERROR_SUCCESS == lStatus)? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
string GetUserFriendlyVersionString (int version)
|
string GetUserFriendlyVersionString (int version)
|
||||||
{
|
{
|
||||||
char szTmp [64];
|
char szTmp [64];
|
||||||
@@ -6284,8 +6337,21 @@ int DriverUnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forced)
|
|||||||
{
|
{
|
||||||
UNMOUNT_STRUCT unmount;
|
UNMOUNT_STRUCT unmount;
|
||||||
DWORD dwResult;
|
DWORD dwResult;
|
||||||
|
VOLUME_PROPERTIES_STRUCT prop;
|
||||||
BOOL bResult;
|
BOOL bResult;
|
||||||
|
WCHAR wszLabel[33] = {0};
|
||||||
|
BOOL bDriverSetLabel = FALSE;
|
||||||
|
|
||||||
|
memset (&prop, 0, sizeof(prop));
|
||||||
|
prop.driveNo = nDosDriveNo;
|
||||||
|
|
||||||
|
if ( DeviceIoControl (hDriver, TC_IOCTL_GET_VOLUME_PROPERTIES, &prop, sizeof (prop), &prop, sizeof (prop), &dwResult, NULL)
|
||||||
|
&& prop.driveNo == nDosDriveNo
|
||||||
|
)
|
||||||
|
{
|
||||||
|
memcpy (wszLabel, prop.wszLabel, sizeof (wszLabel));
|
||||||
|
bDriverSetLabel = prop.bDriverSetLabel;
|
||||||
|
}
|
||||||
|
|
||||||
unmount.nDosDriveNo = nDosDriveNo;
|
unmount.nDosDriveNo = nDosDriveNo;
|
||||||
unmount.ignoreOpenFiles = forced;
|
unmount.ignoreOpenFiles = forced;
|
||||||
@@ -6298,6 +6364,8 @@ int DriverUnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forced)
|
|||||||
handleWin32Error (hwndDlg, SRC_POS);
|
handleWin32Error (hwndDlg, SRC_POS);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
else if ((unmount.nReturnCode == ERR_SUCCESS) && bDriverSetLabel && wszLabel[0])
|
||||||
|
UpdateDriveCustomLabel (nDosDriveNo, wszLabel, FALSE);
|
||||||
|
|
||||||
#ifdef TCMOUNT
|
#ifdef TCMOUNT
|
||||||
|
|
||||||
@@ -6613,6 +6681,7 @@ int MountVolume (HWND hwndDlg,
|
|||||||
mount.SystemFavorite = MountVolumesAsSystemFavorite;
|
mount.SystemFavorite = MountVolumesAsSystemFavorite;
|
||||||
mount.UseBackupHeader = mountOptions->UseBackupHeader;
|
mount.UseBackupHeader = mountOptions->UseBackupHeader;
|
||||||
mount.RecoveryMode = mountOptions->RecoveryMode;
|
mount.RecoveryMode = mountOptions->RecoveryMode;
|
||||||
|
StringCbCopyW (mount.wszLabel, sizeof (mount.wszLabel), mountOptions->Label);
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
mount.nDosDriveNo = driveNo;
|
mount.nDosDriveNo = driveNo;
|
||||||
@@ -6919,6 +6988,12 @@ retry:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mount.wszLabel[0] && !mount.bDriverSetLabel)
|
||||||
|
{
|
||||||
|
// try setting the drive label on user-mode using registry
|
||||||
|
UpdateDriveCustomLabel (driveNo, mount.wszLabel, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
ResetWrongPwdRetryCount ();
|
ResetWrongPwdRetryCount ();
|
||||||
|
|
||||||
BroadcastDeviceChange (DBT_DEVICEARRIVAL, driveNo, 0);
|
BroadcastDeviceChange (DBT_DEVICEARRIVAL, driveNo, 0);
|
||||||
|
|||||||
@@ -326,6 +326,7 @@ void LocalizeDialog ( HWND hwnd, char *stringId );
|
|||||||
void OpenVolumeExplorerWindow (int driveNo);
|
void OpenVolumeExplorerWindow (int driveNo);
|
||||||
static BOOL CALLBACK CloseVolumeExplorerWindowsEnum( HWND hwnd, LPARAM driveNo);
|
static BOOL CALLBACK CloseVolumeExplorerWindowsEnum( HWND hwnd, LPARAM driveNo);
|
||||||
BOOL CloseVolumeExplorerWindows (HWND hwnd, int driveNo);
|
BOOL CloseVolumeExplorerWindows (HWND hwnd, int driveNo);
|
||||||
|
BOOL UpdateDriveCustomLabel (int driveNo, wchar_t* effectiveLabel, BOOL bSetValue);
|
||||||
BOOL CheckCapsLock (HWND hwnd, BOOL quiet);
|
BOOL CheckCapsLock (HWND hwnd, BOOL quiet);
|
||||||
BOOL CheckFileExtension (char *fileName);
|
BOOL CheckFileExtension (char *fileName);
|
||||||
void CorrectFileName (char* fileName);
|
void CorrectFileName (char* fileName);
|
||||||
|
|||||||
@@ -99,6 +99,7 @@
|
|||||||
<control lang="en" key="IDT_SYSENC_KEYS_GEN_INFO">The keys, salt, and other data have been successfully generated. If you want to generate new keys, click Back and then Next. Otherwise, click Next to continue.</control>
|
<control lang="en" key="IDT_SYSENC_KEYS_GEN_INFO">The keys, salt, and other data have been successfully generated. If you want to generate new keys, click Back and then Next. Otherwise, click Next to continue.</control>
|
||||||
<control lang="en" key="IDT_SYS_DEVICE">Encrypts the partition/drive where Windows is installed. Anyone who wants to gain access and use the system, read and write files, etc., will need to enter the correct password each time before Windows boots. Optionally, creates a hidden system.</control>
|
<control lang="en" key="IDT_SYS_DEVICE">Encrypts the partition/drive where Windows is installed. Anyone who wants to gain access and use the system, read and write files, etc., will need to enter the correct password each time before Windows boots. Optionally, creates a hidden system.</control>
|
||||||
<control lang="en" key="IDT_SYS_PARTITION">Select this option to encrypt the partition where the currently running Windows operating system is installed.</control>
|
<control lang="en" key="IDT_SYS_PARTITION">Select this option to encrypt the partition where the currently running Windows operating system is installed.</control>
|
||||||
|
<control lang="en" key="IDT_VOLUME_LABEL">Volume Label in Windows:</control>
|
||||||
<control lang="en" key="IDT_WIPE_MODE">Wipe mode:</control>
|
<control lang="en" key="IDT_WIPE_MODE">Wipe mode:</control>
|
||||||
<control lang="en" key="IDCLOSE">Close</control>
|
<control lang="en" key="IDCLOSE">Close</control>
|
||||||
<control lang="en" key="IDC_ALLOW_ESC_PBA_BYPASS">Allow pre-boot &authentication to be bypassed by pressing the Esc key (enables boot manager)</control>
|
<control lang="en" key="IDC_ALLOW_ESC_PBA_BYPASS">Allow pre-boot &authentication to be bypassed by pressing the Esc key (enables boot manager)</control>
|
||||||
|
|||||||
@@ -192,6 +192,8 @@
|
|||||||
#define IDC_PIM 5130
|
#define IDC_PIM 5130
|
||||||
#define IDC_PIM_HELP 5131
|
#define IDC_PIM_HELP 5131
|
||||||
#define IDC_PIM_ENABLE 5132
|
#define IDC_PIM_ENABLE 5132
|
||||||
|
#define IDC_VOLUME_LABEL 5133
|
||||||
|
#define IDT_VOLUME_LABEL 5134
|
||||||
|
|
||||||
// Next default values for new objects
|
// Next default values for new objects
|
||||||
//
|
//
|
||||||
@@ -200,7 +202,7 @@
|
|||||||
#define _APS_NO_MFC 1
|
#define _APS_NO_MFC 1
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 542
|
#define _APS_NEXT_RESOURCE_VALUE 542
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||||
#define _APS_NEXT_CONTROL_VALUE 5133
|
#define _APS_NEXT_CONTROL_VALUE 5135
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1199,6 +1199,7 @@ NTSTATUS ProcessMainDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION Ex
|
|||||||
{
|
{
|
||||||
list->ulMountedDrives |= (1 << ListExtension->nDosDriveNo);
|
list->ulMountedDrives |= (1 << ListExtension->nDosDriveNo);
|
||||||
RtlStringCbCopyW (list->wszVolume[ListExtension->nDosDriveNo], sizeof(list->wszVolume[ListExtension->nDosDriveNo]),ListExtension->wszVolume);
|
RtlStringCbCopyW (list->wszVolume[ListExtension->nDosDriveNo], sizeof(list->wszVolume[ListExtension->nDosDriveNo]),ListExtension->wszVolume);
|
||||||
|
RtlStringCbCopyW (list->wszLabel[ListExtension->nDosDriveNo], sizeof(list->wszLabel[ListExtension->nDosDriveNo]),ListExtension->wszLabel);
|
||||||
list->diskLength[ListExtension->nDosDriveNo] = ListExtension->DiskLength;
|
list->diskLength[ListExtension->nDosDriveNo] = ListExtension->DiskLength;
|
||||||
list->ea[ListExtension->nDosDriveNo] = ListExtension->cryptoInfo->ea;
|
list->ea[ListExtension->nDosDriveNo] = ListExtension->cryptoInfo->ea;
|
||||||
if (ListExtension->cryptoInfo->hiddenVolume)
|
if (ListExtension->cryptoInfo->hiddenVolume)
|
||||||
@@ -1249,6 +1250,8 @@ NTSTATUS ProcessMainDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION Ex
|
|||||||
{
|
{
|
||||||
prop->uniqueId = ListExtension->UniqueVolumeId;
|
prop->uniqueId = ListExtension->UniqueVolumeId;
|
||||||
RtlStringCbCopyW (prop->wszVolume, sizeof(prop->wszVolume),ListExtension->wszVolume);
|
RtlStringCbCopyW (prop->wszVolume, sizeof(prop->wszVolume),ListExtension->wszVolume);
|
||||||
|
RtlStringCbCopyW (prop->wszLabel, sizeof(prop->wszLabel),ListExtension->wszLabel);
|
||||||
|
prop->bDriverSetLabel = ListExtension->bDriverSetLabel;
|
||||||
prop->diskLength = ListExtension->DiskLength;
|
prop->diskLength = ListExtension->DiskLength;
|
||||||
prop->ea = ListExtension->cryptoInfo->ea;
|
prop->ea = ListExtension->cryptoInfo->ea;
|
||||||
prop->mode = ListExtension->cryptoInfo->mode;
|
prop->mode = ListExtension->cryptoInfo->mode;
|
||||||
@@ -1442,6 +1445,7 @@ NTSTATUS ProcessMainDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION Ex
|
|||||||
}
|
}
|
||||||
|
|
||||||
EnsureNullTerminatedString (mount->wszVolume, sizeof (mount->wszVolume));
|
EnsureNullTerminatedString (mount->wszVolume, sizeof (mount->wszVolume));
|
||||||
|
EnsureNullTerminatedString (mount->wszLabel, sizeof (mount->wszLabel));
|
||||||
|
|
||||||
Irp->IoStatus.Information = sizeof (MOUNT_STRUCT);
|
Irp->IoStatus.Information = sizeof (MOUNT_STRUCT);
|
||||||
Irp->IoStatus.Status = MountDevice (DeviceObject, mount);
|
Irp->IoStatus.Status = MountDevice (DeviceObject, mount);
|
||||||
@@ -2697,6 +2701,9 @@ NTSTATUS MountDevice (PDEVICE_OBJECT DeviceObject, MOUNT_STRUCT *mount)
|
|||||||
{
|
{
|
||||||
HANDLE volumeHandle;
|
HANDLE volumeHandle;
|
||||||
PFILE_OBJECT volumeFileObject;
|
PFILE_OBJECT volumeFileObject;
|
||||||
|
ULONG labelLen = (ULONG) wcslen (mount->wszLabel);
|
||||||
|
BOOL bIsNTFS = FALSE;
|
||||||
|
ULONG labelMaxLen, labelEffectiveLen;
|
||||||
|
|
||||||
Dump ("Mount SUCCESS TC code = 0x%08x READ-ONLY = %d\n", mount->nReturnCode, NewExtension->bReadOnly);
|
Dump ("Mount SUCCESS TC code = 0x%08x READ-ONLY = %d\n", mount->nReturnCode, NewExtension->bReadOnly);
|
||||||
|
|
||||||
@@ -2735,6 +2742,59 @@ NTSTATUS MountDevice (PDEVICE_OBJECT DeviceObject, MOUNT_STRUCT *mount)
|
|||||||
mount->FilesystemDirty = TRUE;
|
mount->FilesystemDirty = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// detect if the filesystem is NTFS or FAT
|
||||||
|
__try
|
||||||
|
{
|
||||||
|
NTFS_VOLUME_DATA_BUFFER ntfsData;
|
||||||
|
if (NT_SUCCESS (TCFsctlCall (volumeFileObject, FSCTL_GET_NTFS_VOLUME_DATA, NULL, 0, &ntfsData, sizeof (ntfsData))))
|
||||||
|
{
|
||||||
|
bIsNTFS = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
bIsNTFS = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
NewExtension->bIsNTFS = bIsNTFS;
|
||||||
|
mount->bIsNTFS = bIsNTFS;
|
||||||
|
|
||||||
|
if (labelLen > 0)
|
||||||
|
{
|
||||||
|
if (bIsNTFS)
|
||||||
|
labelMaxLen = 32; // NTFS maximum label length
|
||||||
|
else
|
||||||
|
labelMaxLen = 11; // FAT maximum label length
|
||||||
|
|
||||||
|
// calculate label effective length
|
||||||
|
labelEffectiveLen = labelLen > labelMaxLen? labelMaxLen : labelLen;
|
||||||
|
|
||||||
|
// correct the label in the device
|
||||||
|
memset (&NewExtension->wszLabel[labelEffectiveLen], 0, 33 - labelEffectiveLen);
|
||||||
|
memcpy (mount->wszLabel, NewExtension->wszLabel, 33);
|
||||||
|
|
||||||
|
// set the volume label
|
||||||
|
__try
|
||||||
|
{
|
||||||
|
IO_STATUS_BLOCK ioblock;
|
||||||
|
ULONG labelInfoSize = sizeof(FILE_FS_LABEL_INFORMATION) + (labelEffectiveLen * sizeof(WCHAR));
|
||||||
|
FILE_FS_LABEL_INFORMATION* labelInfo = (FILE_FS_LABEL_INFORMATION*) TCalloc (labelInfoSize);
|
||||||
|
labelInfo->VolumeLabelLength = labelEffectiveLen * sizeof(WCHAR);
|
||||||
|
memcpy (labelInfo->VolumeLabel, mount->wszLabel, labelInfo->VolumeLabelLength);
|
||||||
|
|
||||||
|
if (STATUS_SUCCESS == ZwSetVolumeInformationFile (volumeHandle, &ioblock, labelInfo, labelInfoSize, FileFsLabelInformation))
|
||||||
|
{
|
||||||
|
mount->bDriverSetLabel = TRUE;
|
||||||
|
NewExtension->bDriverSetLabel = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
TCfree(labelInfo);
|
||||||
|
}
|
||||||
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TCCloseFsVolume (volumeHandle, volumeFileObject);
|
TCCloseFsVolume (volumeHandle, volumeFileObject);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,9 @@ typedef struct EXTENSION
|
|||||||
BOOL SystemFavorite;
|
BOOL SystemFavorite;
|
||||||
|
|
||||||
WCHAR wszVolume[TC_MAX_PATH]; /* DONT change this size without also changing MOUNT_LIST_STRUCT! */
|
WCHAR wszVolume[TC_MAX_PATH]; /* DONT change this size without also changing MOUNT_LIST_STRUCT! */
|
||||||
|
WCHAR wszLabel[33];
|
||||||
|
BOOL bIsNTFS;
|
||||||
|
BOOL bDriverSetLabel;
|
||||||
|
|
||||||
LARGE_INTEGER fileCreationTime;
|
LARGE_INTEGER fileCreationTime;
|
||||||
LARGE_INTEGER fileLastAccessTime;
|
LARGE_INTEGER fileLastAccessTime;
|
||||||
|
|||||||
@@ -669,6 +669,9 @@ NTSTATUS TCOpenVolume (PDEVICE_OBJECT DeviceObject,
|
|||||||
{
|
{
|
||||||
RtlStringCbCopyW (Extension->wszVolume, sizeof(Extension->wszVolume),pwszMountVolume);
|
RtlStringCbCopyW (Extension->wszVolume, sizeof(Extension->wszVolume),pwszMountVolume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset (Extension->wszLabel, 0, sizeof (Extension->wszLabel));
|
||||||
|
RtlStringCbCopyW (Extension->wszLabel, sizeof(Extension->wszLabel), mount->wszLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are to protect a hidden volume we cannot exit yet, for we must also
|
// If we are to protect a hidden volume we cannot exit yet, for we must also
|
||||||
|
|||||||
@@ -55,6 +55,12 @@ namespace VeraCrypt
|
|||||||
if (favorite.Path.find ("\\??\\") == 0)
|
if (favorite.Path.find ("\\??\\") == 0)
|
||||||
favorite.Path = favorite.Path.substr (4);
|
favorite.Path = favorite.Path.substr (4);
|
||||||
|
|
||||||
|
if (wcslen (prop.wszLabel))
|
||||||
|
{
|
||||||
|
favorite.Label = prop.wszLabel;
|
||||||
|
favorite.UseLabelInExplorer = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (IsVolumeDeviceHosted (favorite.Path.c_str()))
|
if (IsVolumeDeviceHosted (favorite.Path.c_str()))
|
||||||
{
|
{
|
||||||
// Get GUID path
|
// Get GUID path
|
||||||
@@ -373,6 +379,9 @@ namespace VeraCrypt
|
|||||||
case IDC_FAVORITES_HELP_LINK:
|
case IDC_FAVORITES_HELP_LINK:
|
||||||
Applink (SystemFavoritesMode ? "sysfavorites" : "favorites", TRUE, "");
|
Applink (SystemFavoritesMode ? "sysfavorites" : "favorites", TRUE, "");
|
||||||
return 1;
|
return 1;
|
||||||
|
case IDC_SHOW_PIM:
|
||||||
|
HandleShowPasswordFieldAction (hwndDlg, IDC_SHOW_PIM, IDC_PIM, 0);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -472,20 +481,27 @@ namespace VeraCrypt
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wstring GetFavoriteVolumeLabel (const string &volumePath)
|
wstring GetFavoriteVolumeLabel (const string &volumePath, bool& useInExplorer)
|
||||||
{
|
{
|
||||||
foreach (const FavoriteVolume &favorite, FavoriteVolumes)
|
foreach (const FavoriteVolume &favorite, FavoriteVolumes)
|
||||||
{
|
{
|
||||||
if (favorite.Path == volumePath)
|
if (favorite.Path == volumePath)
|
||||||
|
{
|
||||||
|
useInExplorer = favorite.UseLabelInExplorer;
|
||||||
return favorite.Label;
|
return favorite.Label;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (const FavoriteVolume &favorite, SystemFavoriteVolumes)
|
foreach (const FavoriteVolume &favorite, SystemFavoriteVolumes)
|
||||||
{
|
{
|
||||||
if (favorite.Path == volumePath)
|
if (favorite.Path == volumePath)
|
||||||
|
{
|
||||||
|
useInExplorer = favorite.UseLabelInExplorer;
|
||||||
return favorite.Label;
|
return favorite.Label;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useInExplorer = false;
|
||||||
return wstring();
|
return wstring();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -592,6 +608,10 @@ namespace VeraCrypt
|
|||||||
if (boolVal[0])
|
if (boolVal[0])
|
||||||
favorite.MountOnLogOn = (boolVal[0] == '1');
|
favorite.MountOnLogOn = (boolVal[0] == '1');
|
||||||
|
|
||||||
|
XmlGetAttributeText (xml, "useLabelInExplorer", boolVal, sizeof (boolVal));
|
||||||
|
if (boolVal[0])
|
||||||
|
favorite.UseLabelInExplorer = (boolVal[0] == '1') && !favorite.ReadOnly;
|
||||||
|
|
||||||
if (favorite.Path.find ("\\\\?\\Volume{") == 0 && favorite.Path.rfind ("}\\") == favorite.Path.size() - 2)
|
if (favorite.Path.find ("\\\\?\\Volume{") == 0 && favorite.Path.rfind ("}\\") == favorite.Path.size() - 2)
|
||||||
{
|
{
|
||||||
string resolvedPath = VolumeGuidPathToDevicePath (favorite.Path);
|
string resolvedPath = VolumeGuidPathToDevicePath (favorite.Path);
|
||||||
@@ -716,6 +736,9 @@ namespace VeraCrypt
|
|||||||
if (favorite.OpenExplorerWindow)
|
if (favorite.OpenExplorerWindow)
|
||||||
s += L" openExplorerWindow=\"1\"";
|
s += L" openExplorerWindow=\"1\"";
|
||||||
|
|
||||||
|
if (favorite.UseLabelInExplorer && !favorite.ReadOnly)
|
||||||
|
s += L" useLabelInExplorer=\"1\"";
|
||||||
|
|
||||||
s += L">" + SingleStringToWide (tq) + L"</volume>";
|
s += L">" + SingleStringToWide (tq) + L"</volume>";
|
||||||
|
|
||||||
fwprintf (f, L"%ws", s.c_str());
|
fwprintf (f, L"%ws", s.c_str());
|
||||||
@@ -791,6 +814,7 @@ namespace VeraCrypt
|
|||||||
else
|
else
|
||||||
SetDlgItemText (hwndDlg, IDC_PIM, "");
|
SetDlgItemText (hwndDlg, IDC_PIM, "");
|
||||||
SetDlgItemTextW (hwndDlg, IDC_FAVORITE_LABEL, favorite.Label.c_str());
|
SetDlgItemTextW (hwndDlg, IDC_FAVORITE_LABEL, favorite.Label.c_str());
|
||||||
|
SetCheckBox (hwndDlg, IDC_FAVORITE_USE_LABEL_IN_EXPLORER, favorite.UseLabelInExplorer);
|
||||||
SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_ON_LOGON, favorite.MountOnLogOn);
|
SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_ON_LOGON, favorite.MountOnLogOn);
|
||||||
SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_ON_ARRIVAL, favorite.MountOnArrival);
|
SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_ON_ARRIVAL, favorite.MountOnArrival);
|
||||||
SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_READONLY, favorite.ReadOnly);
|
SetCheckBox (hwndDlg, IDC_FAVORITE_MOUNT_READONLY, favorite.ReadOnly);
|
||||||
@@ -820,6 +844,7 @@ namespace VeraCrypt
|
|||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_PIM_HELP), enable);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_PIM_HELP), enable);
|
||||||
EnableWindow (GetDlgItem (hwndDlg, IDT_FAVORITE_LABEL), enable);
|
EnableWindow (GetDlgItem (hwndDlg, IDT_FAVORITE_LABEL), enable);
|
||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_LABEL), enable);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_LABEL), enable);
|
||||||
|
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_USE_LABEL_IN_EXPLORER), enable);
|
||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_ON_LOGON), enable && !systemFavoritesMode);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_ON_LOGON), enable && !systemFavoritesMode);
|
||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_ON_ARRIVAL), enable && !systemFavoritesMode);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_ON_ARRIVAL), enable && !systemFavoritesMode);
|
||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_READONLY), enable);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_FAVORITE_MOUNT_READONLY), enable);
|
||||||
@@ -846,6 +871,7 @@ namespace VeraCrypt
|
|||||||
favorite.Label.clear();
|
favorite.Label.clear();
|
||||||
|
|
||||||
favorite.Pim = GetPim (hwndDlg, IDC_PIM);
|
favorite.Pim = GetPim (hwndDlg, IDC_PIM);
|
||||||
|
favorite.UseLabelInExplorer = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_USE_LABEL_IN_EXPLORER) != 0);
|
||||||
|
|
||||||
favorite.ReadOnly = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_MOUNT_READONLY) != 0);
|
favorite.ReadOnly = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_MOUNT_READONLY) != 0);
|
||||||
favorite.Removable = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_MOUNT_REMOVABLE) != 0);
|
favorite.Removable = (IsDlgButtonChecked (hwndDlg, IDC_FAVORITE_MOUNT_REMOVABLE) != 0);
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ namespace VeraCrypt
|
|||||||
OpenExplorerWindow (false),
|
OpenExplorerWindow (false),
|
||||||
ReadOnly (false),
|
ReadOnly (false),
|
||||||
Removable (false),
|
Removable (false),
|
||||||
SystemEncryption (false)
|
SystemEncryption (false),
|
||||||
|
UseLabelInExplorer (false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,6 +48,7 @@ namespace VeraCrypt
|
|||||||
bool ReadOnly;
|
bool ReadOnly;
|
||||||
bool Removable;
|
bool Removable;
|
||||||
bool SystemEncryption;
|
bool SystemEncryption;
|
||||||
|
bool UseLabelInExplorer;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FavoriteVolumesDlgProcArguments
|
struct FavoriteVolumesDlgProcArguments
|
||||||
@@ -67,7 +69,7 @@ namespace VeraCrypt
|
|||||||
static void FillFavoriteVolumesMenu ();
|
static void FillFavoriteVolumesMenu ();
|
||||||
static void FillListControl (HWND favoriteListControl, vector <FavoriteVolume> &favorites);
|
static void FillListControl (HWND favoriteListControl, vector <FavoriteVolume> &favorites);
|
||||||
static void FillListControlSubItems (HWND favoriteListControl, int line, const FavoriteVolume &favorite);
|
static void FillListControlSubItems (HWND favoriteListControl, int line, const FavoriteVolume &favorite);
|
||||||
wstring GetFavoriteVolumeLabel (const string &volumePath);
|
wstring GetFavoriteVolumeLabel (const string &volumePath, bool& useInExplorer);
|
||||||
void LoadFavoriteVolumes ();
|
void LoadFavoriteVolumes ();
|
||||||
void LoadFavoriteVolumes (vector <FavoriteVolume> &favorites, bool systemFavorites, bool noUacElevation = false);
|
void LoadFavoriteVolumes (vector <FavoriteVolume> &favorites, bool systemFavorites, bool noUacElevation = false);
|
||||||
static void OnFavoriteVolumesUpdated ();
|
static void OnFavoriteVolumesUpdated ();
|
||||||
|
|||||||
@@ -1589,7 +1589,11 @@ void LoadDriveLetters (HWND hwndDlg, HWND hTree, int drive)
|
|||||||
|
|
||||||
listItem.iSubItem = 1;
|
listItem.iSubItem = 1;
|
||||||
|
|
||||||
wstring label = GetFavoriteVolumeLabel (path);
|
// first check label used for mounting. If empty, look for it in favorites.
|
||||||
|
bool useInExplorer = false;
|
||||||
|
wstring label = (wchar_t *) driver.wszLabel[i];
|
||||||
|
if (label.empty())
|
||||||
|
label = GetFavoriteVolumeLabel (path, useInExplorer);
|
||||||
if (!label.empty())
|
if (!label.empty())
|
||||||
ListSubItemSetW (hTree, listItem.iItem, 1, (wchar_t *) label.c_str());
|
ListSubItemSetW (hTree, listItem.iItem, 1, (wchar_t *) label.c_str());
|
||||||
else
|
else
|
||||||
@@ -2509,10 +2513,13 @@ BOOL CALLBACK PasswordDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPa
|
|||||||
RECT rect;
|
RECT rect;
|
||||||
GetWindowRect (hwndDlg, &rect);
|
GetWindowRect (hwndDlg, &rect);
|
||||||
|
|
||||||
wstring label = GetFavoriteVolumeLabel (PasswordDlgVolume);
|
bool useInExplorer = false;
|
||||||
|
wstring label = GetFavoriteVolumeLabel (PasswordDlgVolume, useInExplorer);
|
||||||
if (!label.empty())
|
if (!label.empty())
|
||||||
{
|
{
|
||||||
StringCbPrintfW (s, sizeof(s), GetString ("ENTER_PASSWORD_FOR_LABEL"), label.c_str());
|
StringCbPrintfW (s, sizeof(s), GetString ("ENTER_PASSWORD_FOR_LABEL"), label.c_str());
|
||||||
|
if (useInExplorer)
|
||||||
|
StringCbCopyW (mountOptions.Label, sizeof (mountOptions.Label), label.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3160,6 +3167,9 @@ BOOL CALLBACK MountOptionsDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
|
|||||||
|
|
||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_MOUNT_SYSENC_PART_WITHOUT_PBA), !bPrebootPasswordDlgMode);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_MOUNT_SYSENC_PART_WITHOUT_PBA), !bPrebootPasswordDlgMode);
|
||||||
|
|
||||||
|
SetDlgItemTextW (hwndDlg, IDC_VOLUME_LABEL, mountOptions->Label);
|
||||||
|
SendDlgItemMessage (hwndDlg, IDC_VOLUME_LABEL, EM_LIMITTEXT, 32, 0); // 32 is the maximum possible length for a drive label in Windows
|
||||||
|
|
||||||
/* Add PRF algorithm list for hidden volume password */
|
/* Add PRF algorithm list for hidden volume password */
|
||||||
HWND hComboBox = GetDlgItem (hwndDlg, IDC_PKCS5_PRF_ID);
|
HWND hComboBox = GetDlgItem (hwndDlg, IDC_PKCS5_PRF_ID);
|
||||||
SendMessage (hComboBox, CB_RESETCONTENT, 0, 0);
|
SendMessage (hComboBox, CB_RESETCONTENT, 0, 0);
|
||||||
@@ -3302,6 +3312,8 @@ BOOL CALLBACK MountOptionsDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
|
|||||||
mountOptions->PartitionInInactiveSysEncScope = IsButtonChecked (GetDlgItem (hwndDlg, IDC_MOUNT_SYSENC_PART_WITHOUT_PBA));
|
mountOptions->PartitionInInactiveSysEncScope = IsButtonChecked (GetDlgItem (hwndDlg, IDC_MOUNT_SYSENC_PART_WITHOUT_PBA));
|
||||||
mountOptions->UseBackupHeader = IsButtonChecked (GetDlgItem (hwndDlg, IDC_USE_EMBEDDED_HEADER_BAK));
|
mountOptions->UseBackupHeader = IsButtonChecked (GetDlgItem (hwndDlg, IDC_USE_EMBEDDED_HEADER_BAK));
|
||||||
|
|
||||||
|
GetDlgItemTextW (hwndDlg, IDC_VOLUME_LABEL, mountOptions->Label, sizeof (mountOptions->Label) /sizeof (wchar_t));
|
||||||
|
|
||||||
if (mountOptions->ProtectHiddenVolume)
|
if (mountOptions->ProtectHiddenVolume)
|
||||||
{
|
{
|
||||||
GetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD_PROT_HIDVOL),
|
GetWindowText (GetDlgItem (hwndDlg, IDC_PASSWORD_PROT_HIDVOL),
|
||||||
@@ -4421,7 +4433,7 @@ static BOOL DismountAll (HWND hwndDlg, BOOL forceUnmount, BOOL interact, int dis
|
|||||||
DWORD dwResult;
|
DWORD dwResult;
|
||||||
UNMOUNT_STRUCT unmount = {0};
|
UNMOUNT_STRUCT unmount = {0};
|
||||||
BOOL bResult;
|
BOOL bResult;
|
||||||
unsigned __int32 prevMountedDrives = 0;
|
MOUNT_LIST_STRUCT prevMountList = {0};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
@@ -4437,7 +4449,7 @@ retry:
|
|||||||
|
|
||||||
BroadcastDeviceChange (DBT_DEVICEREMOVEPENDING, 0, mountList.ulMountedDrives);
|
BroadcastDeviceChange (DBT_DEVICEREMOVEPENDING, 0, mountList.ulMountedDrives);
|
||||||
|
|
||||||
prevMountedDrives = mountList.ulMountedDrives;
|
memcpy (&prevMountList, &mountList, sizeof (mountList));
|
||||||
|
|
||||||
for (i = 0; i < 26; i++)
|
for (i = 0; i < 26; i++)
|
||||||
{
|
{
|
||||||
@@ -4498,7 +4510,17 @@ retry:
|
|||||||
|
|
||||||
memset (&mountList, 0, sizeof (mountList));
|
memset (&mountList, 0, sizeof (mountList));
|
||||||
DeviceIoControl (hDriver, TC_IOCTL_GET_MOUNTED_VOLUMES, &mountList, sizeof (mountList), &mountList, sizeof (mountList), &dwResult, NULL);
|
DeviceIoControl (hDriver, TC_IOCTL_GET_MOUNTED_VOLUMES, &mountList, sizeof (mountList), &mountList, sizeof (mountList), &dwResult, NULL);
|
||||||
BroadcastDeviceChange (DBT_DEVICEREMOVECOMPLETE, 0, prevMountedDrives & ~mountList.ulMountedDrives);
|
|
||||||
|
// remove any custom label from registry
|
||||||
|
for (i = 0; i < 26; i++)
|
||||||
|
{
|
||||||
|
if ((prevMountList.ulMountedDrives & (1 << i)) && (!(mountList.ulMountedDrives & (1 << i))) && wcslen (prevMountList.wszLabel[i]))
|
||||||
|
{
|
||||||
|
UpdateDriveCustomLabel (i, prevMountList.wszLabel[i], FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BroadcastDeviceChange (DBT_DEVICEREMOVECOMPLETE, 0, prevMountList.ulMountedDrives & ~mountList.ulMountedDrives);
|
||||||
|
|
||||||
RefreshMainDlg (hwndDlg);
|
RefreshMainDlg (hwndDlg);
|
||||||
|
|
||||||
@@ -6395,7 +6417,11 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|||||||
|
|
||||||
if (wcsstr (vol, L"\\??\\")) vol += 4;
|
if (wcsstr (vol, L"\\??\\")) vol += 4;
|
||||||
|
|
||||||
wstring label = GetFavoriteVolumeLabel (WideToSingleString (vol));
|
// first check label used for mounting. If empty, look for it in favorites.
|
||||||
|
bool useInExplorer = false;
|
||||||
|
wstring label = (wchar_t *) LastKnownMountList.wszLabel[i];
|
||||||
|
if (label.empty())
|
||||||
|
label = GetFavoriteVolumeLabel (WideToSingleString (vol), useInExplorer);
|
||||||
|
|
||||||
StringCbPrintfW (s, sizeof(s), L"%s %c: (%s)",
|
StringCbPrintfW (s, sizeof(s), L"%s %c: (%s)",
|
||||||
GetString (n==0 ? "OPEN" : "DISMOUNT"),
|
GetString (n==0 ? "OPEN" : "DISMOUNT"),
|
||||||
@@ -7940,7 +7966,7 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
|
|||||||
|
|
||||||
case OptionMountOption:
|
case OptionMountOption:
|
||||||
{
|
{
|
||||||
char szTmp[16] = {0};
|
char szTmp[64] = {0};
|
||||||
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
|
if (HAS_ARGUMENT == GetArgumentValue (lpszCommandLineArgs,
|
||||||
&i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
|
&i, nNoCommandLineArgs, szTmp, sizeof (szTmp)))
|
||||||
{
|
{
|
||||||
@@ -7961,7 +7987,12 @@ void ExtractCommandLine (HWND hwndDlg, char *lpszCommandLine)
|
|||||||
|
|
||||||
else if (!_stricmp (szTmp, "recovery"))
|
else if (!_stricmp (szTmp, "recovery"))
|
||||||
mountOptions.RecoveryMode = TRUE;
|
mountOptions.RecoveryMode = TRUE;
|
||||||
|
else if ((strlen(szTmp) > 6) && (strlen(szTmp) <= 38) && !_strnicmp (szTmp, "label=", 6))
|
||||||
|
{
|
||||||
|
// get the label
|
||||||
|
memmove (szTmp, &szTmp[6], (strlen(szTmp) - 6) + 1);
|
||||||
|
MultiByteToWideChar (CP_ACP, 0, szTmp, -1, mountOptions.Label, sizeof (mountOptions.Label) / sizeof(wchar_t));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
AbortProcess ("COMMAND_LINE_ERROR");
|
AbortProcess ("COMMAND_LINE_ERROR");
|
||||||
|
|
||||||
@@ -8469,6 +8500,10 @@ static BOOL MountFavoriteVolumeBase (const FavoriteVolume &favorite, BOOL& lastb
|
|||||||
|
|
||||||
mountOptions.ReadOnly = favorite.ReadOnly || userForcedReadOnly;
|
mountOptions.ReadOnly = favorite.ReadOnly || userForcedReadOnly;
|
||||||
mountOptions.Removable = favorite.Removable;
|
mountOptions.Removable = favorite.Removable;
|
||||||
|
if (favorite.UseLabelInExplorer && !favorite.Label.empty())
|
||||||
|
StringCbCopyW (mountOptions.Label, sizeof (mountOptions.Label), favorite.Label.c_str());
|
||||||
|
else
|
||||||
|
ZeroMemory (mountOptions.Label, sizeof (mountOptions.Label));
|
||||||
|
|
||||||
if (favorite.SystemEncryption)
|
if (favorite.SystemEncryption)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -315,7 +315,7 @@ BEGIN
|
|||||||
LTEXT "",IDT_LIMIT_ENC_THREAD_POOL_NOTE,18,126,334,33
|
LTEXT "",IDT_LIMIT_ENC_THREAD_POOL_NOTE,18,126,334,33
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_FAVORITE_VOLUMES DIALOGEX 0, 0, 380, 315
|
IDD_FAVORITE_VOLUMES DIALOGEX 0, 0, 380, 339
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
CAPTION "VeraCrypt - Favorite Volumes"
|
CAPTION "VeraCrypt - Favorite Volumes"
|
||||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||||
@@ -324,28 +324,31 @@ BEGIN
|
|||||||
PUSHBUTTON "Move &Up",IDC_FAVORITE_MOVE_UP,7,104,63,14
|
PUSHBUTTON "Move &Up",IDC_FAVORITE_MOVE_UP,7,104,63,14
|
||||||
PUSHBUTTON "Move &Down",IDC_FAVORITE_MOVE_DOWN,74,104,63,14
|
PUSHBUTTON "Move &Down",IDC_FAVORITE_MOVE_DOWN,74,104,63,14
|
||||||
PUSHBUTTON "&Remove",IDC_FAVORITE_REMOVE,310,104,63,14
|
PUSHBUTTON "&Remove",IDC_FAVORITE_REMOVE,310,104,63,14
|
||||||
EDITTEXT IDC_FAVORITE_LABEL,16,173,204,13,ES_AUTOHSCROLL
|
EDITTEXT IDC_FAVORITE_LABEL,18,185,204,13,ES_AUTOHSCROLL
|
||||||
CONTROL "Mount selected volume as read-o&nly",IDC_FAVORITE_MOUNT_READONLY,
|
CONTROL "Mount selected volume as read-o&nly",IDC_FAVORITE_MOUNT_READONLY,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,193,349,10
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,215,349,10
|
||||||
CONTROL "Mount selected volume as remo&vable medium",IDC_FAVORITE_MOUNT_REMOVABLE,
|
CONTROL "Mount selected volume as remo&vable medium",IDC_FAVORITE_MOUNT_REMOVABLE,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,207,349,10
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,229,349,10
|
||||||
CONTROL "Mount selected volume upon log&on",IDC_FAVORITE_MOUNT_ON_LOGON,
|
CONTROL "Mount selected volume upon log&on",IDC_FAVORITE_MOUNT_ON_LOGON,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,221,349,10
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,243,349,10
|
||||||
CONTROL "Mount selected volume when its host device gets &connected",IDC_FAVORITE_MOUNT_ON_ARRIVAL,
|
CONTROL "Mount selected volume when its host device gets &connected",IDC_FAVORITE_MOUNT_ON_ARRIVAL,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,235,349,10
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,257,349,10
|
||||||
CONTROL "Open &Explorer window for selected volume when successfully mounted",IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT,
|
CONTROL "Open &Explorer window for selected volume when successfully mounted",IDC_FAVORITE_OPEN_EXPLORER_WIN_ON_MOUNT,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,249,349,11
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,271,349,11
|
||||||
CONTROL "Do not mount selected volume when 'Mount Favorite Volumes' &hot key is pressed",IDC_FAVORITE_DISABLE_HOTKEY,
|
CONTROL "Do not mount selected volume when 'Mount Favorite Volumes' &hot key is pressed",IDC_FAVORITE_DISABLE_HOTKEY,
|
||||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,264,349,11
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,286,349,11
|
||||||
LTEXT "Help on favorite volumes",IDC_FAVORITES_HELP_LINK,17,298,237,10,SS_NOTIFY
|
LTEXT "Help on favorite volumes",IDC_FAVORITES_HELP_LINK,17,322,237,10,SS_NOTIFY
|
||||||
DEFPUSHBUTTON "OK",IDOK,269,296,50,14
|
DEFPUSHBUTTON "OK",IDOK,269,318,50,14
|
||||||
PUSHBUTTON "Cancel",IDCANCEL,323,296,50,14
|
PUSHBUTTON "Cancel",IDCANCEL,323,318,50,14
|
||||||
GROUPBOX "",IDC_FAV_VOL_OPTIONS_GROUP_BOX,7,122,366,159
|
GROUPBOX "",IDC_FAV_VOL_OPTIONS_GROUP_BOX,7,122,366,159
|
||||||
LTEXT "Label of selected favorite volume:",IDT_FAVORITE_LABEL,18,163,202,8
|
LTEXT "Label of selected favorite volume:",IDT_FAVORITE_LABEL,18,175,202,8
|
||||||
GROUPBOX "Global Settings",IDC_FAV_VOL_OPTIONS_GLOBAL_SETTINGS_BOX,7,230,366,57
|
GROUPBOX "Global Settings",IDC_FAV_VOL_OPTIONS_GLOBAL_SETTINGS_BOX,7,252,366,57
|
||||||
EDITTEXT IDC_PIM,16,143,42,14,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER
|
EDITTEXT IDC_PIM,18,143,42,13,ES_RIGHT | ES_PASSWORD | ES_AUTOHSCROLL | ES_NUMBER
|
||||||
LTEXT "(Empty or 0 for default iterations)",IDC_PIM_HELP,64,145,189,8
|
LTEXT "(Empty or 0 for default iterations)",IDC_PIM_HELP,64,145,189,8
|
||||||
LTEXT "Volume PIM:",IDT_PIM,18,133,65,8
|
LTEXT "Volume PIM:",IDT_PIM,18,133,65,8
|
||||||
|
CONTROL "Display PIM",IDC_SHOW_PIM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,159,150,10
|
||||||
|
CONTROL "Use favorite label as Explorer drive label",IDC_FAVORITE_USE_LABEL_IN_EXPLORER,
|
||||||
|
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,202,203,10
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_DEFAULT_MOUNT_PARAMETERS DIALOGEX 0, 0, 167, 65
|
IDD_DEFAULT_MOUNT_PARAMETERS DIALOGEX 0, 0, 167, 65
|
||||||
@@ -449,7 +452,7 @@ BEGIN
|
|||||||
LEFTMARGIN, 7
|
LEFTMARGIN, 7
|
||||||
RIGHTMARGIN, 373
|
RIGHTMARGIN, 373
|
||||||
TOPMARGIN, 7
|
TOPMARGIN, 7
|
||||||
BOTTOMMARGIN, 308
|
BOTTOMMARGIN, 332
|
||||||
END
|
END
|
||||||
|
|
||||||
IDD_DEFAULT_MOUNT_PARAMETERS, DIALOG
|
IDD_DEFAULT_MOUNT_PARAMETERS, DIALOG
|
||||||
|
|||||||
@@ -167,6 +167,8 @@
|
|||||||
#define IDC_OLD_PIM 1143
|
#define IDC_OLD_PIM 1143
|
||||||
#define IDC_OLD_PIM_HELP 1144
|
#define IDC_OLD_PIM_HELP 1144
|
||||||
#define IDC_NEW_PIM_ENABLE 1145
|
#define IDC_NEW_PIM_ENABLE 1145
|
||||||
|
#define IDC_SHOW_PIM 1146
|
||||||
|
#define IDC_FAVORITE_USE_LABEL_IN_EXPLORER 1147
|
||||||
#define IDM_HELP 40001
|
#define IDM_HELP 40001
|
||||||
#define IDM_ABOUT 40002
|
#define IDM_ABOUT 40002
|
||||||
#define IDM_UNMOUNT_VOLUME 40003
|
#define IDM_UNMOUNT_VOLUME 40003
|
||||||
@@ -242,7 +244,7 @@
|
|||||||
#define _APS_NO_MFC 1
|
#define _APS_NO_MFC 1
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 119
|
#define _APS_NEXT_RESOURCE_VALUE 119
|
||||||
#define _APS_NEXT_COMMAND_VALUE 40068
|
#define _APS_NEXT_COMMAND_VALUE 40068
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1146
|
#define _APS_NEXT_CONTROL_VALUE 1148
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user