diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2018-03-25 21:40:07 +0200 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2018-03-25 22:00:28 +0200 |
commit | f38c4cfee893ecb8ac213f7b2de974332835eee8 (patch) | |
tree | 3237cef4cb824e2ffe51fbfa64b6d1f5a87cf874 | |
parent | b2069885313881a177798375160256879c7b796c (diff) | |
download | VeraCrypt-f38c4cfee893ecb8ac213f7b2de974332835eee8.tar.gz VeraCrypt-f38c4cfee893ecb8ac213f7b2de974332835eee8.zip |
Windows: handle rare case where call to SwitchDestop fails when trying to display password dialog in our secure desktop. This can happen for example if VeraCrypt process is launched early when user session is opened and it tries to load favorites before user workstation becomes visible.
-rw-r--r-- | src/Common/Dlgcode.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 4f0c4af6..2e37a6a3 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -13211,15 +13211,32 @@ static DWORD WINAPI SecureDesktopThread(LPVOID lpThreadParameter) unsigned int monitoringThreadID = 0; SecureDesktopThreadParam* pParam = (SecureDesktopThreadParam*) lpThreadParameter; SecureDesktopMonitoringThreadParam monitorParam; + HDESK hOriginalDesk = GetThreadDesktop (GetCurrentThreadId ()); + BOOL bNewDesktopSet = FALSE; + int counter = 0; - SetThreadDesktop (pParam->hDesk); - SwitchDesktop (pParam->hDesk); + // wait for SwitchDesktop to succeed before using it for current thread + // we wait a maximum of 5 seconds + for (counter = 0; counter < 10; counter++) + { + if (SwitchDesktop (pParam->hDesk)) + { + bNewDesktopSet = TRUE; + break; + } + Sleep (SECUREDESKTOP_MONOTIR_PERIOD); + } + + if (bNewDesktopSet) + { + SetThreadDesktop (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); + // 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); @@ -13232,6 +13249,12 @@ static DWORD WINAPI SecureDesktopThread(LPVOID lpThreadParameter) CloseHandle (hMonitoringThread); } + if (bNewDesktopSet) + { + SetThreadDesktop (hOriginalDesk); + SwitchDesktop (hOriginalDesk); + } + return 0; } @@ -13290,7 +13313,6 @@ INT_PTR SecureDesktopDialogBoxParam( hSecureDesk = CreateDesktop (szDesktopName, NULL, NULL, 0, desktopAccess, NULL); if (hSecureDesk) { - HDESK hOriginalDesk = GetThreadDesktop (GetCurrentThreadId ()); SecureDesktopThreadParam param; param.hDesk = hSecureDesk; @@ -13307,9 +13329,6 @@ INT_PTR SecureDesktopDialogBoxParam( WaitForSingleObject (hThread, INFINITE); CloseHandle (hThread); - SwitchDesktop (hOriginalDesk); - SetThreadDesktop (hOriginalDesk); - retValue = param.retValue; bSuccess = TRUE; } |