blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:1611回复:8

NDIS程序是不是不能建造、发送IRP

楼主#
更多 发布于:2002-04-11 11:26
我建造了一个内核API程序,向外提供函数服务,向下发送IRP包到一个PCI设备的驱动程序。
现在的问题是如果普通的软WDM驱动程序调用没有任何问题,但我用PassThru这个NDIS程序调用就会出问题,NDIS程序是不是不能建造、发送IRP?

最新喜欢:

IammeIamme
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-18 09:27
谢了,我明白了该怎么作。
再次感谢!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-17 23:28
DDK文档中说IoBuildSynchronousFsdRequest()也是必须在PASSIVE_LEVEL, 看来与是不是NDIS程序无关。
在Dispatch level上是否可以创建线程?创建的线程是否可以保证是Passive level?

创建系统线程函数PsCreateSystemThread只能在Passive Level调
用。创建的线程没有User Mode的执行环境,可以保证是Passive Level。
写驱动不如买足彩!!
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-17 11:46
DDK文档中说IoBuildSynchronousFsdRequest()也是必须在PASSIVE_LEVEL, 看来与是不是NDIS程序无关。
在Dispatch level上是否可以创建线程?创建的线程是否可以保证是Passive level?
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-16 20:37
我的现象非常奇怪:在Send 第一个Packet时,没什么问题;但在Send第二个Packet时,就会出各种各样的问题了
TO: TonyHuyan, 我马上试着去改一下IRQL,不知能否成功?
 


老大,Irql是不能随便改的!!为了不被中断,你可以提升Irql,
用完后再降低到原来的Irql,事实上各种互斥之类的东西都是这么
做的。

你要降低Irql还不出问题的话,你去买足彩早中500万了!呵呵。


我不是说过了吗,Send不总是在Dispatch Level,有时候会是在
Passive Level, 所以你说第一个包没问题很正常。



明白了,NDIS不是不能创建IRP,而是不能用IoBuildSynchronousFsdRequest()和IoBuildAsynchronousFsdRequest()创建!
呜呜呜!


问题不在于如何创建Irp,因为创建Irp和分配一块内存没有什么
实质性的区别,关键在于如何使用这个Irp!



[编辑 -  4/16/02 作者: TonyHuyan]
写驱动不如买足彩!!
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-16 15:14
明白了,NDIS不是不能创建IRP,而是不能用IoBuildSynchronousFsdRequest()和IoBuildAsynchronousFsdRequest()创建!
呜呜呜!
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-16 10:58
我的现象非常奇怪:在Send 第一个Packet时,没什么问题;但在Send第二个Packet时,就会出各种各样的问题了
TO: TonyHuyan, 我马上试着去改一下IRQL,不知能否成功?
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-14 00:52
我建造了一个内核API程序,向外提供函数服务,向下发送IRP包到一个PCI设备的驱动程序。
现在的问题是如果普通的软WDM驱动程序调用没有任何问题,但我用PassThru这个NDIS程序调用就会出问题,NDIS程序是不是不能建造、发送IRP?


不存在什么东西能不能建造Irp的问题,关键在于你调用
IoCallDriver后要去Wait,而Wait的动作只能在passive level做,
如果你在Dispatch Level Wait的话,会造成缺页。

遗憾的是passthru发包的时候常常会在passive level,而收包
的时候几乎总是在Dispatch Level!

要解决你的问题,只有设法不Wait,如果必须Wait的话,我感觉只能
是创建一个线程去做,可以保证是在passive level.

[编辑 -  4/14/02 作者: TonyHuyan]
写驱动不如买足彩!!
KungFu
驱动大牛
驱动大牛
  • 注册日期2001-09-27
  • 最后登录2008-04-08
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望24点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-11 11:30
是不是你没有在你的passthru作相应的处理irp的函数阿
我不写驱动好多年
游客

返回顶部