创建ffdshow Audio Decoder失败的原因

无法成功创建的ffdshow.ax,文件版本1.0.3.1371,大小是2,273,280字节,无壳。 
如果使用Graphedt可以成功创建ffdshow Audio Decoder,对Pin进行Render也会自动添加此Filter。但是如果是在自己程序里面,无论是什么方法都不能创建出ffdshow Audio Decoder。 
搜遍网络,只在某英文网站发现一帖说ffdshow Audio Decoder没有IID_IBaseFilter的接口。于是用OD跟踪了一下Graphedt,发现它调用CoCreateInstance的时候,参数确实不是IID_IBaseFilter,而是IID_IUnknown。在自己的程序里面试了一下IID_IUnknown,确实把ffdshow Audio Decoder创建了出来,只是QueryInterface得不到IBaseFilter接口,无法把它加到graph里面。 
那么Graphedt是怎么做到的呢?再次打开OD,跟踪后发现,它在CoCreateInstance得到IID_IUnknown接口后,进行了一次IID_IPersistPropertyBag接口查询,不过返回失败,接着马上是IID_IBaseFilter接口查询,这次居然成功了???但是我在自己的程序里面做相同的操作,结果仍然是失败。 
没办法,对比跟踪Graphedt的QueryInterface和自己程序的QueryInterface,终于发现了问题所在,原来查询的时候ffdshow会用CreateToolhelp32Snapshot等一系列操作来反查调用者是谁,只有它认为合法的调用者才会返回一个接口给它,其他的就直接返回失败。试着我自己的程序名改为Graphedt.exe,果然成功取得了IBaseFilter接口。进一步对比跟踪,找到了分歧点: 
OD:     3111A73B   74 89         je      short 3111A6C6 
把这句修改为两个nop后保存,使用这个修改过的ffdshow.ax,不管是什么exe,都可以成功创建出ffdshow Audio Decoder了。 
如果你没用过OD,也可以使用任何一款十六进制编辑器比如UE,将1A73B处的74 89修改为90 90保存,也可以得到修改好的ax文件。 
顺便说一下,我用的ffdshow是一个叫阿飞什么的AvPack解码器包里面带的。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值