1

这是与 Win32 相关的问题,所有代码都是本机的。

我有 3 层编译为 dll 库,相互依赖:

[模块 1] -> [模块 2] -> [模块 3] -> [我的模块 4]

模块 1 是一个应用程序加载模块 2。模块 2 加载模块 3。模块 3 加载我的模块 4。

每当从模块 1 进行调用时,它都会经过所有层,直到模块 4。

在模块 4 中,我想通过获取每个模块的 HMOUDLE 句柄或任何其他唯一标识它们的东西,以某种方式从模块 1 的模块 2 中的模块 3 调用它。我想不出任何 Win32 API 允许我执行这样的跟踪,你能建议吗?

4

2 回答 2

3

您应该能够在来自感兴趣的STACKFRAME64结构的相关地址上使用StackWalk64SymFromAddr 。不完全是你想要的,但想不出任何其他接近的方式。

于 2012-05-04T20:02:56.467 回答
2

简短的回答 - 有点,但你可能不想这样做:)

冗长的答案 -调试帮助库可用于生成堆栈跟踪(通过 StackWalk64),您可以将其与通过PSAPI检索的模块信息结合使用以获得所需的内容。

基本方法是获取进程中每个模块的基地址和大小,然后查看每个堆栈帧的返回地址,按范围匹配。如果您要做的只是确定对模块 4 中的函数的调用是否源自模块 1 中的函数,那么这将使您到达您想要的位置。

编辑:如果您可以访问相关模块的符号,那么史蒂夫 T 的答案会更可靠一些。

于 2012-05-04T20:03:17.097 回答