VeraCrypt
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Common/BootEncryption.cpp48
-rw-r--r--src/Common/BootEncryption.h2
-rw-r--r--src/Format/Tcformat.c2
3 files changed, 30 insertions, 22 deletions
diff --git a/src/Common/BootEncryption.cpp b/src/Common/BootEncryption.cpp
index 02affc89..d84dd05d 100644
--- a/src/Common/BootEncryption.cpp
+++ b/src/Common/BootEncryption.cpp
@@ -1743,16 +1743,18 @@ namespace VeraCrypt
- bool BootEncryption::IsCDDrivePresent ()
+ bool BootEncryption::IsCDRecorderPresent ()
{
- for (char drive = 'Z'; drive >= 'C'; --drive)
- {
- string path = "X:\\";
- path[0] = drive;
+ ICDBurn* pICDBurn;
+ BOOL bHasRecorder = FALSE;
- if (GetDriveType (path.c_str()) == DRIVE_CDROM)
- return true;
+ if (SUCCEEDED( CoCreateInstance (CLSID_CDBurn, NULL,CLSCTX_INPROC_SERVER,IID_ICDBurn,(LPVOID*)&pICDBurn)))
+ {
+ if (pICDBurn->HasRecordableDrive (&bHasRecorder) != S_OK)
+ {
+ bHasRecorder = FALSE;
+ }
+ pICDBurn->Release();
}
-
- return false;
+ return bHasRecorder? true : false;
}
@@ -1767,18 +1769,24 @@ namespace VeraCrypt
try
{
- string path = "X:";
- path[0] = drive;
+ char rootPath[4] = { drive, ':', '\\', 0};
+ UINT driveType = GetDriveTypeA (rootPath);
+ // check that it is a CD/DVD drive or a removable media in case a bootable
+ // USB key was created from the rescue disk ISO file
+ if ((DRIVE_CDROM == driveType) || (DRIVE_REMOVABLE == driveType))
+ {
+ rootPath[2] = 0; // remove trailing backslash
- Device driveDevice (path, true);
- driveDevice.CheckOpened (SRC_POS);
- size_t verifiedSectorCount = (TC_CD_BOOTSECTOR_OFFSET + TC_ORIG_BOOT_LOADER_BACKUP_SECTOR_OFFSET + TC_BOOT_LOADER_AREA_SIZE) / 2048;
- Buffer buffer ((verifiedSectorCount + 1) * 2048);
+ Device driveDevice (rootPath, true);
+ driveDevice.CheckOpened (SRC_POS);
+ size_t verifiedSectorCount = (TC_CD_BOOTSECTOR_OFFSET + TC_ORIG_BOOT_LOADER_BACKUP_SECTOR_OFFSET + TC_BOOT_LOADER_AREA_SIZE) / 2048;
+ Buffer buffer ((verifiedSectorCount + 1) * 2048);
- DWORD bytesRead = driveDevice.Read (buffer.Ptr(), (DWORD) buffer.Size());
- if (bytesRead != buffer.Size())
- continue;
+ DWORD bytesRead = driveDevice.Read (buffer.Ptr(), (DWORD) buffer.Size());
+ if (bytesRead != buffer.Size())
+ continue;
- if (memcmp (buffer.Ptr(), RescueIsoImage, buffer.Size()) == 0)
- return true;
+ if (memcmp (buffer.Ptr(), RescueIsoImage, buffer.Size()) == 0)
+ return true;
+ }
}
catch (...) { }
diff --git a/src/Common/BootEncryption.h b/src/Common/BootEncryption.h
index 561e1723..eb546de2 100644
--- a/src/Common/BootEncryption.h
+++ b/src/Common/BootEncryption.h
@@ -175,5 +175,5 @@ namespace VeraCrypt
bool CheckBootloaderFingerprint (bool bSilent = false);
void InvalidateCachedSysDriveProperties ();
- bool IsCDDrivePresent ();
+ bool IsCDRecorderPresent ();
bool IsHiddenSystemRunning ();
bool IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly);
diff --git a/src/Format/Tcformat.c b/src/Format/Tcformat.c
index 7dd34196..54196dee 100644
--- a/src/Format/Tcformat.c
+++ b/src/Format/Tcformat.c
@@ -7780,5 +7780,5 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
retryCDDriveCheck:
- if (!bDontVerifyRescueDisk && !BootEncObj->IsCDDrivePresent())
+ if (!bDontVerifyRescueDisk && !BootEncObj->IsCDRecorderPresent())
{
char *multiChoiceStr[] = { 0, "CD_BURNER_NOT_PRESENT",