有没有办法让Windows 64位上的应用程序在64位和32位仿真层下执行代码?

时间:2010-11-26 17:20:07

标签: windows 32bit-64bit setwindowshookex

我感兴趣的是我是否可以编写一个能够在没有仿真层和32位仿真层内部的代码的情况下调用某些代码的应用程序。

主要原因是我需要使用API​​ SetWindowHook,我想为64位和32位应用程序设置挂钩。

当然,我可以创建2个应用程序(一个用于32位,另一个用于64位)并同时启动它们。但是,我需要更多代码来管理它们(启动,停止,升级等)。

所以,我正在考虑是否有可能有一个申请。

我唯一的想法是拥有一个应用程序和2个COM DLL(32位和64位)并使用代理进程来运行32位代码。但是,它需要一些额外的COM包装器等等。

4 个答案:

答案 0 :(得分:5)

我不能建议一个更好的方法,但我能做的就是给你一个简单的基于钩子的工具的源,它完成同样的事情。随意使用对您有用的位:

http://www.pretentiousname.com/NoBarTab/NoBarTab_poc3.zip

(如果此URL在将来中断,只需上升一级;这可能是因为我已经完成了它并为该工具及其来源提供了真实的页面。)

这是一个VS2010 C ++项目,但应该很容易在旧的IDE中编译。 (写这个实际上让我暂时不再使用VS2010了,呵呵。)

显然,如果您使用它,请重命名任何窗口类和二进制名称以避免与我的工具冲突。 (名称中包含“NoBarTab”的任何内容。)

FWIW,这是我几周前开始写的一个工具,但还没有完成。然而,挂钩部分已经完成。它挂钩窗口创建,以便它可以针对特定进程从Windows 7任务栏中删除选项卡。 (我讨厌VMware特别使用该功能的方式。)当我完成它时,无论如何我都会发布源代码......

32/64位挂钩部分全部完成。我唯一没有做的就是添加一个配置UI,这样你就可以指定它应该关注哪些进程,但这对你正在做的事情并不重要。

(我应该说,我从Win7任务栏中删除标签的方式是一个完整的黑客攻击,可能会破坏Windows的未来版本。没有记录的方法可以做到这一点,所以我不得不解决一个讨厌的问题。实际挂钩但是,你感兴趣的代码都是“正确的”。)

另外,我做到了这一点,几乎所有真正的逻辑都在主64位exe中。 32位EXE只是用于安装32位挂钩DLL,而32位和64位挂钩DLL只是将消息发布到主64位exe的隐藏窗口。这是否适合您正在做的事情,我请您决定,但我认为这可能符合您希望尽可能将所有内容放在一个地方的愿望。

希望它有用!

答案 1 :(得分:3)

SetWinEventHook是一个更高级别的挂钩API,可以为您处理32位/ 64位内容。这出现在另一个question today的答案中,我认为如果解决了你的问题,这里值得一提。完全赞同@atzz在那里的答案。

SetWinEventHook是否与低级SetWindowsHookEx一样合适,取决于你正在做什么。 (就我而言,我可能会在我的其他答案中重新编写NoBarTab代码以使用更简单的API。但是还没有仔细查看过。)

答案 2 :(得分:1)

仿真层的最大原因是您的64位代码将具有更大的地址空间。例如,假设您的数据地址为0x12345678aa000000。如果将该指针直接传递给32位代码,它将被截断为32位地址空间。也就是说,高阶32位被删除。因此,对于32位代码,数据的地址看起来像0x00000000aa000000。这显然是一个完全不同的领域,而不是你想要的。

是的,这是可能的。不,你不应该这样做,除非你非常熟悉x86和x64程序集,并且可以访问32位源代码,以确保它知道它实际上在64位空间运行并且还可以访问64-位代码,以确保它传递给32位代码的所有数据仅在32位地址范围内。

不,除非您尝试进行UBER UGLY黑客攻击,否则执行不带仿真层的32位代码是不可取的。

答案 3 :(得分:0)

我认为你唯一的希望就是通过进程外COM来完成它,因为每个进程必须全部是32位或全部是64位。