VeraCrypt
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 bfaf11f9..1cfe6fd6 100644
--- a/src/Common/BootEncryption.cpp
+++ b/src/Common/BootEncryption.cpp
@@ -4103,6 +4103,8 @@ namespace VeraCrypt
4103 std::vector<byte> bootLoaderBuf; 4103 std::vector<byte> bootLoaderBuf;
4104 const wchar_t * szStdEfiBootloader = Is64BitOs()? L"\\EFI\\Boot\\bootx64.efi": L"\\EFI\\Boot\\bootia32.efi"; 4104 const wchar_t * szStdEfiBootloader = Is64BitOs()? L"\\EFI\\Boot\\bootx64.efi": L"\\EFI\\Boot\\bootia32.efi";
4105 const wchar_t * szBackupEfiBootloader = Is64BitOs()? L"\\EFI\\Boot\\original_bootx64.vc_backup": L"\\EFI\\Boot\\original_bootia32.vc_backup"; 4105 const wchar_t * szBackupEfiBootloader = Is64BitOs()? L"\\EFI\\Boot\\original_bootx64.vc_backup": L"\\EFI\\Boot\\original_bootia32.vc_backup";
4106 const wchar_t * szStdMsBootloader = L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi";
4107 const wchar_t * szBackupMsBootloader = L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc";
4106 const char* g_szMsBootString = "bootmgfw.pdb"; 4108 const char* g_szMsBootString = "bootmgfw.pdb";
4107 bool bModifiedMsBoot = true; 4109 bool bModifiedMsBoot = true;
4108 4110
@@ -4110,9 +4112,9 @@ namespace VeraCrypt
4110 4112
4111 EfiBootInst.MountBootPartition(0); 4113 EfiBootInst.MountBootPartition(0);
4112 4114
4113 EfiBootInst.GetFileSize(L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", loaderSize); 4115 EfiBootInst.GetFileSize(szStdMsBootloader, loaderSize);
4114 bootLoaderBuf.resize ((size_t) loaderSize); 4116 bootLoaderBuf.resize ((size_t) loaderSize);
4115 EfiBootInst.ReadFile(L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", &bootLoaderBuf[0], (DWORD) loaderSize); 4117 EfiBootInst.ReadFile(szStdMsBootloader, &bootLoaderBuf[0], (DWORD) loaderSize);
4116 4118
4117 // DcsBoot.efi is always smaller than 32KB 4119 // DcsBoot.efi is always smaller than 32KB
4118 if (loaderSize > 32768) 4120 if (loaderSize > 32768)
@@ -4127,7 +4129,24 @@ namespace VeraCrypt
4127 { 4129 {
4128 if (AskWarnNoYes ("TC_BOOT_LOADER_ALREADY_INSTALLED", ParentWindow) == IDNO) 4130 if (AskWarnNoYes ("TC_BOOT_LOADER_ALREADY_INSTALLED", ParentWindow) == IDNO)
4129 throw UserAbort (SRC_POS); 4131 throw UserAbort (SRC_POS);
4130 return; 4132
4133 // check if backup exists already and if it has bootmgfw signature
4134 if (EfiBootInst.FileExists (szBackupMsBootloader))
4135 {
4136 EfiBootInst.GetFileSize(szBackupMsBootloader, loaderSize);
4137 bootLoaderBuf.resize ((size_t) loaderSize);
4138 EfiBootInst.ReadFile(szBackupMsBootloader, &bootLoaderBuf[0], (DWORD) loaderSize);
4139
4140 if (BufferHasPattern (bootLoaderBuf.data (), (size_t) loaderSize, g_szMsBootString, strlen (g_szMsBootString)))
4141 {
4142 // copy it to original location
4143 EfiBootInst.CopyFile (szBackupMsBootloader, szStdMsBootloader);
4144 bModifiedMsBoot = false;
4145 }
4146 }
4147
4148 if (bModifiedMsBoot)
4149 return;
4131 } 4150 }
4132 } 4151 }
4133 4152
@@ -4137,7 +4156,7 @@ namespace VeraCrypt
4137 throw UserAbort (SRC_POS); 4156 throw UserAbort (SRC_POS);
4138 } 4157 }
4139 4158
4140 EfiBootInst.CopyFile (L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc"); 4159 EfiBootInst.CopyFile (szStdMsBootloader, szBackupMsBootloader);
4141 4160
4142 if (EfiBootInst.FileExists (szStdEfiBootloader)) 4161 if (EfiBootInst.FileExists (szStdEfiBootloader))
4143 { 4162 {
@@ -4152,6 +4171,14 @@ namespace VeraCrypt
4152 { 4171 {
4153 if (AskWarnNoYes ("TC_BOOT_LOADER_ALREADY_INSTALLED", ParentWindow) == IDNO) 4172 if (AskWarnNoYes ("TC_BOOT_LOADER_ALREADY_INSTALLED", ParentWindow) == IDNO)
4154 throw UserAbort (SRC_POS); 4173 throw UserAbort (SRC_POS);
4174
4175 // check if backup exists already and if it has bootmgfw signature
4176 if (EfiBootInst.FileExists (szBackupEfiBootloader))
4177 {
4178 // perform the backup on disk using this file
4179 EfiBootInst.CopyFile (szBackupEfiBootloader, GetSystemLoaderBackupPath().c_str());
4180 }
4181
4155 return; 4182 return;
4156 } 4183 }
4157 4184
@@ -4159,7 +4186,7 @@ namespace VeraCrypt
4159 EfiBootInst.CopyFile (szStdEfiBootloader, szBackupEfiBootloader); 4186 EfiBootInst.CopyFile (szStdEfiBootloader, szBackupEfiBootloader);
4160 } 4187 }
4161 else 4188 else
4162 EfiBootInst.CopyFile (L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", GetSystemLoaderBackupPath().c_str()); 4189 EfiBootInst.CopyFile (szStdMsBootloader, GetSystemLoaderBackupPath().c_str());
4163 4190
4164 } 4191 }
4165 else 4192 else