From 4e670f703b553eaba7ed8ba1ce18290d195b1842 Mon Sep 17 00:00:00 2001 From: Valentin Radu Date: Mon, 30 Aug 2021 08:01:35 +0300 Subject: [PATCH] Skinned "Safe to Remove Hardware" popup menu * The popup menu for "Safe to Remove Hardware" is now skinned in the same style as the Win+X menu and the taskbar context menus, in order to improve UI consistency. --- ExplorerPatcher/ExplorerPatcher.rc | 8 +- .../ExplorerPatcherLibrary.rc | 8 +- ExplorerPatcherLibrary/dllmain.c | 223 +++++++++++++++++- 3 files changed, 229 insertions(+), 10 deletions(-) diff --git a/ExplorerPatcher/ExplorerPatcher.rc b/ExplorerPatcher/ExplorerPatcher.rc index 7afb1a0..53ea7ee 100644 --- a/ExplorerPatcher/ExplorerPatcher.rc +++ b/ExplorerPatcher/ExplorerPatcher.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 22000,168,0,7 - PRODUCTVERSION 22000,168,0,7 + FILEVERSION 22000,168,0,8 + PRODUCTVERSION 22000,168,0,8 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,12 +69,12 @@ BEGIN BEGIN VALUE "CompanyName", "VALINET Solutions SRL" VALUE "FileDescription", "ExplorerPatcher Daemon" - VALUE "FileVersion", "22000.168.0.7" + VALUE "FileVersion", "22000.168.0.8" VALUE "InternalName", "ExplorerPatcher.exe" VALUE "LegalCopyright", "Copyright (C) 2006-2021 VALINET Solutions SRL. All rights reserved." VALUE "OriginalFilename", "ExplorerPatcher.exe" VALUE "ProductName", "ExplorerPatcher" - VALUE "ProductVersion", "22000.168.0.7" + VALUE "ProductVersion", "22000.168.0.8" END END BLOCK "VarFileInfo" diff --git a/ExplorerPatcherLibrary/ExplorerPatcherLibrary.rc b/ExplorerPatcherLibrary/ExplorerPatcherLibrary.rc index 858f799..85b7e36 100644 --- a/ExplorerPatcherLibrary/ExplorerPatcherLibrary.rc +++ b/ExplorerPatcherLibrary/ExplorerPatcherLibrary.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 22000,168,0,7 - PRODUCTVERSION 22000,168,0,7 + FILEVERSION 22000,168,0,8 + PRODUCTVERSION 22000,168,0,8 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,12 +69,12 @@ BEGIN BEGIN VALUE "CompanyName", "VALINET Solutions SRL" VALUE "FileDescription", "ExplorerPatcher Library" - VALUE "FileVersion", "22000.168.0.7" + VALUE "FileVersion", "22000.168.0.8" VALUE "InternalName", "ExplorerPatcherLibrary.dll" VALUE "LegalCopyright", "Copyright (C) 2006-2021 VALINET Solutions SRL. All rights reserved." VALUE "OriginalFilename", "ExplorerPatcherLibrary.dll" VALUE "ProductName", "WinOverview" - VALUE "ProductVersion", "22000.168.0.7" + VALUE "ProductVersion", "22000.168.0.8" END END BLOCK "VarFileInfo" diff --git a/ExplorerPatcherLibrary/dllmain.c b/ExplorerPatcherLibrary/dllmain.c index cf5f40a..48841aa 100644 --- a/ExplorerPatcherLibrary/dllmain.c +++ b/ExplorerPatcherLibrary/dllmain.c @@ -60,6 +60,10 @@ DEFINE_GUID(__uuidof_IAuthUILogonSound, #define TWINUI_SB_1 "IsDesktopInputContext" #define TWINUI_SB_2 "CImmersiveHotkeyNotification::OnMessage" #define TWINUI_SB_CNT 3 +#define STOBJECT_SB_NAME "stobject" +#define STOBJECT_SB_0 "SysTrayWndProc" +#define STOBJECT_SB_1 "HotPlugButtonClick" +#define STOBJECT_SB_CNT 2 const char* explorer_SN[EXPLORER_SB_CNT] = { EXPLORER_SB_0, EXPLORER_SB_1, @@ -79,12 +83,17 @@ const char* twinui_SN[TWINUI_SB_CNT] = { TWINUI_SB_1, TWINUI_SB_2 }; +const char* stobject_SN[STOBJECT_SB_CNT] = { + STOBJECT_SB_0, + STOBJECT_SB_1 +}; #pragma pack(push, 1) typedef struct symbols_addr { DWORD explorer_PTRS[EXPLORER_SB_CNT]; DWORD twinui_pcshell_PTRS[TWINUI_PCSHELL_SB_CNT]; DWORD twinui_PTRS[TWINUI_SB_CNT]; + DWORD stobject_PTRS[STOBJECT_SB_CNT]; } symbols_addr; #pragma pack(pop) @@ -261,6 +270,24 @@ static BOOL(*IsDesktopInputContextFunc)( +static INT64(*SysTrayWndProcFunc)( + _In_ HWND hWnd, + _In_ UINT uMsg, + _In_ WPARAM wParam, + _In_ LPARAM lParam + ); + +static BOOL(*TrackPopupMenuFunc)( + HMENU hMenu, + UINT uFlags, + int x, + int y, + int nReserved, + HWND hWnd, + const RECT* prcRect +); + + DEFINE_GUID(CLSID_ImmersiveShell, @@ -607,6 +634,87 @@ LRESULT CALLBACK CLauncherTipContextMenu_WndProc( return result; } +HWND lastSysTrayhWnd; + +BOOL TrackPopupMenuHook( + HMENU hMenu, + UINT uFlags, + int x, + int y, + int nReserved, + HWND hWnd, + const RECT* prcRect +) +{ + if (hWnd != lastSysTrayhWnd) + { + return TrackPopupMenuFunc( + hMenu, + uFlags, + x, + y, + nReserved, + hWnd, + prcRect + ); + } + INT64* unknown_array = calloc(4, sizeof(INT64)); + POINT pt; + pt.x = x; + pt.y = y; + ImmersiveContextMenuHelper_ApplyOwnerDrawToMenuFunc( + hMenu, + hWnd, + &(pt), + 0xc, + unknown_array + ); + BOOL b = TrackPopupMenuFunc( + hMenu, + uFlags, + x, + y, + nReserved, + hWnd, + prcRect + ); + ImmersiveContextMenuHelper_RemoveOwnerDrawFromMenuFunc( + hMenu, + hWnd, + &(pt) + ); + free(unknown_array); + return b; +} + +INT64 SysTrayWndProcHook( + _In_ HWND hWnd, + _In_ UINT uMsg, + _In_ WPARAM wParam, + _In_ LPARAM lParam +) +{ + lastSysTrayhWnd = hWnd; + BOOL v12 = FALSE; + if ((uMsg == WM_DRAWITEM || uMsg == WM_MEASUREITEM) && + CImmersiveContextMenuOwnerDrawHelper_s_ContextMenuWndProcFunc( + hWnd, + uMsg, + wParam, + lParam, + &v12 + )) + { + return 0; + } + return SysTrayWndProcFunc( + hWnd, + uMsg, + wParam, + lParam + ); +} + typedef struct { void* _this; @@ -1439,6 +1547,19 @@ __declspec(dllexport) DWORD WINAPI main( wszSettingsPath ); + symbols_PTRS.stobject_PTRS[0] = VnGetUInt( + TEXT(STOBJECT_SB_NAME), + TEXT(STOBJECT_SB_0), + 0, + wszSettingsPath + ); + symbols_PTRS.stobject_PTRS[1] = VnGetUInt( + TEXT(STOBJECT_SB_NAME), + TEXT(STOBJECT_SB_1), + 0, + wszSettingsPath + ); + BOOL bNeedToDownload = FALSE; for (UINT i = 0; i < sizeof(symbols_addr) / sizeof(DWORD); ++i) { @@ -1577,6 +1698,7 @@ __declspec(dllexport) DWORD WINAPI main( MAX_PATH, ".exe" ); + printf("Downloading symbols for %s.\n", explorer_sb_exe); if (VnDownloadSymbols( NULL, explorer_sb_exe, @@ -1590,6 +1712,7 @@ __declspec(dllexport) DWORD WINAPI main( ); return 2; } + printf("Reading symbols.\n"); if (VnGetSymbols( szSettingsPath, symbols_PTRS.explorer_PTRS, @@ -1646,6 +1769,7 @@ __declspec(dllexport) DWORD WINAPI main( MAX_PATH, ".dll" ); + printf("Downloading symbols for %s.\n", twinui_pcshell_sb_dll); if (VnDownloadSymbols( NULL, twinui_pcshell_sb_dll, @@ -1659,6 +1783,7 @@ __declspec(dllexport) DWORD WINAPI main( ); return 4; } + printf("Reading symbols.\n"); if (VnGetSymbols( szSettingsPath, symbols_PTRS.twinui_pcshell_PTRS, @@ -1739,6 +1864,7 @@ __declspec(dllexport) DWORD WINAPI main( MAX_PATH, ".dll" ); + printf("Downloading symbols for %s.\n", twinui_sb_dll); if (VnDownloadSymbols( NULL, twinui_sb_dll, @@ -1752,6 +1878,7 @@ __declspec(dllexport) DWORD WINAPI main( ); return 6; } + printf("Reading symbols.\n"); if (VnGetSymbols( szSettingsPath, symbols_PTRS.twinui_PTRS, @@ -1784,6 +1911,71 @@ __declspec(dllexport) DWORD WINAPI main( wszSettingsPath ); + char stobject_sb_dll[MAX_PATH]; + ZeroMemory( + stobject_sb_dll, + (MAX_PATH) * sizeof(char) + ); + GetSystemDirectoryA( + stobject_sb_dll, + MAX_PATH + ); + strcat_s( + stobject_sb_dll, + MAX_PATH, + "\\" + ); + strcat_s( + stobject_sb_dll, + MAX_PATH, + STOBJECT_SB_NAME + ); + strcat_s( + stobject_sb_dll, + MAX_PATH, + ".dll" + ); + printf("Downloading symbols for %s.\n", stobject_sb_dll); + if (VnDownloadSymbols( + NULL, + stobject_sb_dll, + szSettingsPath, + MAX_PATH + )) + { + FreeLibraryAndExitThread( + hModule, + 6 + ); + return 6; + } + printf("Reading symbols.\n"); + if (VnGetSymbols( + szSettingsPath, + symbols_PTRS.stobject_PTRS, + stobject_SN, + STOBJECT_SB_CNT + )) + { + FreeLibraryAndExitThread( + hModule, + 7 + ); + return 7; + } + VnWriteUInt( + TEXT(STOBJECT_SB_NAME), + TEXT(STOBJECT_SB_0), + symbols_PTRS.stobject_PTRS[0], + wszSettingsPath + ); + VnWriteUInt( + TEXT(STOBJECT_SB_NAME), + TEXT(STOBJECT_SB_1), + symbols_PTRS.stobject_PTRS[1], + wszSettingsPath + ); + VnWriteString( TEXT("OS"), TEXT("Build"), @@ -1851,7 +2043,7 @@ __declspec(dllexport) DWORD WINAPI main( if (hUser32) CreateWindowInBand = GetProcAddress(hUser32, "CreateWindowInBand"); - + LoadLibrary("twinui.pcshell.dll"); HANDLE hTwinuiPcshell = GetModuleHandle(L"twinui.pcshell.dll"); CImmersiveContextMenuOwnerDrawHelper_s_ContextMenuWndProcFunc = (INT64(*)(HWND, int, HWND, int, BOOL*)) @@ -1886,7 +2078,7 @@ __declspec(dllexport) DWORD WINAPI main( } - + LoadLibrary(L"twinui.dll"); HANDLE hTwinui = GetModuleHandle(L"twinui.dll"); CImmersiveHotkeyNotification_GetMonitorForHotkeyNotificationFunc = (INT64(*)(void*, void**, HWND*)) @@ -1910,6 +2102,33 @@ __declspec(dllexport) DWORD WINAPI main( + LoadLibrary(L"stobject.dll"); + HANDLE hStobject = GetModuleHandle(L"stobject.dll"); + SysTrayWndProcFunc = (INT64(*)(HWND, UINT, WPARAM, LPARAM)) + ((uintptr_t)hStobject + symbols_PTRS.stobject_PTRS[0]); + rv = funchook_prepare( + funchook, + (void**)&SysTrayWndProcFunc, + SysTrayWndProcHook + ); + if (rv != 0) + { + FreeLibraryAndExitThread(hModule, rv); + return rv; + } + TrackPopupMenuFunc = TrackPopupMenu; + rv = funchook_prepare( + funchook, + (void**)&TrackPopupMenuFunc, + TrackPopupMenuHook + ); + if (rv != 0) + { + FreeLibraryAndExitThread(hModule, rv); + return rv; + } + + rv = funchook_install(funchook, 0); if (rv != 0) {