virmin
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1666回复:4

ndis协议驱动中的IRP处理

楼主#
更多 发布于:2004-03-20 13:03
DDK自带的packet中
PacketWrite处理发送数据包的代码
==================================================
NdisSend(&Status, open->AdapterHandle, pPacket);
if (Status != NDIS_STATUS_PENDING)
{
    PacketSendComplete(open, pPacket, Status);
}
===================================================
我不明白pending的时候需要自己调用IoCompleteRequest()??
PacketSendComplete()这个函数里调用了这个函数宣告IRP的完成
现在想到的可能的解释是NdisSend()自己又构造了一个IRP,让我称它为临时IRP, 将这个临时IRP发送下去后就看返回status,如果是pending就等,然后在某个时候该临时IRP被IoCompleteRequest宣告完成后,从等待的地方开始继续执行PacketSendComplete()来宣告原来的IRP的完成,如果返回不是pending,就直接返回给NdisSend(),所以我们才需要判断NdisSend返回过来的结果是不是pending,不是的话需要自己手工调用PacketSendComplete()

不过这样解释好象很勉强, NdisSend完全可以不管是不是pending都调用 PacketSendComplete啊,设置完成例程不就可以了么??

请高人指点!!


[编辑 -  3/20/04 by  virmin]
sigh~
virmin
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-03-20 15:37
顶一下先,请高手们指点啊
sigh~
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-03-22 11:30
是要重新又构造了一个IRP(不过叫PACKET更合适),根据NDIS的规则不PENDING的时候是不调用完成函数的,为了释放资源,就手工调用,也可以不调用,直接释放资源,并向上层说明发送已经完成,不过还是调用更方便。
virmin
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-03-23 07:56
能介绍点ndis方面的书吗?
sigh~
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-03-23 10:07
书好象没见过,看DDK吧
游客

返回顶部