阅读:1189回复:5
关于包过滤的新问题。34分!
呵呵。。。。。大家好,
我想写一个包过滤程序,又遇到了新的问题, 抓包工作能够顺利的进行,可是每次在抓包 进行时忽然用drivermonitor将过滤驱动 停止,系统就报错。 我估计这是由于有的irp没处理完,强行卸载 驱动的结果,我怎样才能保证所有的IRP都处理 完毕后安全的卸载? 谢谢! |
|
最新喜欢:![]() |
沙发#
发布于:2002-05-25 09:49
设置一个变量,并加自旋锁保护,在每个入口函数(即分发例程)和自创建的线程以及完成例程的函数入口处对该变量加一,退出该函数时对该变量减一,在卸载例程中只要判断该变量为零,就可以卸载了
|
|
板凳#
发布于:2002-05-25 10:25
PACKET例子里面有两个函数!一个叫IoIncrement和IoDecrement两个函数就是用来维护IRP队列的!当近来一个IRP的时候就调用IoIncrement 增量计数器!并设置EVENT[这个很重要!]!!,当处理完这个IRP的时候就调用IoIncrement 减量并RESET这个EVENT!在UNLOAD函数里面等待这个EVENT超时为0!!就是永远等待!也就是IRP没处理完就不卸载!明白了??
|
|
|
地板#
发布于:2002-05-25 10:28
设置一个变量,并加自旋锁保护,在每个入口函数(即分发例程)和自创建的线程以及完成例程的函数入口处对该变量加一,退出该函数时对该变量减一,在卸载例程中只要判断该变量为零,就可以卸载了你怎么在RECIVE和RECIVEPACKET两个列程里面维护同一个自旋锁呢????还是单独放出来到一个函数里面才是明智的办法!看看PACKET的例子就明白了!你的方法是非常容易造成死锁的!DDK里面有说!!也就是专锁专用!! |
|
|
地下室#
发布于:2002-05-27 16:18
谢谢,我已经调通了,你们说的都有道理,
所以都给了分。 |
|
5楼#
发布于:2002-05-28 10:31
如果是自己处理IRP的话,我这个方法当然有效了,只要在Unload函数中把该IRP Pending,而在那个受保护的变量等于0时结束该IRP就可以了。这样可以同时处理多个IRP,而采用EVENT则只能串行处理每个IRP。
|
|