From 52c7445a795a623bc326699a5c465e8fa5294425 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Tue, 15 Sep 2015 23:12:56 +0200 Subject: 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. --- src/Common/BootEncryption.cpp | 48 +++++++++++++++++++++++++------------------ src/Common/BootEncryption.h | 2 +- 2 files changed, 29 insertions(+), 21 deletions(-) (limited to 'src/Common') 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 (...) { } } 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 @@ -174,7 +174,7 @@ namespace VeraCrypt void InstallBootLoader (bool preserveUserConfig = false, bool hiddenOSCreation = false); bool CheckBootloaderFingerprint (bool bSilent = false); void InvalidateCachedSysDriveProperties (); - bool IsCDDrivePresent (); + bool IsCDRecorderPresent (); bool IsHiddenSystemRunning (); bool IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly); void PrepareHiddenOSCreation (int ea, int mode, int pkcs5); -- cgit v1.2.3