Windows: Fix freeze when password dialog displayed in secure desktop and try to access token keyfiles protected by PIN

This commit is contained in:
Mounir IDRASSI 2021-02-24 21:42:20 +01:00
parent 0eace45cea
commit 7efe4e4f2a
No known key found for this signature in database
GPG Key ID: 02C30AE90FAE4A6F
2 changed files with 39 additions and 3 deletions

View File

@ -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) &param, 0, NULL);
if (hThread)
{
StringCbCopy(SecureDesktopName, sizeof (SecureDesktopName), szDesktopName);
WaitForSingleObject (hThread, INFINITE);
CloseHandle (hThread);

View File

@ -124,7 +124,8 @@ extern BOOL bHideWaitingDialog;
extern BOOL bCmdHideWaitingDialog;
extern BOOL bCmdHideWaitingDialogValid;
extern BOOL bUseSecureDesktop;
extern BOOL bSecureDesktopOngoing;
extern volatile BOOL bSecureDesktopOngoing;
extern TCHAR SecureDesktopName[65];
extern BOOL bUseLegacyMaxPasswordLength;
extern BOOL bCmdUseSecureDesktop;
extern BOOL bCmdUseSecureDesktopValid;
@ -550,6 +551,7 @@ BOOL LaunchElevatedProcess (HWND hwndDlg, const wchar_t* szModPath, const wchar_
BOOL GetFreeDriveLetter(WCHAR* pCh);
BOOL SetPrivilege(LPTSTR szPrivilegeName, BOOL bEnable);
BOOL DeleteDirectory (const wchar_t* szDirName);
BOOL IsThreadInSecureDesktop(DWORD dwThreadID);
INT_PTR SecureDesktopDialogBoxParam (HINSTANCE, LPCWSTR, HWND, DLGPROC, LPARAM);
BOOL VerifyModuleSignature (const wchar_t* path);
void GetInstallationPath (HWND hwndDlg, wchar_t* szInstallPath, DWORD cchSize, BOOL* pbInstallPathDetermined);