youngwinter
驱动牛犊
驱动牛犊
  • 注册日期2004-08-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分363分
  • 威望39点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
阅读:2088回复:5

TDI Filter Driver求教

楼主#
更多 发布于:2007-04-29 17:35
  新手上路,刚刚看了楚狂人的TDI过滤驱动开发指南。前面看到有人说动态卸载是TDI的“阿喀琉斯之踵”,结果自己刚刚写好过滤驱动的架子,啥事都没做呢,StopService一下就出BSOD了。看起来是因为有pending的IRP未处理完。请教这种情况如何解决比较好?还是干脆就不停?那采用这种技术的防火墙软件又是怎么卸载的呢?
    另外在网上搜了一下关于TDI Filter Driver的内容,发现还有一个大问题是Running out of I/O Stack Locations。解决方法是创建新的IRP向下传递,然后在新的IRP完成函数里把关联的IRP结束掉。那么这个思路是不是也可以用来解决动态卸载的问题?不过我不知道对未执行完的Irp调用IoCancelIrp会不会有问题
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2007-04-29 18:03
反正 我已经死心了 关于net stop tdi的
其实有一个比较直接的方法 我没作出来就是了

就是先断网 或者停止网络
然后在net stop 像passthru在安装和卸载的时候就是先断掉网络的
但是我不知道怎么作。
周维彬
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
板凳#
发布于:2007-04-30 16:23
net stop tdi时处理已经申请的irq请求,并cancel掉。这应该没有问题,已经实现过。卸载会bsod这个问题可以解决,至少我是解决了,所以可以去考虑一下如何实现。这里重点处理好irp的cancel,pending,complete等关系与资源释放。
走走看看开源好 Solaris vs Linux
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
地板#
发布于:2007-04-30 17:38
天才+牛人
连tdi_fw都没有解决的问题都让你老人家解决了。

佩服之情,油然而生。
膜拜之
周维彬
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2007-05-01 14:56
在TDI那里搞卸载,真是。。没那个精神。。
人不靓仔心灵美,版头不正红花仔!
youngwinter
驱动牛犊
驱动牛犊
  • 注册日期2004-08-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分363分
  • 威望39点
  • 贡献值0点
  • 好评度38点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-08 16:10
自己挖坑自己填,经过五一前后几天的折腾,终于搞定了这个问题。
      具体方法就是前面的思路,所有的经过filter的IRP全部不下发,另外创建新IRP,用原有IRP进行初始化,用一个GenericTable保存两者的对应关系,下发新IRP,在完成函数里释放掉新的IRP,返回STATUS_MORE_PROCESSING_REQUIRED。同时处理函数使用KeWaitForMultipleObjects等待,一个是传递给完成函数的Event,另一个是标志该新IRP是否需要Cancel的Event。如果驱动Unload时还有未处理完的IRP,在DriverUnload里面Set这个IRP对应的Event。这样处理函数也会被唤醒,此时调用IoCancelIrp(),搞定所有pending的IRP。再也不会蓝屏了,娃哈哈哈……
    不过现在只搞定了PassThrough的说,防火墙的影子还一点都没看见。
游客

返回顶部