diff options
-rw-r--r-- | src/Common/BootEncryption.cpp | 37 |
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 |