3

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

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

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

所以,我正在研究是否有可能拥有一个应用程序。

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

4

4 回答 4

5

我不能提出更好的方法,但我能做的是给你一个简单的基于钩子的工具的源代码,它做同样的事情。随意对您有用的位:

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

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

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

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

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

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

(我应该说,我从 Win7 任务栏中删除选项卡的方式完全是 hack,可能会与未来版本的 Windows 中断。没有记录的方法可以做到这一点,所以我不得不解决一个讨厌的问题。你的实际挂钩代码不过,我会感兴趣的是所有“适当的”。)

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

希望它有用!

于 2010-11-26T17:54:07.050 回答
3

SetWinEventHook是一个高级挂钩 API,它为您处理 32 位/64 位内容。这出现在今天另一个问题的答案中,我认为在这里值得一提,以防解决您的问题。完全归功于@atzz 在那里的回答。

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

于 2010-11-27T18:32:25.890 回答
1

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

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

不,除非您尝试制作 UBER UGLY hack,否则不希望在没有仿真层的情况下执行 32 位代码。

于 2010-11-26T17:25:41.977 回答
0

我认为您唯一的希望是通过进程外 COM 之类的方法来实现,因为每个进程都必须是全部 32 位或全部 64 位。

于 2010-11-26T17:27:28.470 回答