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.
This commit is contained in:
parent
db80c02342
commit
52c7445a79
|
@ -1742,18 +1742,20 @@ namespace VeraCrypt
|
|||
#endif
|
||||
|
||||
|
||||
bool BootEncryption::IsCDDrivePresent ()
|
||||
bool BootEncryption::IsCDRecorderPresent ()
|
||||
{
|
||||
for (char drive = 'Z'; drive >= 'C'; --drive)
|
||||
ICDBurn* pICDBurn;
|
||||
BOOL bHasRecorder = FALSE;
|
||||
|
||||
if (SUCCEEDED( CoCreateInstance (CLSID_CDBurn, NULL,CLSCTX_INPROC_SERVER,IID_ICDBurn,(LPVOID*)&pICDBurn)))
|
||||
{
|
||||
string path = "X:\\";
|
||||
path[0] = drive;
|
||||
|
||||
if (GetDriveType (path.c_str()) == DRIVE_CDROM)
|
||||
return true;
|
||||
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 (...) { }
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -7779,7 +7779,7 @@ 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",
|
||||
"CD_BURNER_NOT_PRESENT_WILL_STORE_ISO",
|
||||
|
|
Loading…
Reference in New Issue