阅读:1908回复:5
版主大人 帮帮忙吧 很简单的一个问题 作tdi大家都会遇到的
本来使用的tdifilterdriver例子,net stop会死机。softice会跳出page fault
而用pcausa的tdi例子passthru打开一个连接就会蓝屏。 后来我实在不行了,就在这个passthru的基础上进行修改。 只提取一些很简单的代码,进行测试。功能就只是进行Kdprint而已。 什么完成函数之类的都没有用了。 这时候不死机了,可是就变成tdifilterdriver的样子,一net stop就出错。 这到底怎么回事啊,我改了好几次,不同样子的。都是这样。 我想每个做过tdi的人应该都会遇到这个情况的啊。 怎么就没有前人说说看呢。 实在不行了 摆脱各位了 |
|
|
沙发#
发布于:2007-01-16 17:35
各位大哥大姐们行行好吧 能帮的帮一下
要不再问一个思想性的问题 就是tdi filter 和tdi client的区别 是不是我们打开一个网页或者在玩网游都会经过tdi client啊 我知道会经过tdi filter的。如果我挂接上tcp和udp的话。 还有在client下是否能够更改ip port,数据然后转发。 就回答yes or no就可以了。 我感决是可以拉,就是没有imd这么方便 但是如何更改数据和数据长度我就不清楚了 |
|
|
总版主
|
板凳#
发布于:2007-01-17 09:02
深表同情。其实unload驱动之后发生蓝屏对TDI过滤来说这是很正常的事情,你完全没有必要因为这个就停止使用一个例子。unload的时候发生蓝屏有这么几个可能的原因:
1。生成系统线程后,unload驱动之前没有终止。如果系统线程访问已经卸载的驱动内的地址时,发生非法页面访问错误。这样这个系统线程有可能导致蓝屏。强制终止线程也是不安全的,正确的方法是unload中设置标记,线程根据标记自己终止。而unload等待所有自己生成的系统线程终止后再继续。但是这很麻烦而且没有必要,因为TDI驱动在实用的时候一般都不允许动态卸载。 2。设备UnAttach之后,立刻Unload驱动,这样一来,一些已经发到这个设备的IRP还没有处理完(网络方面的IRP有时耗时很长)。等下层设备完成返回时,上层的设备(也就是过滤器)已经卸载。这样就蓝屏幕了。如果要完美解决,必须自己等待所有IRP处理完毕后再继续。这也是一样的麻烦而且没有必要。简单的处理可以UnAttach一段时间后再 Unload,更简单的就是注意在没有网络活动的时候停止设备。 3。其他编程者自己犯的各类错误。 总之一看见蓝屏就抓狂而进行不下去是不对的。没有什么蓝屏能阻止你做好你的软件,除非你自己放弃。 |
地板#
发布于:2007-01-17 10:43
太感谢了;
我的问题好像就是第二个,irp没有处理完。 因为我在蓝屏的时候有看到提示这个。 |
|
|
地下室#
发布于:2007-01-17 10:45
对了 你指的unattach就是我们所说的detach吧
我是在unload的时候调用这个函数的。 看来不能在这里detach了 |
|
|
5楼#
发布于:2007-01-17 16:41
试过了N次
问题都是DRIVER_IRQL_NOT_LESS_OR_EQRL 看来都是程序卸载之后,系统访问到一个原来的内存地址,可能是函数或者是一些资源。 但是不可能是完成函数。 因为刚开始没有任何完成函数的时候 也是这种情况。 SIGH |
|
|