阅读:1650回复:4
passthru中PtSendComplete问题
看了ptreceive中间转发的不少帖子,关于ndissend返回pending 时的资源释放,依然有问题。今天已经重装3次机子了。下面是框架:
PtSendComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status ) { PADAPT pAdapt = (PADAPT)ProtocolBindingContext; PNDIS_PACKET Pkt; NDIS_HANDLE PoolHandle; PNDIS_BUFFER pNdisBuffer; PUCHAR pPacketContent; UINT BufferLen; if (need_free) { NdisUnchainBufferAtFront(Packet,&pNdisBuffer); NdisQueryBufferSafe(pNdisBuffer,&pPacketContent,&BufferLen,32); NdisFreeBuffer(pNdisBuffer); NdisFreeMemory(pPacketContent,BUFFER_SIZE,0); NdisDprFreePacket(Packet); need_free=0; } else { 原函数内处理代码; } } ptreceive内的组包应该没有问题, 请高手指教以下吧,快疯了。要分就拿。 |
|
最新喜欢:xiaoji... |
沙发#
发布于:2003-11-23 11:45
need_free是全局的?不正确。
为什么不用passthru的方法?利用ProtocolReserved。 原本是用ProtocolReserved来保存一个 typedef struct _ProtRsvd { PNDIS_PACKET OriginalPkt; } RSVD, *PRSVD; ,这里OriginalPkt是原来的packet,你可以将之改改,比如 typedef struct _ProtRsvd { PNDIS_PACKET OriginalPkt; PNIDS_BUFFER pMyBuffer; PUCHAR pMyContent; } RSVD, *PRSVD; 注意的是ProtocolReserved有16byte,就是说,可以放4个pointer的。 然后你在send自己的packet的时候,将OriginalPkt = NULL,因为没有原来的packet,自己分配的buffer和memory保存起来。在complete要判断OriginalPkt是否为NULL,pMyContent和pMyBuffer也判断是安全之道。 不过这样的话,你在其它用到RSVD的地方也要改了,将pMyBuffer和pMyContent = NULL。 |
|
板凳#
发布于:2003-11-23 13:07
非常感谢指点,我再试试。
|
|
地板#
发布于:2003-11-29 13:07
凑效,接分。
|
|
地下室#
发布于:2003-11-30 12:45
有说的错误的地方,就是ProtocolReserved不一定是16bytes,在分配packet pool handle的时候可以指定的。
NIC drivers and intermediate drivers allocate packet descriptors with, at least, 16 bytes of ProtocolReserved space to be used by protocols for receive indications. For packet descriptors to be used in receive indications, this parameter can be at most 16 (bytes). |
|