首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Windows中以编程方式读取调用栈帧中的函数参数?

如何在Windows中以编程方式读取调用栈帧中的函数参数?
EN

Stack Overflow用户
提问于 2014-04-18 06:16:16
回答 1查看 1.3K关注 0票数 10

我试图遍历调用栈帧并从中提取一些信息。我能够使用StackWalk64SymGetSymFromAddr64SymGetLineFromAddr64 API从WinDBG提取文件名、行号和函数名。

但是,STACKFRAME64中的DWORD64 Params[4] (来自StackWalk64的返回值)仅支持从帧中读回四个64位函数参数。更糟糕的是,在32位系统上,只使用Params[4]的低32位,因此超过32位的单个参数需要两个或更多元素。

代码语言:javascript
复制
typedef struct _tagSTACKFRAME64 {
  ADDRESS64 AddrPC;
  ADDRESS64 AddrReturn;
  ADDRESS64 AddrFrame;
  ADDRESS64 AddrStack;
  ADDRESS64 AddrBStore;
  PVOID     FuncTableEntry;
  DWORD64   Params[4];
  BOOL      Far;
  BOOL      Virtual;
  DWORD64   Reserved[3];
  KDHELP64  KdHelp;
} STACKFRAME64, *LPSTACKFRAME64;

我找不到任何API来无限制地读取堆栈帧中的所有参数。

我在考虑使用ebp/rbp从堆栈(x86/x64)和寄存器(x64)中提取值。但是,如果我这样做,仍然只能获得参数的“可能”值。

有没有什么API可以让我获得准确的值?如果我能得到参数的类型和名称,那就更好了。

EN

回答 1

Stack Overflow用户

发布于 2014-05-02 20:43:15

没有用于它的API。为什么要有现代的OSes对一些人玩这些东西不感兴趣。如前所述,编译器可以自由地进行优化,因此您不能使用任何确定性工具来进行优化。但是,有启发式方法!如果你在调用之前解析汇编或者在调用之后解析ret,你可以知道函数中有多少参数,你总是有返回地址,你可以检查它是否在CS中。

最重要的是-你应该阅读术语“堆栈展开”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23144389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档