mirror of
https://github.com/valinet/ExplorerPatcher.git
synced 2025-01-27 08:33:41 +01:00
Taskbar10: Revised the pattern for patching the new IME context menu so that it works on 25951
This commit is contained in:
parent
ce9f973167
commit
4bea5f688d
@ -583,64 +583,41 @@ inline BOOL IncrementDLLReferenceCount(HINSTANCE hinst)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
PVOID FindPattern(PVOID pBase, SIZE_T dwSize, LPCSTR lpPattern, LPCSTR lpMask);
|
||||||
|
|
||||||
inline BOOL WINAPI PatchContextMenuOfNewMicrosoftIME(BOOL* bFound)
|
inline BOOL WINAPI PatchContextMenuOfNewMicrosoftIME(BOOL* bFound)
|
||||||
{
|
{
|
||||||
// huge thanks to @Simplestas: https://github.com/valinet/ExplorerPatcher/issues/598
|
// huge thanks to @Simplestas: https://github.com/valinet/ExplorerPatcher/issues/598
|
||||||
if (bFound) *bFound = FALSE;
|
|
||||||
DWORD patch_from, patch_to;
|
|
||||||
if (IsWindows11Version22H2OrHigher())
|
|
||||||
{
|
|
||||||
// cmp byte ptr [rbp+40h+arg_0], r13b
|
|
||||||
patch_from = 0x506D3844;
|
|
||||||
patch_to = 0x546D3844;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// cmp byte ptr [rbp+50h], r12b
|
|
||||||
patch_from = 0x50653844;
|
|
||||||
patch_to = 0x54653844;
|
|
||||||
}
|
|
||||||
HMODULE hInputSwitch = NULL;
|
HMODULE hInputSwitch = NULL;
|
||||||
if (!GetModuleHandleExW(0, L"InputSwitch.dll", &hInputSwitch))
|
if (!GetModuleHandleExW(0, L"InputSwitch.dll", &hInputSwitch))
|
||||||
{
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
|
||||||
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hInputSwitch;
|
MODULEINFO mi;
|
||||||
PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD_PTR)dosHeader + dosHeader->e_lfanew);
|
GetModuleInformation(GetCurrentProcess(), hInputSwitch, &mi, sizeof(mi));
|
||||||
PIMAGE_SECTION_HEADER pSectionHeader = (PIMAGE_SECTION_HEADER)(pNTHeader + 1);
|
|
||||||
char* mod = 0;
|
// 44 38 ?? ?? 74 ?? 48 8B CE E8 ?? ?? ?? ?? 85 C0
|
||||||
int i;
|
// ^^ Change jz into jmp
|
||||||
for (i = 0; i < pNTHeader->FileHeader.NumberOfSections; i++)
|
PBYTE match = (PBYTE)FindPattern(
|
||||||
{
|
hInputSwitch,
|
||||||
//if (strcmp((char*)pSectionHeader[i].Name, ".text") == 0)
|
mi.SizeOfImage,
|
||||||
if ((pSectionHeader[i].Characteristics & IMAGE_SCN_CNT_CODE) && pSectionHeader[i].SizeOfRawData)
|
"\x44\x38\x00\x00\x74\x00\x48\x8B\xCE\xE8\x00\x00\x00\x00\x85\xC0",
|
||||||
{
|
"xx??x?xxxx????xx"
|
||||||
mod = (char*)dosHeader + pSectionHeader[i].VirtualAddress;
|
);
|
||||||
break;
|
if (!match)
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!mod)
|
|
||||||
{
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
|
||||||
for (size_t off = 0; off < pSectionHeader[i].Misc.VirtualSize - sizeof(DWORD); ++off)
|
DWORD dwOldProtect;
|
||||||
{
|
if (!VirtualProtect(match + 4, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect))
|
||||||
DWORD* ptr = (DWORD*)(mod + off);
|
return FALSE;
|
||||||
if (*ptr == patch_from)
|
|
||||||
{
|
match[6] = 0xEB;
|
||||||
if (bFound) *bFound = TRUE;
|
|
||||||
DWORD prot;
|
VirtualProtect(match + 4, 1, dwOldProtect, &dwOldProtect);
|
||||||
if (VirtualProtect(ptr, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &prot))
|
|
||||||
{
|
return TRUE;
|
||||||
*ptr = patch_to;
|
|
||||||
VirtualProtect(ptr, sizeof(DWORD), prot, &prot);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
extern UINT PleaseWaitTimeout;
|
extern UINT PleaseWaitTimeout;
|
||||||
extern HHOOK PleaseWaitHook;
|
extern HHOOK PleaseWaitHook;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user