阅读:1659回复:5
[求助]NdisGetReceivePacket()截到的总是NULL
NdisGetReceivePacket()截到Packet的总是NULL,这样就无法向下层返回。像高手求助。 :(
|
|
最新喜欢:WY.lsl... |
沙发#
发布于:2003-07-20 16:24
NdisGetReceivePacket()截到Packet的总是NULL,这样就无法向下层返回。像高手求助。 :( 这要取决于下层给你的时候是整包,还是分开的``` ndisindicatepacket?还是ndiseth。。。 |
|
|
板凳#
发布于: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] |
|
|
地板#
发布于:2003-07-21 10:36
NdisGetReceivePacket()截到Packet的总是NULL,这样就无法向下层返回。像高手求助。
//着句话,偶不太明白. //向下层返回是什么意思??是说调用PRRECEIVECOMPLE,还是MPRETURNPACKET? |
|
|
地下室#
发布于:2003-07-22 18:52
谢谢楼上的各位.
最近太忙,我已经将分数给了. 谢谢大家. 另外,现在我的程序在PtReceive中采用判断PacketSize与LookAheadBuffer的方法已经调试成功... 特别鸣谢antspower. |
|
5楼#
发布于:2003-07-22 20:21
谢谢楼上的各位. [编辑 - 12/2/03 by antspower] |
|
|