-
-
[旧帖]
[原创][邀请码已发]获取调用者代码所在的模块名字
0.00雪花
-
发表于:
2010-5-13 18:47
2841
-
[旧帖] [原创][邀请码已发]获取调用者代码所在的模块名字
0.00雪花
我们经常通过日志的方式来收集客户现场的软件执行情况。一般都封装一个trace.dll专门用来写日志。为了通用性,一般会在日志的开头加上模块名称等信息。问题是你如何在trace.dll中
获得当前调用者所在的模块名称呢?尤其是很多时候你的代码是一个dll,多个dll会调用你的trace.dll来写日志,你如何区分是哪个dll在调用你?又或者是哪个exe在调用你?
首先,根据X86体系以及VC stdcall的调用约定,我们知道[ebp+4]保存的就是当前函数需要返回的地址,也就是你的调用者所在的地址空间。
然后,根据这个地址调用VirtualQuery 这个API函数来获取分配的内存的基地址。
最后,根据toolhelp系列函数来对比这个基地址属于哪个模块。
好了,道理很简单。具体代码大家看附件吧。
代码使用vc++ 2003编译
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!