VeraCrypt
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2018-03-25 20:35:15 +0200
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2018-03-25 22:00:27 +0200
commite412c0458b9df6bb1f2482823d397acc2a656464 (patch)
tree29a40b99056b0c835e979d41081f74dd6e5c3b73
parent6ebc83bbede75dbf9a60edc9940baf88de444941 (diff)
downloadVeraCrypt-e412c0458b9df6bb1f2482823d397acc2a656464.tar.gz
VeraCrypt-e412c0458b9df6bb1f2482823d397acc2a656464.zip
Windows: ensure that out secure desktop has always user input to avoid cases where another application switch to default desktop while our password dialog is displayed.
-rw-r--r--src/Common/Dlgcode.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c
index 56938518..112328b3 100644
--- a/src/Common/Dlgcode.c
+++ b/src/Common/Dlgcode.c
@@ -13131,6 +13131,7 @@ static BOOL GenerateRandomString (HWND hwndDlg, LPTSTR szName, DWORD maxCharsCou
typedef struct
{
HDESK hDesk;
+ LPCWSTR szDesktopName;
HINSTANCE hInstance;
LPCWSTR lpTemplateName;
DLGPROC lpDialogFunc;
@@ -13138,16 +13139,90 @@ typedef struct
INT_PTR retValue;
} SecureDesktopThreadParam;
+typedef struct
+{
+ LPCWSTR szVCDesktopName;
+ HDESK hVcDesktop;
+ volatile BOOL* pbStopMonitoring;
+} SecureDesktopMonitoringThreadParam;
+
+#define SECUREDESKTOP_MONOTIR_PERIOD 500
+
+// This thread checks if VeraCrypt secure desktop is the one that has user input
+// and if it is not then it will call SwitchDesktop to make it the input desktop
+static unsigned int __stdcall SecureDesktopMonitoringThread( LPVOID lpThreadParameter )
+{
+ SecureDesktopMonitoringThreadParam* pMonitorParam = (SecureDesktopMonitoringThreadParam*) lpThreadParameter;
+ if (pMonitorParam)
+ {
+ volatile BOOL* pbStopMonitoring = pMonitorParam->pbStopMonitoring;
+ LPCWSTR szVCDesktopName = pMonitorParam->szVCDesktopName;
+ HDESK hVcDesktop = pMonitorParam->hVcDesktop;
+
+ while (!*pbStopMonitoring)
+ {
+ // check that our secure desktop is still the input desktop
+ // otherwise, switch to it
+ BOOL bPerformSwitch = FALSE;
+ HDESK currentDesk = OpenInputDesktop (0, FALSE, GENERIC_READ);
+ if (currentDesk)
+ {
+ LPWSTR szName = NULL;
+ DWORD dwLen = 0;
+ if (!GetUserObjectInformation (currentDesk, UOI_NAME, NULL, 0, &dwLen))
+ {
+ szName = (LPWSTR) malloc (dwLen);
+ if (szName)
+ {
+ if (GetUserObjectInformation (currentDesk, UOI_NAME, szName, dwLen, &dwLen))
+ {
+ if (0 != _wcsicmp (szName, szVCDesktopName))
+ bPerformSwitch = TRUE;
+ }
+ free (szName);
+ }
+ }
+ CloseDesktop (currentDesk);
+ }
+
+ if (bPerformSwitch)
+ SwitchDesktop (hVcDesktop);
+
+ Sleep (SECUREDESKTOP_MONOTIR_PERIOD);
+ }
+ }
+
+ return 0;
+}
+
static DWORD WINAPI SecureDesktopThread(LPVOID lpThreadParameter)
{
+ volatile BOOL bStopMonitoring = FALSE;
+ HANDLE hMonitoringThread = NULL;
+ unsigned int monitoringThreadID = 0;
SecureDesktopThreadParam* pParam = (SecureDesktopThreadParam*) lpThreadParameter;
+ SecureDesktopMonitoringThreadParam monitorParam;
SetThreadDesktop (pParam->hDesk);
SwitchDesktop (pParam->hDesk);
+ // create the thread that will ensure that VeraCrypt secure desktop has always user input
+ monitorParam.szVCDesktopName = pParam->szDesktopName;
+ monitorParam.hVcDesktop = pParam->hDesk;
+ monitorParam.pbStopMonitoring = &bStopMonitoring;
+ hMonitoringThread = (HANDLE) _beginthreadex (NULL, 0, SecureDesktopMonitoringThread, (LPVOID) &monitorParam, 0, &monitoringThreadID);
+
pParam->retValue = DialogBoxParamW (pParam->hInstance, pParam->lpTemplateName,
NULL, pParam->lpDialogFunc, pParam->dwInitParam);
+ if (hMonitoringThread)
+ {
+ bStopMonitoring = TRUE;
+
+ WaitForSingleObject (hMonitoringThread, INFINITE);
+ CloseHandle (hMonitoringThread);
+ }
+
return 0;
}
@@ -13210,6 +13285,7 @@ INT_PTR SecureDesktopDialogBoxParam(
SecureDesktopThreadParam param;
param.hDesk = hSecureDesk;
+ param.szDesktopName = szDesktopName;
param.hInstance = hInstance;
param.lpTemplateName = lpTemplateName;
param.lpDialogFunc = lpDialogFunc;