jasic2002
驱动牛犊
驱动牛犊
  • 注册日期2003-10-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望37点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1357回复:2

关于ptRecvComplete函数的问题

楼主#
更多 发布于:2003-11-12 16:28
看了前面的帖子,我们总觉得这个函数好像没什么用处。

ddk中认为他可以对packet作一些后处理,比如说通知对该报文感兴趣的应用。

但是到目前为止,我还没有看见什么真真的应用。
在包截获中,如果报文收齐了,直接在ptrecv中判断是否提交,
如果没收齐,则调用transferdata,在transferdatacomplete中
合成整个报文,在提交上去。

前面有的帖子提出在这个函数中作截获判断。
但是斑竹将这个想法否决,应为这样的话,事实上报文可能已经提交上去,所以,我思前想后没什么要他干的啊!



显然我的想法是错误的,我知道哪位会的朋友解决一下。谢谢
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-13 09:33
你说的没错,如果PtReceive中和PtTransferDataComplete中做了NdisMIndicateReceivePacket的话,你可以不处理PtReceiveComplete.这是没有问题的.

正如DDK的例子,如果你不一定是整包向上递的话,你可以像例子中那样在PtReceiveComplete中做些处理.当然,用Passthru的一般都不这么做.

我是这样用的:
在PtReceive和PtTransferDataComplete中,一旦收齐整个包,就把它挂在一个链上,然后在PtReceiveComplete中Pop一个出来处理,处理完成后调用NdisMIndicateReceivePacket.当然,如果该数据包不是我关心的,就直接在PtReceive和PtTransferDataComplete中Indicate了.

实际的情况是,对于直接在PtReceive和PtTransferDataComplete中Indicate的情况,我不敢确定是否会进入PtReceiveComplete(没有去查,因为没有出现过问题).但对于挂在待处理链上的情况,总会进入PtReceiveComplete中,这样对这个链的Pop动作就只在一个地方做了.

还有一种情况,如果你想使用系统线程(这常常是需要的),那么Pop动作只在线程里做就可以了,PtReceiveComplete中可以不做任何处理,但这时后Push/Pop的动作之间就需要有Event等来通知.

实践证明,以上所说的两种情况都是没有问题的.

Sample:

VOID
PtReceiveComplete(
IN NDIS_HANDLE ProtocolBindingContext
)
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
#ifndef USE_SYSTEM_THREAD
IMHandlePacket((PVOID)ProtocolBindingContext, FALSE);
#endif
}



[编辑 -  11/13/03 by  SharpShooter]
写驱动不如买足彩!!
jasic2002
驱动牛犊
驱动牛犊
  • 注册日期2003-10-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望37点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-13 10:54
先谢谢楼上的朋友,回答的蛮精彩的。^_^
但是我还是有点小疑惑望不惜赐教:

ddk中认为在ptreceive中不应该有比较复杂的操作。否则会影响系统中的提交报文的速度。
根据你的想法,其实就是将indicatexxxx这个函数换了个地方,摆到了recvcomplete中啊。在一些相关应用中似乎还是不能解决什么问题啊。比如在过滤报文的应用中,在数据收齐时,我还是要在ptrecv中解包判断啊,至于把indicatexxx放在ptrecv中,还是ptcomplete中,似乎没有多大影响,至少在效率上没有明显的提高啊。

另一方面,在ptrecv结束后一定调用ptrecvcomplete这个函数吗?
据我所知,只有在下层miniport调用ndisindicaterecvcomplet这个函数后才会调用啊。
谁又能保证下层一定调用这个函数啊。



^_^希望回复,也希望大家一起来参与讨论。谢谢
游客

返回顶部