阅读:1610回复:8
NDIS程序是不是不能建造、发送IRP
我建造了一个内核API程序,向外提供函数服务,向下发送IRP包到一个PCI设备的驱动程序。
现在的问题是如果普通的软WDM驱动程序调用没有任何问题,但我用PassThru这个NDIS程序调用就会出问题,NDIS程序是不是不能建造、发送IRP? |
|
最新喜欢:![]() |
沙发#
发布于:2002-04-11 11:30
是不是你没有在你的passthru作相应的处理irp的函数阿
|
|
|
板凳#
发布于:2002-04-14 00:52
我建造了一个内核API程序,向外提供函数服务,向下发送IRP包到一个PCI设备的驱动程序。 不存在什么东西能不能建造Irp的问题,关键在于你调用 IoCallDriver后要去Wait,而Wait的动作只能在passive level做, 如果你在Dispatch Level Wait的话,会造成缺页。 遗憾的是passthru发包的时候常常会在passive level,而收包 的时候几乎总是在Dispatch Level! 要解决你的问题,只有设法不Wait,如果必须Wait的话,我感觉只能 是创建一个线程去做,可以保证是在passive level. [编辑 - 4/14/02 作者: TonyHuyan] |
|
|
地板#
发布于:2002-04-16 10:58
我的现象非常奇怪:在Send 第一个Packet时,没什么问题;但在Send第二个Packet时,就会出各种各样的问题了
TO: TonyHuyan, 我马上试着去改一下IRQL,不知能否成功? |
|
地下室#
发布于:2002-04-16 15:14
明白了,NDIS不是不能创建IRP,而是不能用IoBuildSynchronousFsdRequest()和IoBuildAsynchronousFsdRequest()创建!
呜呜呜! |
|
5楼#
发布于:2002-04-16 20:37
我的现象非常奇怪:在Send 第一个Packet时,没什么问题;但在Send第二个Packet时,就会出各种各样的问题了 老大,Irql是不能随便改的!!为了不被中断,你可以提升Irql, 用完后再降低到原来的Irql,事实上各种互斥之类的东西都是这么 做的。 你要降低Irql还不出问题的话,你去买足彩早中500万了!呵呵。 我不是说过了吗,Send不总是在Dispatch Level,有时候会是在 Passive Level, 所以你说第一个包没问题很正常。
问题不在于如何创建Irp,因为创建Irp和分配一块内存没有什么 实质性的区别,关键在于如何使用这个Irp! [编辑 - 4/16/02 作者: TonyHuyan] |
|
|
6楼#
发布于:2002-04-17 11:46
DDK文档中说IoBuildSynchronousFsdRequest()也是必须在PASSIVE_LEVEL, 看来与是不是NDIS程序无关。
在Dispatch level上是否可以创建线程?创建的线程是否可以保证是Passive level? |
|
7楼#
发布于:2002-04-17 23:28
DDK文档中说IoBuildSynchronousFsdRequest()也是必须在PASSIVE_LEVEL, 看来与是不是NDIS程序无关。 创建系统线程函数PsCreateSystemThread只能在Passive Level调 用。创建的线程没有User Mode的执行环境,可以保证是Passive Level。 |
|
|
8楼#
发布于:2002-04-18 09:27
谢了,我明白了该怎么作。
再次感谢! |
|