VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Common/BootEncryption.cpp
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2019-01-12 01:24:25 +0100
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2019-01-14 10:49:05 +0100
commitd3e7ed96f3685d83dcc39a18574be1dd2cc8f2f6 (patch)
treec31143436e3db3164f51fcb4f669ab8e4175610a /src/Common/BootEncryption.cpp
parent69cb0bea8197fbb2031371a1f71b9a1c94f93b27 (diff)
downloadVeraCrypt-d3e7ed96f3685d83dcc39a18574be1dd2cc8f2f6.tar.gz
VeraCrypt-d3e7ed96f3685d83dcc39a18574be1dd2cc8f2f6.zip
Windows: Implement feature that enables clearing of encryption keys when a new device is inserted. Better implementation for update of EFI bootloader without usage of drive letters (this can fix random issues encountered during Windows upgrade).
Diffstat (limited to 'src/Common/BootEncryption.cpp')
-rw-r--r--src/Common/BootEncryption.cpp74
1 files changed, 23 insertions, 51 deletions
diff --git a/src/Common/BootEncryption.cpp b/src/Common/BootEncryption.cpp
index 4992e086..364f0869 100644
--- a/src/Common/BootEncryption.cpp
+++ b/src/Common/BootEncryption.cpp
@@ -994,10 +994,16 @@ namespace VeraCrypt
Device::Device (wstring path, bool readOnly)
{
- FileOpen = false;
- Elevated = false;
+ wstring effectivePath;
+ FileOpen = false;
+ Elevated = false;
+
+ if (path.find(L"\\\\?\\") == 0)
+ effectivePath = path;
+ else
+ effectivePath = wstring (L"\\\\.\\") + path;
- Handle = CreateFile ((wstring (L"\\\\.\\") + path).c_str(),
+ Handle = CreateFile (effectivePath.c_str(),
readOnly ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS | FILE_FLAG_WRITE_THROUGH, NULL);
@@ -1978,8 +1984,7 @@ namespace VeraCrypt
}
else
{
- finally_do ({ EfiBootInst.DismountBootPartition(); });
- EfiBootInst.MountBootPartition(0);
+ EfiBootInst.PrepareBootPartition();
if (! (userConfig & TC_BOOT_USER_CFG_FLAG_DISABLE_PIM))
pim = -1;
@@ -2492,8 +2497,6 @@ namespace VeraCrypt
}
EfiBoot::EfiBoot() {
- ZeroMemory(EfiBootPartPath, sizeof(EfiBootPartPath));
- ZeroMemory (BootVolumePath, sizeof (BootVolumePath));
ZeroMemory (&sdn, sizeof (sdn));
ZeroMemory (&partInfo, sizeof (partInfo));
m_bMounted = false;
@@ -2521,34 +2524,21 @@ namespace VeraCrypt
}
PUNICODE_STRING pStr = (PUNICODE_STRING) tempBuf;
- memcpy (BootVolumePath, pStr->Buffer, min (pStr->Length, (sizeof (BootVolumePath) - 2)));
- bBootVolumePathSelected = true;
- }
+ BootVolumePath = pStr->Buffer;
+
+ EfiBootPartPath = L"\\\\?";
+ EfiBootPartPath += &pStr->Buffer[7];
- void EfiBoot::SelectBootVolume(WCHAR* bootVolumePath) {
- wstring str;
- str = bootVolumePath;
- memcpy (BootVolumePath, &str[0], min (str.length() * 2, (sizeof (BootVolumePath) - 2)));
bBootVolumePathSelected = true;
}
- void EfiBoot::MountBootPartition(WCHAR letter) {
+ void EfiBoot::PrepareBootPartition() {
if (!bBootVolumePathSelected) {
SelectBootVolumeESP();
}
-
- if (!letter) {
- if (!GetFreeDriveLetter(&EfiBootPartPath[0])) {
- throw ErrorException(L"No free letter to mount EFI boot partition", SRC_POS);
- }
- } else {
- EfiBootPartPath[0] = letter;
- }
- EfiBootPartPath[1] = ':';
- EfiBootPartPath[2] = 0;
- throw_sys_if(!DefineDosDevice(DDD_RAW_TARGET_PATH, EfiBootPartPath, BootVolumePath));
-
- Device dev(EfiBootPartPath, TRUE);
+ std::wstring devicePath = L"\\\\?\\GLOBALROOT";
+ devicePath += BootVolumePath;
+ Device dev(devicePath.c_str(), TRUE);
try
{
@@ -2556,7 +2546,6 @@ namespace VeraCrypt
}
catch (...)
{
- DefineDosDevice(DDD_REMOVE_DEFINITION, EfiBootPartPath, NULL);
throw;
}
@@ -2566,20 +2555,9 @@ namespace VeraCrypt
dev.Close();
if (!bSuccess)
{
- DefineDosDevice(DDD_REMOVE_DEFINITION, EfiBootPartPath, NULL);
SetLastError (dwLastError);
throw SystemException(SRC_POS);
- }
-
- m_bMounted = true;
- }
-
- void EfiBoot::DismountBootPartition() {
- if (m_bMounted)
- {
- DefineDosDevice(DDD_REMOVE_DEFINITION, EfiBootPartPath, NULL);
- m_bMounted = false;
- }
+ }
}
bool EfiBoot::IsEfiBoot() {
@@ -3085,8 +3063,7 @@ namespace VeraCrypt
if (!DcsInfoImg)
throw ErrorException(L"Out of resource DcsInfo", SRC_POS);
- finally_do ({ EfiBootInst.DismountBootPartition(); });
- EfiBootInst.MountBootPartition(0);
+ EfiBootInst.PrepareBootPartition();
try
{
@@ -4110,9 +4087,7 @@ namespace VeraCrypt
const char* g_szMsBootString = "bootmgfw.pdb";
bool bModifiedMsBoot = true;
- finally_do ({ EfiBootInst.DismountBootPartition(); });
-
- EfiBootInst.MountBootPartition(0);
+ EfiBootInst.PrepareBootPartition();
EfiBootInst.GetFileSize(szStdMsBootloader, loaderSize);
bootLoaderBuf.resize ((size_t) loaderSize);
@@ -4233,9 +4208,7 @@ namespace VeraCrypt
}
}
- finally_do ({ EfiBootInst.DismountBootPartition(); });
-
- EfiBootInst.MountBootPartition(0);
+ EfiBootInst.PrepareBootPartition();
EfiBootInst.DeleteStartExec();
EfiBootInst.DeleteStartExec(0xDC5B, L"Driver"); // remove DcsBml boot driver it was installed
@@ -4735,8 +4708,7 @@ namespace VeraCrypt
}
else
{
- finally_do ({ EfiBootInst.DismountBootPartition(); });
- EfiBootInst.MountBootPartition(0);
+ EfiBootInst.PrepareBootPartition();
memcpy (pSdn, EfiBootInst.GetStorageDeviceNumber(), sizeof (STORAGE_DEVICE_NUMBER));
}
}