hook DirectShow时出现函数递归调用

dofordream 2009-01-09 04:03:46
问题:
挂钩DirectCreateEx,获得IDirectDraw7对象的虚表,然后先保存虚表中的CreateSurface函数指针值,再使虚表中的CreateSurface函数指针指向自定义的CreateSurface函数,在自定义函数中调用原始的CreateSurface函数。
自己写了个测试程序,先调用DirectCreateEx,然后用获得的IDirectDraw7对象执行CreateSurface,输出数据显示进入到自定义的CreateSurface函数,且一切执行正常。
但执行DXSDK的中的DirectShow的一个播放示例程序时,创建的IGraphBuilder对象在执行RenderFile函数时,输出数据显示已经进入到自定义的CreateSurface函数,但在自定义的CreateSurface函数调用原始的CreateSurface函数时,又重新执行自定义函数,而自定义函数还未退出,结果就是不停的在自定义的CreateSurface函数开头到调用原始的CreateSurface函数之间不停的循环执行,看起来像原始的CreateSurface函数又调用了自定义的CreateSurface函数,执行了递归。
不知可有人能指点一二。
...全文
106 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dofordream 2009-01-12
  • 打赏
  • 举报
回复
是的,正如一楼所说的,函数地址被替换了两次,现在问题已经解决。
xiaopoy 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
估计是CreateSurface函数地址被替换了两次。在替换函数地址前加个判断,如果虚表中的地址与自己的函数地址相同,说明已经替换过了,就不要再替换了。
[/Quote]
不失为一种解决方法。
不过LZ只是替换了虚函数地址不考虑各种突发状况

在hook例程中call原函数前复位各种状况和地址,原函数返回后再重新hook。这样就简单的解决了问题
当然最好跟踪下原函数以了解在何处递归了
cnzdgs 2009-01-09
  • 打赏
  • 举报
回复
估计是CreateSurface函数地址被替换了两次。在替换函数地址前加个判断,如果虚表中的地址与自己的函数地址相同,说明已经替换过了,就不要再替换了。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧