diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2015-09-15 23:12:56 +0200 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2015-09-16 01:33:16 +0200 |
commit | 52c7445a795a623bc326699a5c465e8fa5294425 (patch) | |
tree | f8f8e18295107d4e90c49243f51f3800154d596d /src/Common/BootEncryption.cpp | |
parent | db80c0234236dc9beff60b4c47b5627dbfb99bd2 (diff) | |
download | VeraCrypt-52c7445a795a623bc326699a5c465e8fa5294425.tar.gz VeraCrypt-52c7445a795a623bc326699a5c465e8fa5294425.zip |
Windows: Correctly detect presence of CD/DVD recorder during the creation of Rescue Disk. Check only CD/DVD drives and removable media when looking for rescue disk during its verification.
Diffstat (limited to 'src/Common/BootEncryption.cpp')
-rw-r--r-- | src/Common/BootEncryption.cpp | 48 |
1 files changed, 28 insertions, 20 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 @@ -1742,18 +1742,20 @@ namespace VeraCrypt #endif
- 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;
}
@@ -1766,20 +1768,26 @@ 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 (...) { }
}
|