diff --git a/ExplorerPatcher/ImmersiveFlyouts.c b/ExplorerPatcher/ImmersiveFlyouts.c index d66c4a1..dbbe1cc 100644 --- a/ExplorerPatcher/ImmersiveFlyouts.c +++ b/ExplorerPatcher/ImmersiveFlyouts.c @@ -56,7 +56,7 @@ void InvokeActionCenter() } } -void InvokeFlyout(BOOL bAction, DWORD dwWhich) +HRESULT InvokeFlyoutRect(BOOL bAction, DWORD dwWhich, __x_ABI_CWindows_CFoundation_CRect* pRc) { HRESULT hr = S_OK; IUnknown* pImmersiveShell = NULL; @@ -70,13 +70,13 @@ void InvokeFlyout(BOOL bAction, DWORD dwWhich) if (SUCCEEDED(hr)) { IShellExperienceManagerFactory* pShellExperienceManagerFactory = NULL; - IUnknown_QueryService( + hr = IUnknown_QueryService( pImmersiveShell, &CLSID_ShellExperienceManagerFactory, &CLSID_ShellExperienceManagerFactory, &pShellExperienceManagerFactory ); - if (pShellExperienceManagerFactory) + if (SUCCEEDED(hr)) { HSTRING_HEADER hstringHeader; HSTRING hstring = NULL; @@ -102,18 +102,18 @@ void InvokeFlyout(BOOL bAction, DWORD dwWhich) &hstringHeader, &hstring ); - if (hstring) + if (SUCCEEDED(hr)) { IUnknown* pIntf = NULL; - pShellExperienceManagerFactory->lpVtbl->GetExperienceManager( + hr = pShellExperienceManagerFactory->lpVtbl->GetExperienceManager( pShellExperienceManagerFactory, hstring, &pIntf ); - if (pIntf) + if (SUCCEEDED(hr)) { IExperienceManager* pExperienceManager = NULL; - pIntf->lpVtbl->QueryInterface( + hr = pIntf->lpVtbl->QueryInterface( pIntf, dwWhich == INVOKE_FLYOUT_NETWORK ? &IID_NetworkFlyoutExperienceManager : (dwWhich == INVOKE_FLYOUT_CLOCK ? &IID_TrayClockFlyoutExperienceManager : @@ -121,17 +121,15 @@ void InvokeFlyout(BOOL bAction, DWORD dwWhich) (dwWhich == INVOKE_FLYOUT_SOUND ? &IID_TrayMtcUvcFlyoutExperienceManager : &IID_IUnknown))), &pExperienceManager ); - if (pExperienceManager) + if (SUCCEEDED(hr)) { - RECT rc; - SetRect(&rc, 0, 0, 0, 0); if (bAction == INVOKE_FLYOUT_SHOW) { - pExperienceManager->lpVtbl->ShowFlyout(pExperienceManager, &rc, NULL); + hr = pExperienceManager->lpVtbl->ShowFlyout(pExperienceManager, pRc); } else if (bAction == INVOKE_FLYOUT_HIDE) { - pExperienceManager->lpVtbl->HideFlyout(pExperienceManager); + hr = pExperienceManager->lpVtbl->HideFlyout(pExperienceManager); } pExperienceManager->lpVtbl->Release(pExperienceManager); } @@ -143,4 +141,5 @@ void InvokeFlyout(BOOL bAction, DWORD dwWhich) } pImmersiveShell->lpVtbl->Release(pImmersiveShell); } + return hr; } diff --git a/ExplorerPatcher/ImmersiveFlyouts.h b/ExplorerPatcher/ImmersiveFlyouts.h index 947320f..d36d635 100644 --- a/ExplorerPatcher/ImmersiveFlyouts.h +++ b/ExplorerPatcher/ImmersiveFlyouts.h @@ -57,8 +57,7 @@ typedef struct IExperienceManagerVtbl // : IInspectable HRESULT(STDMETHODCALLTYPE* ShowFlyout)( IExperienceManager* This, - /* [in] */ RECT* rect, - /* [in] */ HWND hWnd); + /* [in] */ __x_ABI_CWindows_CFoundation_CRect* rect); HRESULT(STDMETHODCALLTYPE* HideFlyout)( IExperienceManager* This); @@ -192,5 +191,14 @@ void InvokeActionCenter(); #define INVOKE_FLYOUT_CLOCK 2 #define INVOKE_FLYOUT_BATTERY 3 #define INVOKE_FLYOUT_SOUND 4 -void InvokeFlyout(BOOL bAction, DWORD dwWhich); + +HRESULT InvokeFlyoutRect(BOOL bAction, DWORD dwWhich, __x_ABI_CWindows_CFoundation_CRect* pRc); + +inline HRESULT InvokeFlyout(BOOL bAction, DWORD dwWhich) +{ + __x_ABI_CWindows_CFoundation_CRect rc; + ZeroMemory(&rc, sizeof(rc)); + return InvokeFlyoutRect(bAction, dwWhich, &rc); +} + #endif \ No newline at end of file diff --git a/ExplorerPatcher/StartMenu.c b/ExplorerPatcher/StartMenu.c index 981a721..a0f1691 100644 --- a/ExplorerPatcher/StartMenu.c +++ b/ExplorerPatcher/StartMenu.c @@ -765,7 +765,7 @@ BOOL NeedsRo_PositionStartMenuForMonitor( return TRUE; } -DWORD GetStartMenuPosition(FARPROC SHRegGetValueFromHKCUHKLMFunc) +DWORD GetStartMenuPosition(t_SHRegGetValueFromHKCUHKLM SHRegGetValueFromHKCUHKLMFunc) { DWORD dwSize = sizeof(DWORD); @@ -776,7 +776,7 @@ DWORD GetStartMenuPosition(FARPROC SHRegGetValueFromHKCUHKLMFunc) SRRF_RT_REG_DWORD, NULL, &dwTaskbarAl, - (LPDWORD)(&dwSize) + &dwSize ) != ERROR_SUCCESS) { dwTaskbarAl = 1; diff --git a/ExplorerPatcher/dllmain.c b/ExplorerPatcher/dllmain.c index 4115891..3076329 100644 --- a/ExplorerPatcher/dllmain.c +++ b/ExplorerPatcher/dllmain.c @@ -164,7 +164,7 @@ DWORD dwSpotlightDesktopMenuMask = 0; DWORD dwSpotlightUpdateSchedule = 0; int Code = 0; HRESULT InjectStartFromExplorer(); -void InvokeClockFlyout(); +BOOL InvokeClockFlyout(); void WINAPI Explorer_RefreshUI(int unused); int (*SHWindowsPolicy)(REFIID); @@ -911,79 +911,79 @@ BOOL CALLBACK ToggleImmersiveCallback(HWND hWnd, LPARAM lParam) return TRUE; } -void ToggleHelp() +BOOL ToggleHelp() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 505, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 505, 0); } -void ToggleRunDialog() +BOOL ToggleRunDialog() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 502, MAKELPARAM(MOD_WIN, 0x52)); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 502, MAKELPARAM(MOD_WIN, 0x52)); } -void ToggleSystemProperties() +BOOL ToggleSystemProperties() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 512, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 512, 0); } -void FocusSystray() +BOOL FocusSystray() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 514, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 514, 0); } -void TriggerAeroShake() +BOOL TriggerAeroShake() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 515, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 515, 0); } -void PeekDesktop() +BOOL PeekDesktop() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 516, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 516, 0); } -void ToggleEmojiPanel() +BOOL ToggleEmojiPanel() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 579, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 579, 0); } -void ShowDictationPanel() +BOOL ShowDictationPanel() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 577, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 577, 0); } -void ToggleClipboardViewer() +BOOL ToggleClipboardViewer() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 578, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 578, 0); } -void ToggleSearch() +BOOL ToggleSearch() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 507, MAKELPARAM(MOD_WIN, 0x53)); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 507, MAKELPARAM(MOD_WIN, 0x53)); } -void ToggleTaskView() +BOOL ToggleTaskView() { - EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 11); + return EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 11); } -void ToggleWidgetsPanel() +BOOL ToggleWidgetsPanel() { - EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 0x66); + return EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 0x66); } -void ToggleMainClockFlyout() +BOOL ToggleMainClockFlyout() { - EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 0x6B); + return EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 0x6B); } -void ToggleNotificationsFlyout() +BOOL ToggleNotificationsFlyout() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 591, 0); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 591, 0); } -void ToggleActionCenter() +BOOL ToggleActionCenter() { - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 500, MAKELPARAM(MOD_WIN, 0x41)); + return PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 500, MAKELPARAM(MOD_WIN, 0x41)); } #ifdef _WIN64 @@ -1734,7 +1734,7 @@ LONG_PTR __stdcall CTaskBtnGroup_GetIdealSpanHook(ITaskBtnGroup* _this, LONG_PTR return ret; } -void explorer_QISearch(void* that, LPCQITAB pqit, REFIID riid, void** ppv) +HRESULT explorer_QISearch(void* that, LPCQITAB pqit, REFIID riid, void** ppv) { HRESULT hr = QISearch(that, pqit, riid, ppv); if (SUCCEEDED(hr) && IsEqualGUID(pqit[0].piid, &IID_ITaskGroup) && bPinnedItemsActAsQuickLaunch) @@ -1907,6 +1907,8 @@ DWORD FixTaskbarAutohide(DWORD unused) } } SetEvent(hCanStartSws); + + return 0; } #endif #pragma endregion @@ -2871,7 +2873,7 @@ BOOL CheckIfMenuContainsOwnPropertiesItem(HMENU hMenu) mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_DATA | MIIM_ID; BOOL b = GetMenuItemInfoW(hMenu, i, TRUE, &mii); - if (b && (mii.wID >= 12000 && mii.wID <= 12200) && mii.dwItemData == CheckForUpdatesThread) + if (b && (mii.wID >= 12000 && mii.wID <= 12200) && mii.dwItemData == (ULONG_PTR)CheckForUpdatesThread) { return TRUE; } @@ -3064,33 +3066,6 @@ BOOL TrackPopupMenuHook( #define TB_POS_TOP 2 #define TB_POS_LEFT 3 #define TB_POS_RIGHT 4 -void PopupMenuAdjustCoordinatesAndFlags(int* x, int* y, UINT* uFlags) -{ - POINT pt; - GetCursorPos(&pt); - RECT rc; - UINT tbPos = GetTaskbarLocationAndSize(pt, &rc); - if (tbPos == TB_POS_BOTTOM) - { - *y = MIN(*y, rc.top); - *uFlags |= TPM_CENTERALIGN | TPM_BOTTOMALIGN; - } - else if (tbPos == TB_POS_TOP) - { - *y = MAX(*y, rc.bottom); - *uFlags |= TPM_CENTERALIGN | TPM_TOPALIGN; - } - else if (tbPos == TB_POS_LEFT) - { - *x = MAX(*x, rc.right); - *uFlags |= TPM_VCENTERALIGN | TPM_LEFTALIGN; - } - if (tbPos == TB_POS_RIGHT) - { - *x = MIN(*x, rc.left); - *uFlags |= TPM_VCENTERALIGN | TPM_RIGHTALIGN; - } -} UINT GetTaskbarLocationAndSize(POINT ptCursor, RECT* rc) { MONITORINFO mi; @@ -3127,6 +3102,33 @@ UINT GetTaskbarLocationAndSize(POINT ptCursor, RECT* rc) } return TB_POS_NOWHERE; } +void PopupMenuAdjustCoordinatesAndFlags(int* x, int* y, UINT* uFlags) +{ + POINT pt; + GetCursorPos(&pt); + RECT rc; + UINT tbPos = GetTaskbarLocationAndSize(pt, &rc); + if (tbPos == TB_POS_BOTTOM) + { + *y = MIN(*y, rc.top); + *uFlags |= TPM_CENTERALIGN | TPM_BOTTOMALIGN; + } + else if (tbPos == TB_POS_TOP) + { + *y = MAX(*y, rc.bottom); + *uFlags |= TPM_CENTERALIGN | TPM_TOPALIGN; + } + else if (tbPos == TB_POS_LEFT) + { + *x = MAX(*x, rc.right); + *uFlags |= TPM_VCENTERALIGN | TPM_LEFTALIGN; + } + if (tbPos == TB_POS_RIGHT) + { + *x = MIN(*x, rc.left); + *uFlags |= TPM_VCENTERALIGN | TPM_RIGHTALIGN; + } +} INT64 OwnerDrawSubclassProc( _In_ HWND hWnd, _In_ UINT uMsg, @@ -4131,7 +4133,7 @@ void ClockButton_ToggleFlyoutCallback( *((INT64*)params->TrayUIInstance + params->CLOCKBUTTON_OFFSET_IN_TRAYUI) = params->oldClockButtonInstance; free(params); } -void InvokeClockFlyout() +BOOL InvokeClockFlyout() { POINT ptCursor; GetCursorPos(&ptCursor); @@ -4174,14 +4176,13 @@ void InvokeClockFlyout() } else if (ShouldShowLegacyClockExperience() == 2) { - ToggleNotificationsFlyout(); - return 0; + return ToggleNotificationsFlyout(); } // On the main monitor, the TrayUI component of CTray handles this // message and basically does a `ClockButton::ToggleFlyout`; that's // the only place in code where that is used, otherwise, clicking and // dismissing the clock flyout probably involves 2 separate methods - PostMessageW(hShellTray_Wnd, WM_TOGGLE_CLOCK_FLYOUT, 0, 0); + return PostMessageW(hShellTray_Wnd, WM_TOGGLE_CLOCK_FLYOUT, 0, 0); } else { @@ -4227,8 +4228,7 @@ void InvokeClockFlyout() } else if (ShouldShowLegacyClockExperience() == 2) { - ToggleNotificationsFlyout(); - return 0; + return ToggleNotificationsFlyout(); } if (bOldTaskbar) { @@ -4259,15 +4259,16 @@ void InvokeClockFlyout() params->TrayUIInstance = TrayUIInstance; params->CLOCKBUTTON_OFFSET_IN_TRAYUI = CLOCKBUTTON_OFFSET_IN_TRAYUI; params->oldClockButtonInstance = oldClockButtonInstance; - SendMessageCallbackW(hShellTray_Wnd, WM_TOGGLE_CLOCK_FLYOUT, 0, 0, ClockButton_ToggleFlyoutCallback, params); + return SendMessageCallbackW(hShellTray_Wnd, WM_TOGGLE_CLOCK_FLYOUT, 0, 0, ClockButton_ToggleFlyoutCallback, params); } } else { - PostMessageW(hShellTray_Wnd, WM_TOGGLE_CLOCK_FLYOUT, 0, 0); + return PostMessageW(hShellTray_Wnd, WM_TOGGLE_CLOCK_FLYOUT, 0, 0); } } } + return FALSE; } INT64 winrt_Windows_Internal_Shell_implementation_MeetAndChatManager_OnMessageHook( void* _this, @@ -9345,11 +9346,11 @@ void PatchExplorer_UpdateWindowAccentProperties() PIMAGE_NT_HEADERS64 ntHeader = (PIMAGE_NT_HEADERS64)((u_char*)dosHeader + dosHeader->e_lfanew); if (ntHeader->Signature == IMAGE_NT_SIGNATURE) { - char* pPatchArea = NULL; + PBYTE pPatchArea = NULL; // test al, al; jz rip+0x11; and ... - char p1[] = { 0x84, 0xC0, 0x74, 0x11, 0x83, 0x65 }; - char p2[] = { 0xF3, 0xF3, 0xF3, 0xFF }; - char* pattern1 = p1; + BYTE p1[] = { 0x84, 0xC0, 0x74, 0x11, 0x83, 0x65 }; + BYTE p2[] = { 0xF3, 0xF3, 0xF3, 0xFF }; + PBYTE pattern1 = p1; int sizeof_pattern1 = 6; if (global_rovi.dwBuildNumber >= 22581) { @@ -9364,12 +9365,13 @@ void PatchExplorer_UpdateWindowAccentProperties() { if (section->SizeOfRawData && !bTwice) { - char* pCandidate = NULL; + PBYTE pSectionBegin = (PBYTE)hExplorer + section->VirtualAddress; + PBYTE pCandidate = NULL; while (TRUE) { pCandidate = memmem( - !pCandidate ? hExplorer + section->VirtualAddress : pCandidate, - !pCandidate ? section->SizeOfRawData : (uintptr_t)section->SizeOfRawData - (uintptr_t)(pCandidate - (hExplorer + section->VirtualAddress)), + !pCandidate ? pSectionBegin : pCandidate, + !pCandidate ? section->SizeOfRawData : (uintptr_t)section->SizeOfRawData - (uintptr_t)(pCandidate - pSectionBegin), pattern1, sizeof_pattern1 ); @@ -9399,8 +9401,9 @@ void PatchExplorer_UpdateWindowAccentProperties() _DecodedInst* decodedInstructions = calloc(110, sizeof(_DecodedInst)); if (decodedInstructions) { + PBYTE diasmBegin = pPatchArea - dec_size; unsigned int decodedInstructionsCount = 0; - _DecodeResult res = distorm_decode(0, (const unsigned char*)(pPatchArea - dec_size), dec_size + 20, Decode64Bits, decodedInstructions, 100, &decodedInstructionsCount); + _DecodeResult res = distorm_decode(0, diasmBegin, dec_size + 20, Decode64Bits, decodedInstructions, 100, &decodedInstructionsCount); int status = 0; for (int i = decodedInstructionsCount - 1; i >= 0; i--) { @@ -9414,7 +9417,7 @@ void PatchExplorer_UpdateWindowAccentProperties() } else if (status == 2 && strcmp(decodedInstructions[i].instructionHex.p, "cc")) { - GetTaskbarColor = pPatchArea - dec_size + decodedInstructions[i].offset; + GetTaskbarColor = diasmBegin + decodedInstructions[i].offset; status = 3; } else if (status == 3 && !strncmp(decodedInstructions[i].instructionHex.p, "e8", 2)) @@ -9423,8 +9426,8 @@ void PatchExplorer_UpdateWindowAccentProperties() } else if (status == 4 && !strncmp(decodedInstructions[i].instructionHex.p, "e8", 2)) { - uint32_t* off = pPatchArea - dec_size + decodedInstructions[i].offset + 1; - GetTaskbarTheme = pPatchArea - dec_size + decodedInstructions[i].offset + decodedInstructions[i].size + (*off); + uint32_t* off = diasmBegin + decodedInstructions[i].offset + 1; + GetTaskbarTheme = diasmBegin + decodedInstructions[i].offset + decodedInstructions[i].size + (*off); break; } if (status >= 2) @@ -9842,21 +9845,26 @@ DWORD InjectBasicFunctions(BOOL bIsExplorer, BOOL bInstall) #ifdef _WIN64 // As of writing, this function is never invoked with bInstall=TRUE, so we don't handle the case if it's false for now - RtlQueryFeatureConfigurationFunc = GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlQueryFeatureConfiguration"); - int rv = -1; - if (RtlQueryFeatureConfigurationFunc) - { - rv = funchook_prepare( - funchook, - (void**)&RtlQueryFeatureConfigurationFunc, - RtlQueryFeatureConfigurationHook - ); - } - if (rv != 0) + if (bIsExplorerProcess) { - printf("Failed to hook RtlQueryFeatureConfiguration(). rv = %d\n", rv); + RtlQueryFeatureConfigurationFunc = GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlQueryFeatureConfiguration"); + int rv = -1; + if (RtlQueryFeatureConfigurationFunc) + { + rv = funchook_prepare( + funchook, + (void**)&RtlQueryFeatureConfigurationFunc, + RtlQueryFeatureConfigurationHook + ); + } + if (rv != 0) + { + printf("Failed to hook RtlQueryFeatureConfiguration(). rv = %d\n", rv); + } } #endif + + return 0; } @@ -10009,10 +10017,10 @@ BOOL Moment2PatchControlCenter(LPMODULEINFO mi) { // Step 1: // Scan within the DLL for `rcMonitor = mi.rcMonitor`. - // ```0F 10 44 24 ?? F3 0F 7F 44 24 ?? 80 BF // movups - movdqu - cmp``` + // ```0F 10 44 24 ?? F3 0F 7F 44 24 ?? 80 // movups - movdqu - cmp``` // 22621.1992: 4B35B // 22621.2283: 65C5C - PBYTE rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x44\x24\x00\xF3\x0F\x7F\x44\x24\x00\x80\xBF", "xxxx?xxxxx?xx"); + PBYTE rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x44\x24\x00\xF3\x0F\x7F\x44\x24\x00\x80", "xxxx?xxxxx?x"); if (!rcMonitorAssignment) return FALSE; printf("[CC] rcMonitorAssignment = %llX\n", rcMonitorAssignment - (PBYTE)mi->lpBaseOfDll); @@ -10066,11 +10074,23 @@ BOOL Moment2PatchToastCenter(LPMODULEINFO mi) { // Step 1: // Scan within the DLL for `rcMonitor = mi.rcMonitor`. - // ```0F 10 45 84 ?? 0F 7F 44 24 ?? 48 8B CF // movups - movdqu - mov``` + // + // Pattern 1: + // Will have a match if CToastCenterExperienceManager::ShouldShowWithinWorkArea() is present. + // ```0F 10 45 ?? ?? 0F 7F 44 24 ?? 48 8B CF // movups - movdqu - mov``` // 22621.1992: 40CE8 // 22621.2283: 501DB - PBYTE rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x84\x00\x0F\x7F\x44\x24\x00\x48\x8B\xCF", "xxxx?xxxx?xxx"); - if (!rcMonitorAssignment) return FALSE; + // + // Pattern 2: + // Will have a match if CToastCenterExperienceManager::ShouldShowWithinWorkArea() is inlined. + // ```0F 10 45 ?? ?? 0F 7F 44 24 ?? 44 // movups - movdqu - cmp``` + // 25951.1000: 36B2C4 + PBYTE rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x00\x00\x0F\x7F\x44\x24\x00\x48\x8B\xCF", "xxx??xxxx?xxx"); + if (!rcMonitorAssignment) + { + rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x00\x00\x0F\x7F\x44\x24\x00\x44", "xxx??xxxx?x"); + if (!rcMonitorAssignment) return FALSE; + } printf("[TC] rcMonitorAssignment = %llX\n", rcMonitorAssignment - (PBYTE)mi->lpBaseOfDll); // Step 2: @@ -10266,12 +10286,11 @@ void WINAPI HardwareConfirmatorShellcode(PBYTE pCoroInstance) hr = pTheFunc(pEdgeUiManager, &rc); } - typedef struct { float x, y, width, height; } Windows_Foundation_Rect; - Windows_Foundation_Rect* out = pCoroInstance + g_Moment2PatchOffsets.coroInstance_rcOut; - out->x = (float)rc.left; - out->y = (float)rc.top; - out->width = (float)(rc.right - rc.left); - out->height = (float)(rc.bottom - rc.top); + __x_ABI_CWindows_CFoundation_CRect* out = pCoroInstance + g_Moment2PatchOffsets.coroInstance_rcOut; + out->X = (float)rc.left; + out->Y = (float)rc.top; + out->Width = (float)(rc.right - rc.left); + out->Height = (float)(rc.bottom - rc.top); pEdgeUiManager->lpVtbl->Release(pEdgeUiManager); } @@ -10686,7 +10705,7 @@ DWORD Inject(BOOL bIsExplorer) Explorer_RefreshUI(99); #ifdef _WIN64 - // if (bIsExplorer) + if (bIsExplorerProcess) { funchook = funchook_create(); // printf("funchook create %d\n", funchook != 0); @@ -10871,10 +10890,13 @@ DWORD Inject(BOOL bIsExplorer) if (!bIsExplorer) { #ifdef _WIN64 - rv = funchook_install(funchook, 0); - if (rv != 0) + if (bIsExplorerProcess) { - printf("Failed to install hooks. rv = %d\n", rv); + rv = funchook_install(funchook, 0); + if (rv != 0) + { + printf("Failed to install hooks. rv = %d\n", rv); + } } #endif return 0; @@ -10946,20 +10968,25 @@ DWORD Inject(BOOL bIsExplorer) &symbols_PTRS, sizeof(symbols_addr) ); - if (LoadSymbols(&symbols_PTRS, hModule)) + LoadSymbolsResult loadSymbolsResult = LoadSymbols(&symbols_PTRS); + if (loadSymbolsResult.bSuccess) { - if (bEnableSymbolDownload) + if (NeedToDownloadSymbols(&loadSymbolsResult)) { - printf("Attempting to download symbol data; for now, the program may have limited functionality.\n"); - DownloadSymbolsParams* params = malloc(sizeof(DownloadSymbolsParams)); - params->hModule = hModule; - params->bVerbose = FALSE; - CreateThread(0, 0, DownloadSymbols, params, 0, 0); + if (bEnableSymbolDownload) + { + printf("Attempting to download symbol data; for now, the program may have limited functionality.\n"); + DownloadSymbolsParams* params = malloc(sizeof(DownloadSymbolsParams)); + params->hModule = hModule; + params->bVerbose = FALSE; + params->loadResult = loadSymbolsResult; + CreateThread(0, 0, DownloadSymbols, params, 0, 0); + } + } + else + { + printf("Loaded symbols\n"); } - } - else - { - printf("Loaded symbols\n"); } @@ -11048,22 +11075,19 @@ DWORD Inject(BOOL bIsExplorer) if (bOldTaskbar && global_rovi.dwBuildNumber >= 22572) { VnPatchIAT(hExplorer, "dwmapi.dll", "DwmUpdateThumbnailProperties", explorer_DwmUpdateThumbnailPropertiesHook); - if (global_rovi.dwBuildNumber < 25000) // TODO Needs fixing in Canary - { - PatchExplorer_UpdateWindowAccentProperties(); - } + PatchExplorer_UpdateWindowAccentProperties(); } if (IsWindows11()) { // Find a pointer to ITrayUIHost needed to have a working Windows 10 taskbar context menu on Windows 11 taskbar // Ref: CTray::Init() - // 4C 8D 05 ? ? ? ? 48 8D 0D ? ? ? ? E8 ? ? ? ? 48 8B 8D + // 4C 8D 05 ? ? ? ? 48 8D 0D ? ? ? ? E8 ? ? ? ? 48 8B // ^^^^^^^ PBYTE match = FindPattern( hExplorer, miExplorer.SizeOfImage, - "\x4C\x8D\x05\x00\x00\x00\x00\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x48\x8B\x8D", - "xxx????xxx????x????xxx" + "\x4C\x8D\x05\x00\x00\x00\x00\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x48\x8B", + "xxx????xxx????x????xx" ); if (match) { @@ -11269,12 +11293,12 @@ DWORD Inject(BOOL bIsExplorer) Moment2PatchHardwareConfirmator(&miHardwareConfirmator); // Fix pen menu - // 48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 50 49 8B F0 48 81 C1 + // 48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 50 49 8B ? 48 81 C1 twinui_pcshell_PenMenuSystemTrayManager__GetDynamicSystemTrayHeightForMonitorFunc = FindPattern( hTwinuiPcshell, miTwinuiPcshell.SizeOfImage, - "\x48\x89\x5C\x24\x00\x48\x89\x74\x24\x00\x57\x48\x83\xEC\x50\x49\x8B\xF0\x48\x81\xC1", - "xxxx?xxxx?xxxxxxxxxxx" + "\x48\x89\x5C\x24\x00\x48\x89\x74\x24\x00\x57\x48\x83\xEC\x50\x49\x8B\x00\x48\x81\xC1", + "xxxx?xxxx?xxxxxxx?xxx" ); rv = -1; if (twinui_pcshell_PenMenuSystemTrayManager__GetDynamicSystemTrayHeightForMonitorFunc) @@ -12042,14 +12066,14 @@ INT64 StartDocked_StartSizingFrame_StartSizingFrameHook(void* _this) if (hModule) { DWORD dwStatus = 0, dwSize = sizeof(DWORD); - FARPROC SHRegGetValueFromHKCUHKLMFunc = GetProcAddress(hModule, "SHRegGetValueFromHKCUHKLM"); + t_SHRegGetValueFromHKCUHKLM SHRegGetValueFromHKCUHKLMFunc = GetProcAddress(hModule, "SHRegGetValueFromHKCUHKLM"); if (!SHRegGetValueFromHKCUHKLMFunc || SHRegGetValueFromHKCUHKLMFunc( TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"), TEXT("TaskbarAl"), SRRF_RT_REG_DWORD, NULL, &dwStatus, - (LPDWORD)(&dwSize) + &dwSize ) != ERROR_SUCCESS) { dwStatus = 0; @@ -12747,7 +12771,7 @@ HRESULT WINAPI _DllCanUnloadNow() return S_FALSE; } -void InjectStartMenu() +DWORD InjectStartMenu() { #ifdef _WIN64 funchook = funchook_create(); @@ -12848,56 +12872,56 @@ void InjectStartMenu() ); int rv; - DWORD dwVal0 = 0x62254, dwVal1 = 0x188EBC, dwVal2 = 0x187120, dwVal3 = 0x3C10, dwVal4 = 0; + DWORD dwVal0 = 0, dwVal1 = 0, dwVal2 = 0, dwVal3 = 0, dwVal4 = 0; HMODULE hModule = LoadLibraryW(L"Shlwapi.dll"); if (hModule) { DWORD dwStatus = 0, dwSize = sizeof(DWORD); - FARPROC SHRegGetValueFromHKCUHKLMFunc = GetProcAddress(hModule, "SHRegGetValueFromHKCUHKLM"); + t_SHRegGetValueFromHKCUHKLM SHRegGetValueFromHKCUHKLM = GetProcAddress(hModule, "SHRegGetValueFromHKCUHKLM"); - if (SHRegGetValueFromHKCUHKLMFunc) + if (SHRegGetValueFromHKCUHKLM) { dwSize = sizeof(DWORD); - SHRegGetValueFromHKCUHKLMFunc( + SHRegGetValueFromHKCUHKLM( TEXT(REGPATH_STARTMENU) TEXT("\\") TEXT(STARTDOCKED_SB_NAME), TEXT(STARTDOCKED_SB_0), SRRF_RT_REG_DWORD, NULL, &dwVal0, - (LPDWORD)(&dwSize) + &dwSize ); - SHRegGetValueFromHKCUHKLMFunc( + SHRegGetValueFromHKCUHKLM( TEXT(REGPATH_STARTMENU) TEXT("\\") TEXT(STARTDOCKED_SB_NAME), TEXT(STARTDOCKED_SB_1), SRRF_RT_REG_DWORD, NULL, &dwVal1, - (LPDWORD)(&dwSize) + &dwSize ); - SHRegGetValueFromHKCUHKLMFunc( + SHRegGetValueFromHKCUHKLM( TEXT(REGPATH_STARTMENU) TEXT("\\") TEXT(STARTDOCKED_SB_NAME), TEXT(STARTDOCKED_SB_2), SRRF_RT_REG_DWORD, NULL, &dwVal2, - (LPDWORD)(&dwSize) + &dwSize ); - SHRegGetValueFromHKCUHKLMFunc( + SHRegGetValueFromHKCUHKLM( TEXT(REGPATH_STARTMENU) TEXT("\\") TEXT(STARTDOCKED_SB_NAME), TEXT(STARTDOCKED_SB_3), SRRF_RT_REG_DWORD, NULL, &dwVal3, - (LPDWORD)(&dwSize) + &dwSize ); - SHRegGetValueFromHKCUHKLMFunc( + SHRegGetValueFromHKCUHKLM( TEXT(REGPATH_STARTMENU) TEXT("\\") TEXT(STARTUI_SB_NAME), TEXT(STARTUI_SB_0), SRRF_RT_REG_DWORD, NULL, &dwVal4, - (LPDWORD)(&dwSize) + &dwSize ); } FreeLibrary(hModule); @@ -12961,6 +12985,7 @@ void InjectStartMenu() return rv; } #endif + return 0; } void InjectShellExperienceHost() @@ -12981,8 +13006,8 @@ void InjectShellExperienceHost() PIMAGE_NT_HEADERS64 ntHeader = (PIMAGE_NT_HEADERS64)((u_char*)dosHeader + dosHeader->e_lfanew); if (ntHeader->Signature == IMAGE_NT_SIGNATURE) { - char* pSEHPatchArea = NULL; - char seh_pattern1[14] = + PBYTE pSEHPatchArea = NULL; + BYTE seh_pattern1[14] = { // mov al, 1 0xB0, 0x01, @@ -13001,8 +13026,8 @@ void InjectShellExperienceHost() // ret 0xC3 }; - char seh_off = 12; - char seh_pattern2[5] = + BYTE seh_off = 12; + BYTE seh_pattern2[5] = { // mov r8b, 3 0x41, 0xB0, 0x03, @@ -13017,14 +13042,15 @@ void InjectShellExperienceHost() { if (section->SizeOfRawData && !bTwice) { - DWORD dwOldProtect; - //VirtualProtect(hQA + section->VirtualAddress, section->SizeOfRawData, PAGE_EXECUTE_READWRITE, &dwOldProtect); - char* pCandidate = NULL; + PBYTE pSectionBegin = (PBYTE)hQA + section->VirtualAddress; + //DWORD dwOldProtect; + //VirtualProtect(pSectionBegin, section->SizeOfRawData, PAGE_EXECUTE_READWRITE, &dwOldProtect); + PBYTE pCandidate = NULL; while (TRUE) { pCandidate = memmem( - !pCandidate ? hQA + section->VirtualAddress : pCandidate, - !pCandidate ? section->SizeOfRawData : (uintptr_t)section->SizeOfRawData - (uintptr_t)(pCandidate - (hQA + section->VirtualAddress)), + !pCandidate ? pSectionBegin : pCandidate, + !pCandidate ? section->SizeOfRawData : (uintptr_t)section->SizeOfRawData - (uintptr_t)(pCandidate - pSectionBegin), seh_pattern1, sizeof(seh_pattern1) ); @@ -13032,7 +13058,7 @@ void InjectShellExperienceHost() { break; } - char* pCandidate2 = pCandidate - seh_off - sizeof(seh_pattern2); + PBYTE pCandidate2 = pCandidate - seh_off - sizeof(seh_pattern2); if (pCandidate2 > section->VirtualAddress) { if (memmem(pCandidate2, sizeof(seh_pattern2), seh_pattern2, sizeof(seh_pattern2))) @@ -13049,7 +13075,7 @@ void InjectShellExperienceHost() } pCandidate += sizeof(seh_pattern1); } - //VirtualProtect(hQA + section->VirtualAddress, section->SizeOfRawData, dwOldProtect, &dwOldProtect); + //VirtualProtect(pSectionBegin, section->SizeOfRawData, dwOldProtect, &dwOldProtect); } } section++; diff --git a/ExplorerPatcher/symbols.c b/ExplorerPatcher/symbols.c index e32ab43..a92c16b 100644 --- a/ExplorerPatcher/symbols.c +++ b/ExplorerPatcher/symbols.c @@ -61,15 +61,290 @@ L" \r\n" L"