diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2021-02-24 21:42:20 +0100 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2021-02-24 21:50:52 +0100 |
commit | 7efe4e4f2a99450f3e6a15447a2ea816f9be848d (patch) | |
tree | 1a50c14b3c5a7ce65ac4b9760a02b7ad042e02ad /src/Common/Dlgcode.c | |
parent | 0eace45ceae82a98c630d6bbec5b18b896a7f35d (diff) | |
download | VeraCrypt-7efe4e4f2a99450f3e6a15447a2ea816f9be848d.tar.gz VeraCrypt-7efe4e4f2a99450f3e6a15447a2ea816f9be848d.zip |
Windows: Fix freeze when password dialog displayed in secure desktop and try to access token keyfiles protected by PIN
Diffstat (limited to 'src/Common/Dlgcode.c')
-rw-r--r-- | src/Common/Dlgcode.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 14c57f3e..8e1e0070 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -235,7 +235,8 @@ static std::vector<HostDevice> rawHostDeviceList; CRITICAL_SECTION csSecureDesktop; /* Boolean that indicates if our Secure Desktop is active and being used or not */ -BOOL bSecureDesktopOngoing = FALSE; +volatile BOOL bSecureDesktopOngoing = FALSE; +TCHAR SecureDesktopName[65]; HINSTANCE hInst = NULL; HCURSOR hCursor = NULL; @@ -12214,6 +12215,35 @@ BOOL CALLBACK SecurityTokenKeyfileDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam return 0; } +extern "C" BOOL IsThreadInSecureDesktop(DWORD dwThreadID) +{ + BOOL bRet = FALSE; + if (bSecureDesktopOngoing) + { + HDESK currentDesk = GetThreadDesktop (dwThreadID); + 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, SecureDesktopName)) + bRet = TRUE; + } + free (szName); + } + } + } + } + + return bRet; +} + BOOL InitSecurityTokenLibrary (HWND hwndDlg) { @@ -12238,6 +12268,8 @@ BOOL InitSecurityTokenLibrary (HWND hwndDlg) HWND hParent = IsWindow (m_hwnd)? m_hwnd : GetActiveWindow(); if (!hParent) hParent = GetForegroundWindow (); + if (IsThreadInSecureDesktop(GetCurrentThreadId()) && !IsThreadInSecureDesktop(GetWindowThreadProcessId(hParent, NULL))) + hParent = GetActiveWindow (); if (SecureDesktopDialogBoxParam (hInst, MAKEINTRESOURCEW (IDD_TOKEN_PASSWORD), hParent, (DLGPROC) SecurityTokenPasswordDlgProc, (LPARAM) &str) == IDCANCEL) throw UserAbort (SRC_POS); } @@ -13847,7 +13879,7 @@ INT_PTR SecureDesktopDialogBoxParam( INT_PTR retValue = 0; BOOL bEffectiveUseSecureDesktop = bCmdUseSecureDesktopValid? bCmdUseSecureDesktop : bUseSecureDesktop; - if (bEffectiveUseSecureDesktop) + if (bEffectiveUseSecureDesktop && !IsThreadInSecureDesktop(GetCurrentThreadId())) { EnterCriticalSection (&csSecureDesktop); bSecureDesktopOngoing = TRUE; @@ -13893,6 +13925,8 @@ INT_PTR SecureDesktopDialogBoxParam( HANDLE hThread = ::CreateThread (NULL, 0, SecureDesktopThread, (LPVOID) ¶m, 0, NULL); if (hThread) { + StringCbCopy(SecureDesktopName, sizeof (SecureDesktopName), szDesktopName); + WaitForSingleObject (hThread, INFINITE); CloseHandle (hThread); |