From 196b2a2cb35eb85fe599e5faa946c93073935928 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 22 Oct 2009 08:57:04 -0400 Subject: [PATCH] Windows: Update Control Panel to use ShellExecuteEx instead of WinExec WinExec is for 16-bit application compatibility. Starting with Windows 7 it cannot be used to execute a process that requires elevated privileges. ShellExecute[Ex] must be used instead. LICENSE MIT Reviewed-on: http://gerrit.openafs.org/711 Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- src/WINNT/client_cpa/NTMakefile | 2 +- src/WINNT/client_cpa/cpl_interface.cpp | 35 ++++++++++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/WINNT/client_cpa/NTMakefile b/src/WINNT/client_cpa/NTMakefile index 0c1bbe74b..b724da792 100644 --- a/src/WINNT/client_cpa/NTMakefile +++ b/src/WINNT/client_cpa/NTMakefile @@ -22,7 +22,7 @@ DLLOBJS =\ DLLLIBS =\ $(DESTDIR)\lib\afs\TaLocale.lib \ $(DESTDIR)\lib\libosi.lib \ - comctl32.lib + comctl32.lib shell32.lib ole32.lib DEFFILE = afs_cpa.def diff --git a/src/WINNT/client_cpa/cpl_interface.cpp b/src/WINNT/client_cpa/cpl_interface.cpp index 37d8d0945..4d03eec2c 100644 --- a/src/WINNT/client_cpa/cpl_interface.cpp +++ b/src/WINNT/client_cpa/cpl_interface.cpp @@ -8,6 +8,8 @@ */ #include +#include +#include #include #include #include @@ -72,24 +74,25 @@ extern "C" LONG APIENTRY CPlApplet(HWND hwndCPl, UINT uMsg, LONG lParam1, LONG l { LPNEWCPLINFO lpNewCPlInfo; LPCPLINFO lpCPlInfo; + SHELLEXECUTEINFO shellExecInfo; switch (uMsg) { case CPL_INIT: /* first message, sent once */ hinst = GetModuleHandle("afs_cpa.cpl"); hinstResources = TaLocale_LoadCorrespondingModule (hinst); + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); return (hinst != 0); case CPL_GETCOUNT: /* second message, sent once */ return 1; - break; case CPL_INQUIRE: /* in case we receive this we should indicate that we like NEWINQUIRE better. */ - lpCPlInfo = (CPLINFO *) lParam2; - lpCPlInfo->idIcon = ((IsClientInstalled() || !IsWindowsNT())? IDI_AFSD : IDI_CCENTER); - lpCPlInfo->idName = CPL_DYNAMIC_RES; - lpCPlInfo->idInfo = CPL_DYNAMIC_RES; - lpCPlInfo->lData = 0; - break; + lpCPlInfo = (CPLINFO *) lParam2; + lpCPlInfo->idIcon = ((IsClientInstalled() || !IsWindowsNT())? IDI_AFSD : IDI_CCENTER); + lpCPlInfo->idName = CPL_DYNAMIC_RES; + lpCPlInfo->idInfo = CPL_DYNAMIC_RES; + lpCPlInfo->lData = 0; + break; case CPL_NEWINQUIRE: /* third message, sent once per app */ lpNewCPlInfo = (LPNEWCPLINFO) lParam2; @@ -108,14 +111,20 @@ extern "C" LONG APIENTRY CPlApplet(HWND hwndCPl, UINT uMsg, LONG lParam1, LONG l GetString (lpNewCPlInfo->szInfo, (!IsWindowsNT()) ? IDS_CPL_DESC_95 : (!IsClientInstalled()) ? IDS_CPL_DESC_CCENTER : IDS_CPL_DESC_NT); break; - case CPL_DBLCLK: /* applet icon double-clicked */ - if (IsClientInstalled() || !IsWindowsNT()) - WinExec("afs_config.exe", SW_SHOW); - else - WinExec("afs_config.exe /c", SW_SHOW); + case CPL_DBLCLK: /* applet icon double-clicked */ + memset(&shellExecInfo, 0, sizeof(shellExecInfo)); + shellExecInfo.cbSize = sizeof(shellExecInfo); + shellExecInfo.nShow = SW_SHOWNORMAL; + shellExecInfo.hwnd = hwndCPl; + shellExecInfo.lpFile = "afs_config.exe"; + if (!IsClientInstalled() && IsWindowsNT()) + shellExecInfo.lpParameters = "/c"; + + ShellExecuteEx(&shellExecInfo); break; - case CPL_EXIT: + case CPL_EXIT: + CoUninitialize(); if (hinstResources) FreeLibrary (hinstResources); break; -- 2.39.5