lilio
驱动牛犊
驱动牛犊
  • 注册日期2003-02-24
  • 最后登录2006-12-16
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望13点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:1605回复:5

[求助]NdisGetReceivePacket()截到的总是NULL

楼主#
更多 发布于:2003-07-20 11:44
NdisGetReceivePacket()截到Packet的总是NULL,这样就无法向下层返回。像高手求助。 :(

最新喜欢:

WY.lslrtWY.lsl...
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-20 16:24
NdisGetReceivePacket()截到Packet的总是NULL,这样就无法向下层返回。像高手求助。 :(


这要取决于下层给你的时候是整包,还是分开的```

ndisindicatepacket?还是ndiseth。。。
[color=red]大头鬼! :P[/color]
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-21 10:26
一、数据从网卡进入机器总共有4种可能性及对NAT的处理:
1。当网卡为老式网卡或不需要OOB数据时miniport调用ndisxxxindicatepacket时,NDIS调用ptreceive函数。并且packet==NULL。这时如果PACKETSIZE<=lookaheadbuffersize,那么说明所要数据已经传上来。
我们可以立即对数据进行组包,然后做NAT。如果NAT的返回值不是PENDING那么我们立即释放我们刚刚所
申请的资源。如果是PENDING那么我们应该在ptsendcomplete中释放我们的资源。

2。当系统资源不足时,miniport自己组装一个packet,但是这个packet只是一个指针而已!
miniport将这个packet的status设为NDIS_STATUS_RESOURCE
并调用ndisindicatepacket函数通知NDIS,那么NDIS也会调用ptreceive函数,但是在ptreceive
函数中,packet=ndisgetpacket的值不会==NULL。在ptreceive我们同样也申请一个包mypacket,
但是真正的内容还是在底层的miniport中,现在开始做NAT,那么如果返回不是PENDING那么
我们立即释放刚刚所申请的资源。否则我们应该在ptsendcomplete中释放我们的资源。
这个mypacket的释放要特别注意!


3。
当网卡为老式网卡或不需要OOB数据时miniport调用ndisxxxindicatepacket时,NDIS调用ptreceive函数,
并且packet==NULL。这时如果PACKETSIZE>lookaheadbuffersize;那么说明数据还有一部分在miniport上,
我们需要先transferdata,如果transferdata等于PENDING,那么还要transferdatacomplet。
通知miniport数据已经全部上来了。
在transferdata之前我们可以先申请pbakcontext,offsetbuffer,mypacket,把先传上来的raw数据
放在mypacket中。然后我们再申请一个ppacketbuffer,buffer,natpacket来存放接下来要transfer的
data。
如果transferdata返回了NDIS―STATUS-SUCCESS,那么立刻释放我们的资源,否则的话:
在ptsendcomplete中释放


4。miniport调用NDISINDICATEpacket,并且包的状态不是RESOURCE,那么miniport将复制一份packet
给上层的ptreceivepacket,那么意味着我们可以在ptreceivepacket中对包进行任意修改。

//好久没写过这么长了,辛苦啊.
//有些地方可能有漏洞,欢迎大家指出来
你说的就是第一种情况了.因为你的是老网卡,或者不需要OOB数据.
底层认为只要传上来一些原始数据就可以了,所以没有组包.
第1.2.3种都在Ptreceive中.
第4种在ptreceivepacket中








[编辑 -  7/21/03 by  antspower]
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-21 10:36
NdisGetReceivePacket()截到Packet的总是NULL,这样就无法向下层返回。像高手求助。
//着句话,偶不太明白.
//向下层返回是什么意思??是说调用PRRECEIVECOMPLE,还是MPRETURNPACKET?
放弃瘟草,现吃李草
lilio
驱动牛犊
驱动牛犊
  • 注册日期2003-02-24
  • 最后登录2006-12-16
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望13点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-22 18:52
谢谢楼上的各位.
最近太忙,我已经将分数给了.
谢谢大家.
另外,现在我的程序在PtReceive中采用判断PacketSize与LookAheadBuffer的方法已经调试成功...
特别鸣谢antspower.
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-22 20:21
谢谢楼上的各位.
最近太忙,我已经将分数给了.
//好像没有给吧
谢谢大家.
另外,现在我的程序在PtReceive中采用判断PacketSize与LookAheadBuffer的方法已经调试成功...
//这样的代码在论坛里有啊。HYG的。
特别鸣谢antspower.
 




[编辑 -  12/2/03 by  antspower]
放弃瘟草,现吃李草
游客

返回顶部