From cca08e1ed5fc70cd56a262b7782d970663c8208a Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sun, 20 Oct 2019 16:33:34 +0200 Subject: Windows: Add checks that the System Favorites service is running. Warn user if he enabled option to clear RAM encryption keys and the service is stopped. --- src/Common/BootEncryption.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'src/Common/BootEncryption.cpp') diff --git a/src/Common/BootEncryption.cpp b/src/Common/BootEncryption.cpp index 597a567d..e93415aa 100644 --- a/src/Common/BootEncryption.cpp +++ b/src/Common/BootEncryption.cpp @@ -4628,6 +4628,16 @@ namespace VeraCrypt if (registerService) { + // check if service already exists. + // If yes then start it immediatly after reinstalling it + bool bAlreadyExists = false; + SC_HANDLE service = OpenService (scm, TC_SYSTEM_FAVORITES_SERVICE_NAME, GENERIC_READ); + if (service) + { + bAlreadyExists = true; + CloseServiceHandle (service); + } + try { RegisterSystemFavoritesService (FALSE, noFileHandling); @@ -4650,7 +4660,7 @@ namespace VeraCrypt throw_sys_if (!CopyFile (appPath, servicePath.c_str(), FALSE)); } - SC_HANDLE service = CreateService (scm, + service = CreateService (scm, TC_SYSTEM_FAVORITES_SERVICE_NAME, _T(TC_APP_NAME) L" System Favorites", SERVICE_ALL_ACCESS, @@ -4670,6 +4680,10 @@ namespace VeraCrypt description.lpDescription = L"Mounts VeraCrypt system favorite volumes."; ChangeServiceConfig2 (service, SERVICE_CONFIG_DESCRIPTION, &description); + // start the service immediatly if it already existed before + if (bAlreadyExists) + StartService (service, 0, NULL); + CloseServiceHandle (service); try @@ -4711,6 +4725,30 @@ namespace VeraCrypt } } + bool BootEncryption::IsSystemFavoritesServiceRunning () + { + bool bRet = false; + SC_HANDLE scm = OpenSCManager (NULL, NULL, SC_MANAGER_CONNECT); + if (scm) + { + SC_HANDLE service = OpenService(scm, TC_SYSTEM_FAVORITES_SERVICE_NAME, GENERIC_READ); + if (service) + { + SERVICE_STATUS status; + if (QueryServiceStatus(service, &status)) + { + bRet = (status.dwCurrentState == SERVICE_RUNNING); + } + + CloseServiceHandle(service); + } + + CloseServiceHandle (scm); + } + + return bRet; + } + void BootEncryption::UpdateSystemFavoritesService () { SC_HANDLE scm = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS); -- cgit v1.2.3