From 409c0f79be069cd2cf3bdb31ddbbafd938f15791 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sun, 3 Apr 2016 08:29:34 +0200 Subject: Windows: allow drag-n-drop of files and receiving Explorer restart message when VeraCrypt running as elevated process. --- src/Common/Dlgcode.c | 35 +++++++++++++++++++++++++++++++++++ src/Common/Dlgcode.h | 1 + src/Mount/Mount.c | 2 ++ 3 files changed, 38 insertions(+) (limited to 'src') diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c index 2cf5bb8e..749caa40 100644 --- a/src/Common/Dlgcode.c +++ b/src/Common/Dlgcode.c @@ -248,6 +248,9 @@ typedef LSTATUS (STDAPICALLTYPE *SHDeleteKeyWPtr)(HKEY hkey, LPCWSTR pszSubKey); typedef HRESULT (STDAPICALLTYPE *SHStrDupWPtr)(LPCWSTR psz, LPWSTR *ppwsz); +// ChangeWindowMessageFilter +typedef BOOL (WINAPI *ChangeWindowMessageFilterPtr) (UINT, DWORD); + ImageList_CreatePtr ImageList_CreateFn = NULL; ImageList_AddPtr ImageList_AddFn = NULL; @@ -257,6 +260,7 @@ SetupInstallFromInfSectionWPtr SetupInstallFromInfSectionWFn = NULL; SetupOpenInfFileWPtr SetupOpenInfFileWFn = NULL; SHDeleteKeyWPtr SHDeleteKeyWFn = NULL; SHStrDupWPtr SHStrDupWFn = NULL; +ChangeWindowMessageFilterPtr ChangeWindowMessageFilterFn = NULL; /* Windows dialog class */ #define WINDOWS_DIALOG_CLASS L"#32770" @@ -265,6 +269,16 @@ SHStrDupWPtr SHStrDupWFn = NULL; #define TC_DLG_CLASS L"VeraCryptCustomDlg" #define TC_SPLASH_CLASS L"VeraCryptSplashDlg" +/* constant used by ChangeWindowMessageFilter calls */ +#ifndef MSGFLT_ADD +#define MSGFLT_ADD 1 +#endif + +/* undocumented message sent during drag-n-drop */ +#ifndef WM_COPYGLOBALDATA +#define WM_COPYGLOBALDATA 0x0049 +#endif + /* Benchmarks */ #ifndef SETUP @@ -2603,6 +2617,19 @@ void InitApp (HINSTANCE hInstance, wchar_t *lpszCommandLine) if (!SHDeleteKeyWFn || !SHStrDupWFn) AbortProcess ("INIT_DLL"); + if (IsOSAtLeast (WIN_VISTA)) + { + /* Get ChangeWindowMessageFilter used to enable some messages bypasss UIPI (User Interface Privilege Isolation) */ + ChangeWindowMessageFilterFn = (ChangeWindowMessageFilterPtr) GetProcAddress (GetModuleHandle (L"user32.dll"), "ChangeWindowMessageFilter"); + +#ifndef SETUP + /* enable drag-n-drop when we are running elevated */ + AllowMessageInUIPI (WM_DROPFILES); + AllowMessageInUIPI (WM_COPYDATA); + AllowMessageInUIPI (WM_COPYGLOBALDATA); +#endif + } + /* Save the instance handle for later */ hInst = hInstance; @@ -11575,3 +11602,11 @@ void ProcessEntropyEstimate (HWND hProgress, DWORD* pdwInitialValue, DWORD dwCou 0); } } + +void AllowMessageInUIPI (UINT msg) +{ + if (ChangeWindowMessageFilterFn) + { + ChangeWindowMessageFilterFn (msg, MSGFLT_ADD); + } +} diff --git a/src/Common/Dlgcode.h b/src/Common/Dlgcode.h index 20199924..ef00871e 100644 --- a/src/Common/Dlgcode.h +++ b/src/Common/Dlgcode.h @@ -500,6 +500,7 @@ HIMAGELIST CreateImageList(int cx, int cy, UINT flags, int cInitial, int cGrow) int AddBitmapToImageList(HIMAGELIST himl, HBITMAP hbmImage, HBITMAP hbmMask); HRESULT VCStrDupW(LPCWSTR psz, LPWSTR *ppwsz); void ProcessEntropyEstimate (HWND hProgress, DWORD* pdwInitialValue, DWORD dwCounter, DWORD dwMaxLevel, DWORD* pdwEntropy); +void AllowMessageInUIPI (UINT msg); #ifdef __cplusplus } diff --git a/src/Mount/Mount.c b/src/Mount/Mount.c index fbf631f8..0acf58dd 100644 --- a/src/Mount/Mount.c +++ b/src/Mount/Mount.c @@ -6547,6 +6547,8 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa taskBarCreatedMsg = RegisterWindowMessage (L"TaskbarCreated"); + AllowMessageInUIPI (taskBarCreatedMsg); + SetFocus (GetDlgItem (hwndDlg, IDC_DRIVELIST)); /* Check system encryption status */ -- cgit v1.2.3