VeraCrypt
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2018-09-02 22:06:27 (GMT)
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2018-09-02 23:00:55 (GMT)
commit8f47adfff187baea80ca58f9456f9533291ee388 (patch)
treedbb4468379c79468a997ae243fc493b9cffd63d5
parentd3060a97b68636ee3143ec1c02bbaaf3f3549131 (diff)
downloadVeraCrypt-8f47adfff187baea80ca58f9456f9533291ee388.zip
VeraCrypt-8f47adfff187baea80ca58f9456f9533291ee388.tar.gz
Windows: handle case of inconsistencies in EFI system partition content during system encryption wizard caused by older VeraCrypt system encryption not properly uninstalled (e.g. reinstall Windows without decryption first).
-rw-r--r--src/Common/BootEncryption.cpp37
1 files changed, 32 insertions, 5 deletions
diff --git a/src/Common/BootEncryption.cpp b/src/Common/BootEncryption.cpp
index bfaf11f..1cfe6fd 100644
--- a/src/Common/BootEncryption.cpp
+++ b/src/Common/BootEncryption.cpp
@@ -4103,6 +4103,8 @@ namespace VeraCrypt
std::vector<byte> bootLoaderBuf;
const wchar_t * szStdEfiBootloader = Is64BitOs()? L"\\EFI\\Boot\\bootx64.efi": L"\\EFI\\Boot\\bootia32.efi";
const wchar_t * szBackupEfiBootloader = Is64BitOs()? L"\\EFI\\Boot\\original_bootx64.vc_backup": L"\\EFI\\Boot\\original_bootia32.vc_backup";
+ const wchar_t * szStdMsBootloader = L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi";
+ const wchar_t * szBackupMsBootloader = L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc";
const char* g_szMsBootString = "bootmgfw.pdb";
bool bModifiedMsBoot = true;
@@ -4110,9 +4112,9 @@ namespace VeraCrypt
EfiBootInst.MountBootPartition(0);
- EfiBootInst.GetFileSize(L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", loaderSize);
+ EfiBootInst.GetFileSize(szStdMsBootloader, loaderSize);
bootLoaderBuf.resize ((size_t) loaderSize);
- EfiBootInst.ReadFile(L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", &bootLoaderBuf[0], (DWORD) loaderSize);
+ EfiBootInst.ReadFile(szStdMsBootloader, &bootLoaderBuf[0], (DWORD) loaderSize);
// DcsBoot.efi is always smaller than 32KB
if (loaderSize > 32768)
@@ -4127,7 +4129,24 @@ namespace VeraCrypt
{
if (AskWarnNoYes ("TC_BOOT_LOADER_ALREADY_INSTALLED", ParentWindow) == IDNO)
throw UserAbort (SRC_POS);
- return;
+
+ // check if backup exists already and if it has bootmgfw signature
+ if (EfiBootInst.FileExists (szBackupMsBootloader))
+ {
+ EfiBootInst.GetFileSize(szBackupMsBootloader, loaderSize);
+ bootLoaderBuf.resize ((size_t) loaderSize);
+ EfiBootInst.ReadFile(szBackupMsBootloader, &bootLoaderBuf[0], (DWORD) loaderSize);
+
+ if (BufferHasPattern (bootLoaderBuf.data (), (size_t) loaderSize, g_szMsBootString, strlen (g_szMsBootString)))
+ {
+ // copy it to original location
+ EfiBootInst.CopyFile (szBackupMsBootloader, szStdMsBootloader);
+ bModifiedMsBoot = false;
+ }
+ }
+
+ if (bModifiedMsBoot)
+ return;
}
}
@@ -4137,7 +4156,7 @@ namespace VeraCrypt
throw UserAbort (SRC_POS);
}
- EfiBootInst.CopyFile (L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc");
+ EfiBootInst.CopyFile (szStdMsBootloader, szBackupMsBootloader);
if (EfiBootInst.FileExists (szStdEfiBootloader))
{
@@ -4152,6 +4171,14 @@ namespace VeraCrypt
{
if (AskWarnNoYes ("TC_BOOT_LOADER_ALREADY_INSTALLED", ParentWindow) == IDNO)
throw UserAbort (SRC_POS);
+
+ // check if backup exists already and if it has bootmgfw signature
+ if (EfiBootInst.FileExists (szBackupEfiBootloader))
+ {
+ // perform the backup on disk using this file
+ EfiBootInst.CopyFile (szBackupEfiBootloader, GetSystemLoaderBackupPath().c_str());
+ }
+
return;
}
@@ -4159,7 +4186,7 @@ namespace VeraCrypt
EfiBootInst.CopyFile (szStdEfiBootloader, szBackupEfiBootloader);
}
else
- EfiBootInst.CopyFile (L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", GetSystemLoaderBackupPath().c_str());
+ EfiBootInst.CopyFile (szStdMsBootloader, GetSystemLoaderBackupPath().c_str());
}
else