在 Winx64 上使用 User32InitializeImmEntryTable?

Posted

技术标签:

【中文标题】在 Winx64 上使用 User32InitializeImmEntryTable?【英文标题】:Using User32InitializeImmEntryTable on Winx64? 【发布时间】:2015-05-01 15:26:33 【问题描述】:

https://github.com/jay/gethooks 使用 User32InitializeImmEntryTable 来获取 SharedInfo,而 SharedInfo 又用于获取全局事件挂钩列表。

该程序在 Win32 上运行,但在 Win7x64 上运行,如何解决?

根据您是为 Win32 还是 x64 构建,存在不同的问题。

在 x64 构建中,失败的代码来自 prog.c:

p = (char *)User32InitializeImmEntryTable;
for( i = 0; i < 127; ++i )

    if( ( *p++ == 0x50 ) && ( *p == 0x68 ) )
    
        *( (char *)&SharedInfo + 0 ) = *++p;
        *( (char *)&SharedInfo + 1 ) = *++p;
        *( (char *)&SharedInfo + 2 ) = *++p;
        *( (char *)&SharedInfo + 3 ) = *++p;
        break;
    

0x50, 0x68 (push eax) 没有找到。

在 Win32 上构建上述工作,但 EnumDesktopsW 没有,在 desktop.c 的函数 add_all_desktops 中。

我也不确定修复该部分是否会让程序在 x64 上正常运行,但我想这是一个开始。我也不确定构建 Win32 或 x64 可执行文件哪个更好,哪个更容易让它工作?

我希望这是一个好的问题,AFAIK 获得创建全局挂钩的应用程序列表是一件好事,例如查找键盘记录器、故障排除或 w/e。因此,修复该 gethooks 程序将使社区受益,无论它最终以何种方式修复。任何反对票,我保证会立即删除。

【问题讨论】:

这属于严重不支持的类别。如果我猜是因为 win64 上的调用约定是普遍的* __fastcall 而不是 __stdcall *mangling 是所有变化,vectorcall 是唯一的例外 【参考方案1】:

在 Windows 7 中非常简单:

SHAREDINFO *SharedInfo = (SHAREDINFO *)GetProcAddress(LoadLibraryA("user32"), "gSharedInfo");

但是 Windows 8/10 是一个不同的故事,我将提出一个新问题。

【讨论】:

以上是关于在 Winx64 上使用 User32InitializeImmEntryTable?的主要内容,如果未能解决你的问题,请参考以下文章

mysql-5.7.10-winx64 安装时遇到的问题

mysql-8.0.16-winx64/Linux修改root用户密码

mysql-5.7.17-winx64.zip怎么安装

64位win10安装mysql-5.6.37-winx64

C# PInvoking user32.dll 在 64 位系统上

用于 Win x64 的 mod_xsendfile?