mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 11:08:02 -06:00
Windows: Fix freeze when password dialog displayed in secure desktop and try to access token keyfiles protected by PIN
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user