From 296c6a0fed7e29797cace2fe7d3b873416130ee6 Mon Sep 17 00:00:00 2001 From: Amrsatrio Date: Wed, 14 Feb 2024 03:11:42 +0700 Subject: [PATCH] Setup: Cleaner uninstallation and cleaner code. - .prev files should now only exist when the file to overwrite is in use, no longer all the time. - During uninstallation, ep_setup now tries to delete `C:\Program Files\ExplorerPatcher` by moving the stored ep_setup.exe into %TEMP% for later deletion after Explorer starts again. - When the uninstall confirmation dialog is open, subsequent `ep_setup.exe /uninstall` invocations should focus the existing dialog instead of making a new one. - Reorganized the functions for a cleaner look and easier maintenance. - Removed the files related to the original method for fixing the jump list menus in the Windows 10 start menu on Windows 11. - Prepared the spots for the alternate taskbar implementation. --- ep_setup/ep_setup.c | 546 ++++++++++++++------------------- ep_setup/ep_setup.vcxproj | 15 + ep_setup/resources/ep_setup.rc | 12 + ep_setup/resources/resource.h | 3 + 4 files changed, 252 insertions(+), 324 deletions(-) diff --git a/ep_setup/ep_setup.c b/ep_setup/ep_setup.c index a926610..1291d17 100644 --- a/ep_setup/ep_setup.c +++ b/ep_setup/ep_setup.c @@ -8,38 +8,6 @@ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") #include "resources/resource.h" #include "../ExplorerPatcher/utility.h" -BOOL ShouldDownloadOrDelete(BOOL bInstall, HINSTANCE hInstance, LPCWSTR wszPath, LPCSTR chash) -{ - if (FileExistsW(wszPath)) - { - WCHAR hash[100]; - ZeroMemory(hash, sizeof(WCHAR) * 100); - ComputeFileHash(wszPath, hash, 100); - if (_stricmp(hash, chash)) - { - if (bInstall) - { - return TRUE; - } - } - else - { - if (!bInstall) - { - return InstallResource(FALSE, hInstance, 0, wszPath); // Delete - } - } - } - else - { - if (bInstall) - { - return TRUE; - } - } - return FALSE; -} - BOOL SetupShortcut(BOOL bInstall, WCHAR* wszPath, WCHAR* wszArguments) { WCHAR wszTitle[MAX_PATH]; @@ -318,18 +286,20 @@ BOOL SetupUninstallEntry(BOOL bInstall, WCHAR* wszPath) return !dwLastError; } -BOOL InstallResource(BOOL bInstall, HMODULE hModule, int res, WCHAR* wszPath) +BOOL InstallResourceHelper(BOOL bInstall, HMODULE hModule, HRSRC hRscr, WCHAR* wszPath) { - if (PathFileExistsW(wszPath)) + WCHAR wszReplace[MAX_PATH]; + wcscpy_s(wszReplace, MAX_PATH, wszPath); + PathRemoveExtensionW(wszReplace); + wcscat_s(wszReplace, MAX_PATH, L".prev"); + BOOL bFileExists = PathFileExistsW(wszPath); + BOOL bPrevExists = PathFileExistsW(wszReplace); + if (bFileExists || bPrevExists) { - WCHAR wszReplace[MAX_PATH]; - wcscpy_s(wszReplace, MAX_PATH, wszPath); - PathRemoveExtensionW(wszReplace); - wcscat_s(wszReplace, MAX_PATH, L".prev"); - BOOL bRet = DeleteFileW(wszReplace); + BOOL bRet = !bPrevExists || DeleteFileW(wszReplace); if (bRet || (!bRet && GetLastError() == ERROR_FILE_NOT_FOUND)) { - if (!MoveFileW(wszPath, wszReplace)) + if (bFileExists && !DeleteFileW(wszPath) && !MoveFileW(wszPath, wszReplace)) { return FALSE; } @@ -339,7 +309,7 @@ BOOL InstallResource(BOOL bInstall, HMODULE hModule, int res, WCHAR* wszPath) return FALSE; } } - if (res == 0) + if (!hRscr) { if (bInstall) { @@ -351,11 +321,6 @@ BOOL InstallResource(BOOL bInstall, HMODULE hModule, int res, WCHAR* wszPath) } else { - HRSRC hRscr = FindResource( - hModule, - MAKEINTRESOURCE(res), - RT_RCDATA - ); if (!hRscr) { return FALSE; @@ -405,6 +370,81 @@ BOOL InstallResource(BOOL bInstall, HMODULE hModule, int res, WCHAR* wszPath) } } +BOOL InstallResource(BOOL bInstall, HMODULE hInstance, int res, LPCWSTR pwszDirectory, LPCWSTR pwszFileName) +{ + BOOL bOk = TRUE; + HRSRC hRscr = NULL; + if (res == 0 || ((hRscr = FindResourceW(hInstance, MAKEINTRESOURCE(res), RT_RCDATA)))) + { + WCHAR wszPath[MAX_PATH]; + wcscpy_s(wszPath, MAX_PATH, pwszDirectory); + wcscat_s(wszPath, MAX_PATH, L"\\"); + wcscat_s(wszPath, MAX_PATH, pwszFileName); + bOk = InstallResourceHelper(bInstall, hInstance, hRscr, wszPath); + } + return bOk; +} + +BOOL DeleteResource(LPCWSTR pwszDirectory, LPCWSTR pwszFileName) +{ + WCHAR wszPath[MAX_PATH]; + wcscpy_s(wszPath, MAX_PATH, pwszDirectory); + wcscat_s(wszPath, MAX_PATH, L"\\"); + wcscat_s(wszPath, MAX_PATH, pwszFileName); + return InstallResourceHelper(FALSE, NULL, NULL, wszPath); +} + +BOOL ShouldDownloadOrDelete(BOOL bInstall, WCHAR* wszPath, LPCSTR chash) +{ + if (FileExistsW(wszPath)) + { + char hash[100]; + ZeroMemory(hash, sizeof(char) * 100); + ComputeFileHash(wszPath, hash, 100); + if (_stricmp(hash, chash) != 0) + { + if (bInstall) + { + return TRUE; + } + } + else + { + if (!bInstall) + { + return InstallResourceHelper(FALSE, NULL, NULL, wszPath); // Delete + } + } + } + else + { + if (bInstall) + { + return TRUE; + } + } + return FALSE; +} + +BOOL DownloadResource(BOOL bInstall, LPCWSTR pwszURL, DWORD dwSize, LPCSTR chash, LPCWSTR pwszDirectory, LPCWSTR pwszFileName) +{ + BOOL bOk = TRUE; + WCHAR wszPath[MAX_PATH]; + wcscpy_s(wszPath, MAX_PATH, pwszDirectory); + wcscat_s(wszPath, MAX_PATH, L"\\"); + wcscat_s(wszPath, MAX_PATH, pwszFileName); + if (ShouldDownloadOrDelete(bInstall, wszPath, chash) && IsConnectedToInternet() == TRUE) + { + bOk = DownloadFile(pwszURL, dwSize, wszPath); + } + return bOk; +} + +LRESULT CALLBACK OwnerWindowWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + return DefWindowProcW(hWnd, message, wParam, lParam); +} + int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, @@ -412,8 +452,7 @@ int WINAPI wWinMain( _In_ int nShowCmd ) { - RTL_OSVERSIONINFOW rovi; - DWORD32 ubr = VnGetOSVersionAndUBR(&rovi); + global_ubr = VnGetOSVersionAndUBR(&global_rovi); BOOL bOk = TRUE, bInstall = TRUE, bWasShellExt = FALSE, bIsUpdate = FALSE, bForcePromptForUninstall = FALSE; @@ -439,89 +478,17 @@ int WINAPI wWinMain( { GetCurrentDirectoryW(MAX_PATH, wszPath); } - if (bOk) - { - wcscat_s(wszPath, MAX_PATH, L"\\" _T(PRODUCT_NAME) L".IA-32.dll"); - bOk = InstallResource(TRUE, hInstance, IDR_EP_IA32, wszPath); - } - if (argc >= 2) - { - wcsncpy_s(wszPath, MAX_PATH, wargv[1], MAX_PATH); - } - else - { - GetCurrentDirectoryW(MAX_PATH, wszPath); - } - if (bOk) - { - wcscat_s(wszPath, MAX_PATH, L"\\" _T(PRODUCT_NAME) L".amd64.dll"); - bOk = InstallResource(TRUE, hInstance, IDR_EP_AMD64, wszPath); - } - if (argc >= 2) - { - wcsncpy_s(wszPath, MAX_PATH, wargv[1], MAX_PATH); - } - else - { - GetCurrentDirectoryW(MAX_PATH, wszPath); - } - if (bOk) - { - wcscat_s(wszPath, MAX_PATH, L"\\ep_dwm.exe"); - bOk = InstallResource(TRUE, hInstance, IDR_EP_DWM, wszPath); - } - if (argc >= 2) - { - wcsncpy_s(wszPath, MAX_PATH, wargv[1], MAX_PATH); - } - else - { - GetCurrentDirectoryW(MAX_PATH, wszPath); - } - if (bOk) - { - wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host.dll"); - bOk = InstallResource(TRUE, hInstance, IDR_EP_WEATHER, wszPath); - } - if (argc >= 2) - { - wcsncpy_s(wszPath, MAX_PATH, wargv[1], MAX_PATH); - } - else - { - GetCurrentDirectoryW(MAX_PATH, wszPath); - } - if (bOk) - { - wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host_stub.dll"); - bOk = InstallResource(TRUE, hInstance, IDR_EP_WEATHER_STUB, wszPath); - } - if (argc >= 2) - { - wcsncpy_s(wszPath, MAX_PATH, wargv[1], MAX_PATH); - } - else - { - GetCurrentDirectoryW(MAX_PATH, wszPath); - } - if (bOk) - { - wcscat_s(wszPath, MAX_PATH, L"\\WebView2Loader.dll"); - bOk = InstallResource(TRUE, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath); - } - if (argc >= 2) - { - wcsncpy_s(wszPath, MAX_PATH, wargv[1], MAX_PATH); - } - else - { - GetCurrentDirectoryW(MAX_PATH, wszPath); - } - if (bOk) - { - wcscat_s(wszPath, MAX_PATH, L"\\wincorlib.dll"); - bOk = InstallResource(TRUE, hInstance, IDR_EP_STARTMENU, wszPath); - } + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_IA32, wszPath, _T(PRODUCT_NAME) L".IA-32.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, _T(PRODUCT_NAME) L".amd64.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_DWM, wszPath, L"ep_dwm.exe"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER, wszPath, L"ep_weather_host.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER_STUB, wszPath, L"ep_weather_host_stub.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath, L"WebView2Loader.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_STARTMENU, wszPath, L"wincorlib.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_GUI, wszPath, L"ep_gui.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_TASKBAR_2, wszPath, L"ep_taskbar.2.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_TASKBAR_3, wszPath, L"ep_taskbar.3.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_TASKBAR_4, wszPath, L"ep_taskbar.4.dll"); return 0; } @@ -546,6 +513,13 @@ int WINAPI wWinMain( bIsUpdate = (argc >= 1 && !_wcsicmp(wargv[0], L"/update_silent")); if (!bInstall && (!_wcsicmp(wargv[0], L"/uninstall") || bForcePromptForUninstall)) { + HWND hwndExistingMb = FindWindowExW(NULL, NULL, L"#32770", _T(PRODUCT_NAME)); + if (hwndExistingMb) + { + SwitchToThisWindow(hwndExistingMb, TRUE); + exit(0); + } + wchar_t mbText[256]; mbText[0] = 0; LoadStringW(hInstance, IDS_SETUP_UNINSTALL_PROMPT, mbText, ARRAYSIZE(mbText)); @@ -673,24 +647,11 @@ int WINAPI wWinMain( } } Sleep(100); - GetSystemDirectoryW(wszPath, MAX_PATH); - wcscat_s(wszPath, MAX_PATH, L"\\taskkill.exe"); - SHELLEXECUTEINFOW sei; - ZeroMemory(&sei, sizeof(SHELLEXECUTEINFOW)); - sei.cbSize = sizeof(sei); - sei.fMask = SEE_MASK_NOCLOSEPROCESS; - sei.hwnd = NULL; - sei.hInstApp = NULL; - sei.lpVerb = NULL; - sei.lpFile = wszPath; - sei.lpParameters = L"/f /im explorer.exe"; - sei.hwnd = NULL; - sei.nShow = SW_SHOWMINIMIZED; - if (ShellExecuteExW(&sei) && sei.hProcess) - { - WaitForSingleObject(sei.hProcess, INFINITE); - CloseHandle(sei.hProcess); - } + KillProcess(L"explorer.exe"); + KillProcess(L"StartMenuExperienceHost.exe"); + KillProcess(L"SearchHost.exe"); + KillProcess(L"SearchApp.exe"); + KillProcess(L"ShellExperienceHost.exe"); Sleep(500); @@ -794,12 +755,12 @@ int WINAPI wWinMain( } } - if (bOk) - { - SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath); - wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\" _T(SETUP_UTILITY_NAME)); - bOk = InstallResource(bInstall, hInstance, 0, wszPath); - } + // -------------------------------------------------------------------------------- + + // C:\Program Files\ExplorerPatcher + SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath); + wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH)); + if (bOk && bInstall) bOk = InstallResource(bInstall, hInstance, 0, wszPath, _T(SETUP_UTILITY_NAME)); if (bOk) { if (!bInstall) @@ -857,172 +818,100 @@ int WINAPI wWinMain( } } } - if (bOk) - { - SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath); - wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\" _T(PRODUCT_NAME) L".IA-32.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_IA32, wszPath); - } - if (bOk) - { - PathRemoveFileSpecW(wszPath); - wcscat_s(wszPath, MAX_PATH, L"\\" _T(PRODUCT_NAME) L".amd64.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath); - } - if (bOk) - { - PathRemoveFileSpecW(wszPath); - wcscat_s(wszPath, MAX_PATH, L"\\ep_gui.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_GUI, wszPath); - } - if (bOk) - { - PathRemoveFileSpecW(wszPath); - wcscat_s(wszPath, MAX_PATH, L"\\ep_dwm.exe"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_DWM, wszPath); - } + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_IA32, wszPath, _T(PRODUCT_NAME) L".IA-32.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, _T(PRODUCT_NAME) L".amd64.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_GUI, wszPath, L"ep_gui.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_DWM, wszPath, L"ep_dwm.exe"); if (bInstall) { - if (bOk) - { - PathRemoveFileSpecW(wszPath); - wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER, wszPath); - } - if (bOk) - { - PathRemoveFileSpecW(wszPath); - wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host_stub.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER_STUB, wszPath); - } - if (bOk) - { - PathRemoveFileSpecW(wszPath); - wcscat_s(wszPath, MAX_PATH, L"\\WebView2Loader.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath); - } + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER, wszPath, L"ep_weather_host.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER_STUB, wszPath, L"ep_weather_host_stub.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath, L"WebView2Loader.dll"); } - if (bOk) + LPCWSTR pwszTaskbarDllName = PickTaskbarDll(); + if (bOk) bOk = InstallResource(bInstall && pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.2.dll"), hInstance, IDR_EP_TASKBAR_2, wszPath, L"ep_taskbar.2.dll"); + if (bOk) bOk = InstallResource(bInstall && pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.3.dll"), hInstance, IDR_EP_TASKBAR_3, wszPath, L"ep_taskbar.3.dll"); + if (bOk) bOk = InstallResource(bInstall && pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.4.dll"), hInstance, IDR_EP_TASKBAR_4, wszPath, L"ep_taskbar.4.dll"); + + // -------------------------------------------------------------------------------- + + // C:\Windows + // + dxgi.dll + if (bOk) GetWindowsDirectoryW(wszPath, MAX_PATH); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, L"dxgi.dll"); + + // -------------------------------------------------------------------------------- + + // C:\Windows\SystemApps\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy + // + dxgi.dll + // + wincorlib.dll + // + wincorlib_orig.dll (symlink) + // - AppResolverLegacy.dll + // - StartTileDataLegacy.dll + // - Windows.UI.ShellCommon.pri + // - en-US\StartTileDataLegacy.dll.mui + // - pris2\Windows.UI.ShellCommon.en-US.pri + if (bOk) GetWindowsDirectoryW(wszPath, MAX_PATH); + if (bOk) wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, L"dxgi.dll"); + if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_STARTMENU, wszPath, L"wincorlib.dll"); + if (bOk) bOk = DeleteResource(wszPath, L"wincorlib_orig.dll"); + if (bOk && IsWindows11() && bInstall) { - bOk = GetWindowsDirectoryW(wszPath, MAX_PATH); - } - if (bOk) - { - wcscat_s(wszPath, MAX_PATH, L"\\dxgi.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath); - } - if (bOk) - { - bOk = GetWindowsDirectoryW(wszPath, MAX_PATH); - } - if (bOk && rovi.dwBuildNumber >= 18362) - { - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\dxgi.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath); - } - if (bOk) - { - bOk = GetWindowsDirectoryW(wszPath, MAX_PATH); + // Symlink wincorlib_orig.dll to wincorlib.dll in System32 + WCHAR wszOrigPath[MAX_PATH]; + GetSystemDirectoryW(wszOrigPath, MAX_PATH); + wcscat_s(wszOrigPath, MAX_PATH, L"\\wincorlib.dll"); + + WCHAR wszSymLinkPath[MAX_PATH]; + wcscpy_s(wszSymLinkPath, MAX_PATH, wszPath); + wcscat_s(wszSymLinkPath, MAX_PATH, L"\\wincorlib_orig.dll"); + bOk = CreateSymbolicLinkW(wszSymLinkPath, wszOrigPath, 0); } + + // Delete remnants from earlier versions + if (bOk) bOk = DeleteResource(wszPath, L"AppResolverLegacy.dll"); + if (bOk) bOk = DeleteResource(wszPath, L"StartTileDataLegacy.dll"); + if (bOk && IsWindows11()) bOk = DeleteResource(wszPath, L"Windows.UI.ShellCommon.pri"); + + // .\en-US if (bOk && IsWindows11()) { - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\wincorlib.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_STARTMENU, wszPath); - } - if (bOk) - { - bOk = GetWindowsDirectoryW(wszPath, MAX_PATH); - } - if (bOk && IsWindows11()) - { - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\wincorlib_orig.dll"); - bOk = InstallResource(FALSE, hInstance, 0, wszPath); // Delete - } - if (bOk && IsWindows11()) - { - if (bInstall) + WCHAR wszSubPath[MAX_PATH]; + wcscpy_s(wszSubPath, MAX_PATH, wszPath); + wcscat_s(wszSubPath, MAX_PATH, L"\\en-US"); + if (FileExistsW(wszSubPath)) { - WCHAR wszOrigPath[MAX_PATH]; - GetSystemDirectoryW(wszOrigPath, MAX_PATH); - wcscat_s(wszOrigPath, MAX_PATH, L"\\wincorlib.dll"); - bOk = CreateSymbolicLinkW(wszPath, wszOrigPath, 0); + bOk = DeleteResource(wszSubPath, L"StartTileDataLegacy.dll.mui"); + if (bOk) bOk = RemoveDirectoryW(wszSubPath); } } + + // .\pris2 if (bOk && IsWindows11()) { - GetWindowsDirectoryW(wszPath, MAX_PATH); - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\AppResolverLegacy.dll"); - if (FileExistsW(wszPath)) + WCHAR wszSubPath[MAX_PATH]; + wcscpy_s(wszSubPath, MAX_PATH, wszPath); + wcscat_s(wszSubPath, MAX_PATH, L"\\pris2"); + if (FileExistsW(wszSubPath)) { - bOk = DeleteFileW(wszPath); + bOk = DeleteResource(wszSubPath, L"Windows.UI.ShellCommon.en-US.pri"); + if (bOk) bOk = RemoveDirectoryW(wszSubPath); } } - if (bOk && IsWindows11()) - { - GetWindowsDirectoryW(wszPath, MAX_PATH); - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\StartTileDataLegacy.dll"); - if (FileExistsW(wszPath)) - { - bOk = DeleteFileW(wszPath); - } - } - if (bOk && IsWindows11()) - { - GetWindowsDirectoryW(wszPath, MAX_PATH); - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\Windows.UI.ShellCommon.pri"); - if (ShouldDownloadOrDelete(bInstall, hInstance, wszPath, "95b41e1a2661501036198d8225aaa605") && IsConnectedToInternet() == TRUE) - { - DownloadFile(L"https://github.com/valinet/ExplorerPatcher/files/8136442/Windows.UI.ShellCommon.pri.txt", 10 * 1024 * 1024, wszPath); - } - } - if (bOk && IsWindows11()) - { - GetWindowsDirectoryW(wszPath, MAX_PATH); - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\en-US"); - if (FileExistsW(wszPath)) - { - wcscat_s(wszPath, MAX_PATH, L"\\StartTileDataLegacy.dll.mui"); - if (FileExistsW(wszPath)) - { - bOk = DeleteFileW(wszPath); - } - if (bOk) - { - PathRemoveExtensionW(wszPath); - wcscat_s(wszPath, MAX_PATH, L".prev"); - if (FileExistsW(wszPath)) - { - bOk = DeleteFileW(wszPath); - } - } - if (bOk) - { - GetWindowsDirectoryW(wszPath, MAX_PATH); - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\en-US"); - bOk = RemoveDirectoryW(wszPath); - } - } - } - if (bOk && IsWindows11()) - { - GetWindowsDirectoryW(wszPath, MAX_PATH); - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\pris2"); - CreateDirectoryW(wszPath, NULL); - wcscat_s(wszPath, MAX_PATH, L"\\Windows.UI.ShellCommon.en-US.pri"); - if (ShouldDownloadOrDelete(bInstall, hInstance, wszPath, "12d7b85cd1b995698b23e5d41fab60ec") && IsConnectedToInternet() == TRUE) - { - DownloadFile(L"https://github.com/valinet/ExplorerPatcher/files/8136451/Windows.UI.ShellCommon.en-US.pri.txt", 10 * 1024 * 1024, wszPath); - } - } - if (bOk) - { - bOk = GetWindowsDirectoryW(wszPath, MAX_PATH); - } - if (bOk && IsWindows11()) - { - wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\ShellExperienceHost_cw5n1h2txyewy\\dxgi.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath); - } + + // End remnant deletion + + // -------------------------------------------------------------------------------- + + // C:\Windows\SystemApps\ShellExperienceHost_cw5n1h2txyewy + // + dxgi.dll + if (bOk) GetWindowsDirectoryW(wszPath, MAX_PATH); + if (bOk) wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\ShellExperienceHost_cw5n1h2txyewy"); + if (bOk && IsWindows11()) bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath, L"dxgi.dll"); + + // -------------------------------------------------------------------------------- + if (bOk) { GetSystemDirectoryW(wszPath, MAX_PATH); @@ -1150,30 +1039,39 @@ int WINAPI wWinMain( } if (!bInstall) { - if (bOk) - { - SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath); - wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\ep_weather_host.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER, wszPath); - } - if (bOk) - { - PathRemoveFileSpecW(wszPath); - wcscat_s(wszPath, MAX_PATH, L"\\ep_weather_host_stub.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER_STUB, wszPath); - } - if (bOk) - { - PathRemoveFileSpecW(wszPath); - wcscat_s(wszPath, MAX_PATH, L"\\WebView2Loader.dll"); - bOk = InstallResource(bInstall, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath); - } + SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath); + wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH)); + if (bOk) bOk = DeleteResource(wszPath, L"ep_weather_host.dll"); + if (bOk) bOk = DeleteResource(wszPath, L"ep_weather_host_stub.dll"); + if (bOk) bOk = DeleteResource(wszPath, L"WebView2Loader.dll"); } if (bOk) { if (!bInstall) { + WCHAR wszTempPath[MAX_PATH]; + GetTempPathW(MAX_PATH, wszTempPath); + wcscat_s(wszTempPath, MAX_PATH, _T(SETUP_UTILITY_NAME)); + if (MoveFileExW(wszOwnPath, wszTempPath, MOVEFILE_REPLACE_EXISTING)) + { + HKEY hKey = NULL; + RegCreateKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKey, NULL); + if (hKey && hKey != INVALID_HANDLE_VALUE) + { + WCHAR wszCommand[MAX_PATH]; + wcscpy_s(wszCommand, MAX_PATH, L"cmd /c del /f /q \""); + wcscat_s(wszCommand, MAX_PATH, wszTempPath); + wcscat_s(wszCommand, MAX_PATH, L"\""); + RegSetValueExW(hKey, L"ExplorerPatcherCleanup", 0, REG_SZ, (BYTE*)wszCommand, (DWORD)((wcslen(wszCommand) + 1) * sizeof(WCHAR))); + RegCloseKey(hKey); + } + } + + SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath); + wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH)); + RemoveDirectoryW(wszPath); + wchar_t mbText[256]; mbText[0] = 0; if (bWasShellExt) diff --git a/ep_setup/ep_setup.vcxproj b/ep_setup/ep_setup.vcxproj index 17f769f..5bcf79a 100644 --- a/ep_setup/ep_setup.vcxproj +++ b/ep_setup/ep_setup.vcxproj @@ -150,6 +150,21 @@ true + + + EP_TASKBAR_2_EXISTS;%(PreprocessorDefinitions) + + + + + EP_TASKBAR_3_EXISTS;%(PreprocessorDefinitions) + + + + + EP_TASKBAR_4_EXISTS;%(PreprocessorDefinitions) + + diff --git a/ep_setup/resources/ep_setup.rc b/ep_setup/resources/ep_setup.rc index 2bd0f04..82c8e5e 100644 --- a/ep_setup/resources/ep_setup.rc +++ b/ep_setup/resources/ep_setup.rc @@ -106,6 +106,18 @@ IDR_EP_STARTMENU RCDATA "..\\build\\Release\\ep_startmenu.dll IDR_EP_GUI RCDATA "..\\build\\Release\\ep_gui.dll" +#if EP_TASKBAR_2_EXISTS +IDR_EP_TASKBAR_2 RCDATA "..\\build\\Release\\ep_taskbar.2.dll" +#endif + +#if EP_TASKBAR_3_EXISTS +IDR_EP_TASKBAR_3 RCDATA "..\\build\\Release\\ep_taskbar.3.dll" +#endif + +#if EP_TASKBAR_4_EXISTS +IDR_EP_TASKBAR_4 RCDATA "..\\build\\Release\\ep_taskbar.4.dll" +#endif + #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/ep_setup/resources/resource.h b/ep_setup/resources/resource.h index ab86dba..5102e2c 100644 --- a/ep_setup/resources/resource.h +++ b/ep_setup/resources/resource.h @@ -10,6 +10,9 @@ #define IDR_MS_WEBVIEW2_LOADER 201 #define IDR_EP_STARTMENU 108 #define IDR_EP_GUI 109 +#define IDR_EP_TASKBAR_2 110 +#define IDR_EP_TASKBAR_3 111 +#define IDR_EP_TASKBAR_4 112 #define IDS_SETUP_UNINSTALL_PROMPT 301 #define IDS_SETUP_INSTALL_LOGOFF 302