From a045bdec74b29a7e31309ba681f1733a0b477c57 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 18 Aug 2018 20:24:27 +0200 Subject: [PATCH 1/3] Setup: Remove warning about very old ClassicShell version Latest version of ClassicShell was 4.3.1. There is no reason to display any warning about very old versions (< 2.0.0). Besides, this will remove dependency on version.dll which could be misused for DLL hijacking attack. Fixes #72 --- Src/Setup/Setup.cpp | 44 -------------------------------------------- Src/Setup/Setup.rc | 1 - Src/Setup/resource.h | 1 - 3 files changed, 46 deletions(-) diff --git a/Src/Setup/Setup.cpp b/Src/Setup/Setup.cpp index 489ba9bfb..43e762cc8 100644 --- a/Src/Setup/Setup.cpp +++ b/Src/Setup/Setup.cpp @@ -16,7 +16,6 @@ // It unpacks the right installer into the temp directory and executes it. typedef BOOL (WINAPI *FIsWow64Process)( HANDLE hProcess, PBOOL Wow64Process ); -typedef BOOL (WINAPI *FQueryFullProcessImageName)( HANDLE hProcess, DWORD dwFlags, LPTSTR lpExeName, PDWORD lpdwSize ); @@ -326,49 +325,6 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm BOOL b64=FALSE; isWow64Process(GetCurrentProcess(),&b64); - // look for an old version of the classic start menu (2.0.0 or older) and show a warning if it is still running. the uninstaller for such old versions doesn't close the start menu - HWND hwnd=FindWindow(L"ClassicStartMenu.CStartHookWindow",L"StartHookWindow"); - if (hwnd) - { - bool bStartMenu=false; - - DWORD id; - GetWindowThreadProcessId(hwnd,&id); - HANDLE process=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,id); - if (process) - { - bStartMenu=true; - wchar_t path[_MAX_PATH]; - DWORD size=_countof(path); - - FQueryFullProcessImageName queryFullProcessImageName=(FQueryFullProcessImageName)GetProcAddress(hKernel32,"QueryFullProcessImageNameW"); - if (queryFullProcessImageName && queryFullProcessImageName(process,0,path,&size)) - { - DWORD q; - DWORD size=GetFileVersionInfoSize(path,&q); - if (size) - { - std::vector buf(size); - if (GetFileVersionInfo(path,0,size,&buf[0])) - { - VS_FIXEDFILEINFO *pVer; - UINT len; - if (VerQueryValue(&buf[0],L"\\",(void**)&pVer,&len) && pVer->dwProductVersionMS>0x20000) - bStartMenu=false; - } - } - } - CloseHandle(process); - } - if (bStartMenu) - { - wchar_t strTitle[256]; - if (!LoadString(hInstance,IDS_APP_TITLE,strTitle,_countof(strTitle))) strTitle[0]=0; - wchar_t strText[1024]; - if (!LoadString(hInstance,IDS_OLDSTARTMENU,strText,_countof(strText))) strText[0]=0; - MessageBox(NULL,strText,strTitle,MB_OK|MB_ICONWARNING); - } - } /* // warning about being beta if (!bQuiet) diff --git a/Src/Setup/Setup.rc b/Src/Setup/Setup.rc index 0131a4c25..dc06f9375 100644 --- a/Src/Setup/Setup.rc +++ b/Src/Setup/Setup.rc @@ -148,7 +148,6 @@ END STRINGTABLE BEGIN IDS_APP_TITLE "Open-Shell Setup" - IDS_OLDSTARTMENU "Warning!\nAn old version of the classic start menu is still running. Please close it before installing the new version to avoid crashing Explorer. Right click on the start button and select ""Exit""." IDS_ERR_CORRUPTED "Failed to extract setup file '%s'. The MSI resource is corrupted." END diff --git a/Src/Setup/resource.h b/Src/Setup/resource.h index b906aa2c3..fb9313d72 100644 --- a/Src/Setup/resource.h +++ b/Src/Setup/resource.h @@ -5,7 +5,6 @@ #define IDS_APP_NAME 100 #define IDS_APP_TITLE 100 #define IDI_APPICON 101 -#define IDS_OLDSTARTMENU 101 #define IDS_ERR_CORRUPTED 102 #define IDR_MSI_FILE32 132 #define IDR_MSI_FILE64 164 From daddc3b3f1bc329aed585538407e27675e0d2844 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 18 Aug 2018 20:51:51 +0200 Subject: [PATCH 2/3] Setup: Remove obsolete/unused stuff There is no need for password protected beta versions. --- Src/Setup/Setup.cpp | 48 --------------------------------- Src/Setup/Setup.rc | 35 ------------------------ Src/Setup/Setup.vcxproj | 1 - Src/Setup/Setup.vcxproj.filters | 5 +--- Src/Setup/resource.h | 1 - 5 files changed, 1 insertion(+), 89 deletions(-) diff --git a/Src/Setup/Setup.cpp b/Src/Setup/Setup.cpp index 43e762cc8..d3471af40 100644 --- a/Src/Setup/Setup.cpp +++ b/Src/Setup/Setup.cpp @@ -198,32 +198,8 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo return 0; } -INT_PTR CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - if (uMsg==WM_COMMAND && wParam==IDOK) - { - wchar_t text[256]; - GetDlgItemText(hwndDlg,IDC_EDITPWD,text,_countof(text)); - CharUpper(text); - if (CalcFNVHash(text)==0xdd7faf06) - EndDialog(hwndDlg,IDOK); - else - MessageBox(hwndDlg,L"Wrong password.",L"Error",MB_OK|MB_ICONERROR); - return TRUE; - } - if (uMsg==WM_COMMAND && wParam==IDCANCEL) - { - EndDialog(hwndDlg,IDCANCEL); - return TRUE; - } - return FALSE; -} - int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { - INITCOMMONCONTROLSEX init={sizeof(init),ICC_STANDARD_CLASSES}; - InitCommonControlsEx(&init); - // get installer version VS_FIXEDFILEINFO *pVer=NULL; { @@ -238,9 +214,6 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm pVer=(VS_FIXEDFILEINFO*)((char*)pRes+40); } - if (pVer && pVer->dwProductVersionMS==0x20008 && pVer->dwProductVersionLS==0 && DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOGPWD),NULL,DialogProc)!=IDOK) - return 0; - int count; wchar_t *const *params=CommandLineToArgvW(lpCmdLine,&count); if (!params) count=0; @@ -325,27 +298,6 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm BOOL b64=FALSE; isWow64Process(GetCurrentProcess(),&b64); -/* - // warning about being beta - if (!bQuiet) - { - if (MessageBox(NULL,L"Warning!\nThis is a beta version of Open-Shell. It contains features that are not fully tested. Please report any problems in the Open-Shell forums. If you prefer a stable build over the latest features, you can download one of the \"general release\" versions like 3.6.8.\nDo you want to continue with the installation?",L"Open-Shell Setup",MB_YESNO|MB_ICONWARNING)==IDNO) - return 99; - } -*/ - - DWORD version; - { - HKEY hKey; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\OpenShell\\OpenShell",0,KEY_READ|(b64?KEY_WOW64_64KEY:0),&hKey)==ERROR_SUCCESS) - { - DWORD size=sizeof(version); - if (RegQueryValueEx(hKey,L"Version",0,NULL,(BYTE*)&version,&size)!=ERROR_SUCCESS) - version=0; - RegCloseKey(hKey); - } - } - wchar_t msiName[_MAX_PATH]; Sprintf(msiName,_countof(msiName),L"%%ALLUSERSPROFILE%%\\OpenShellSetup%d_%d_%d_%d.msi",b64?64:32,HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); DoEnvironmentSubst(msiName,_countof(msiName)); diff --git a/Src/Setup/Setup.rc b/Src/Setup/Setup.rc index dc06f9375..8d479c126 100644 --- a/Src/Setup/Setup.rc +++ b/Src/Setup/Setup.rc @@ -104,41 +104,6 @@ IDR_MSI_FILE32 MSI_FILE "Temp\\Setup32.msi_" IDR_MSI_FILE64 MSI_FILE "Temp\\Setup64.msi_" IDR_MSI_CHECKSUM MSI_FILE "msichecksum.bin" -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_DIALOGPWD DIALOGEX 0, 0, 154, 75 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Open-Shell 2.8.0 (closed beta)" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - LTEXT "This beta version is password-protected. Please enter the password:",IDC_STATIC,7,7,140,17 - EDITTEXT IDC_EDITPWD,7,32,140,14,ES_AUTOHSCROLL - DEFPUSHBUTTON "OK",IDOK,43,54,50,14 - PUSHBUTTON "Cancel",IDCANCEL,97,54,50,14 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_DIALOGPWD, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 147 - TOPMARGIN, 7 - BOTTOMMARGIN, 68 - END -END -#endif // APSTUDIO_INVOKED - ///////////////////////////////////////////////////////////////////////////// // diff --git a/Src/Setup/Setup.vcxproj b/Src/Setup/Setup.vcxproj index a27abe20f..88a78c62f 100644 --- a/Src/Setup/Setup.vcxproj +++ b/Src/Setup/Setup.vcxproj @@ -123,7 +123,6 @@ - diff --git a/Src/Setup/Setup.vcxproj.filters b/Src/Setup/Setup.vcxproj.filters index be09bad0c..613885939 100644 --- a/Src/Setup/Setup.vcxproj.filters +++ b/Src/Setup/Setup.vcxproj.filters @@ -58,11 +58,8 @@ Setup Files - - Setup Files - - + \ No newline at end of file diff --git a/Src/Setup/resource.h b/Src/Setup/resource.h index fb9313d72..85076b8d8 100644 --- a/Src/Setup/resource.h +++ b/Src/Setup/resource.h @@ -9,7 +9,6 @@ #define IDR_MSI_FILE32 132 #define IDR_MSI_FILE64 164 #define IDS_ERR_INTERNAL 166 -#define IDD_DIALOGPWD 166 #define IDS_ERR_EXTRACT 167 #define IDR_MSI_CHECKSUM 167 #define IDS_ERR_WIN7 169 From 28e9fb729211546975d2f836b06ea45198123f49 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Sat, 18 Aug 2018 21:42:50 +0200 Subject: [PATCH 3/3] SetupHelper: Try to terminate ClassicShell Start Menu (to make upgrade a bit easier) During upgrade from ClassicShell we'll try to terminate ClassicStartMenu.exe as well. So that installer won't complain about files being in use. --- Src/Setup/SetupHelper/SetupHelper.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Src/Setup/SetupHelper/SetupHelper.cpp b/Src/Setup/SetupHelper/SetupHelper.cpp index 0b9cfd2fb..61545d3a5 100644 --- a/Src/Setup/SetupHelper/SetupHelper.cpp +++ b/Src/Setup/SetupHelper/SetupHelper.cpp @@ -8,14 +8,12 @@ #include #include "ResourceHelper.h" -HINSTANCE g_hInstance; - /////////////////////////////////////////////////////////////////////////////// -int ExitStartMenu( void ) +int ExitStartMenu(const wchar_t* regPath, const wchar_t* exeName, const wchar_t* updaterClass) { HKEY hKey=NULL; - if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\OpenShell\\OpenShell",0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ|KEY_QUERY_VALUE|KEY_WOW64_64KEY,NULL,&hKey,NULL)==ERROR_SUCCESS) + if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,regPath,0,NULL,REG_OPTION_NON_VOLATILE,KEY_READ|KEY_QUERY_VALUE|KEY_WOW64_64KEY,NULL,&hKey,NULL)==ERROR_SUCCESS) { DWORD type=0; wchar_t path[_MAX_PATH]; @@ -25,7 +23,7 @@ int ExitStartMenu( void ) STARTUPINFO startupInfo={sizeof(startupInfo)}; PROCESS_INFORMATION processInfo; memset(&processInfo,0,sizeof(processInfo)); - wcscat_s(path,L"StartMenu.exe"); + wcscat_s(path,exeName); HANDLE h=CreateFile(path,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if (h!=INVALID_HANDLE_VALUE) { @@ -41,12 +39,23 @@ int ExitStartMenu( void ) } RegCloseKey(hKey); } - HWND updateOwner=FindWindow(L"OpenShellUpdate.COwnerWindow",NULL); + HWND updateOwner=FindWindow(updaterClass,NULL); if (updateOwner) PostMessage(updateOwner,WM_CLEAR,0,0); return 0; } +int ExitStartMenu() +{ + // terminate Open-Shell Start Menu in clean way + ExitStartMenu(L"SOFTWARE\\OpenShell\\OpenShell", L"StartMenu.exe", L"OpenShellUpdate.COwnerWindow"); + + // try to terminate also ClassicShell Start Menu (to make upgrade a bit easier) + ExitStartMenu(L"SOFTWARE\\IvoSoft\\ClassicShell", L"ClassicStartMenu.exe", L"ClassicShellUpdate.COwnerWindow"); + + return 0; +} + int FixVersion( void ) { HKEY hKey=NULL; @@ -74,8 +83,6 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC wchar_t *const *params=CommandLineToArgvW(lpstrCmdLine,&count); if (!params) return 1; - g_hInstance=hInstance; - for (;count>0;count--,params++) { if (_wcsicmp(params[0],L"exitSM")==0)