阅读:1606回复:5
NdisSend资源释放问题?
我在自己的线程中调用
NdisSend(&Status,pAdapt->BindingHandle,pPacket)发送我保存在队列中的数据包时,系统蓝屏,softice显示IRQL_NOT_LESS_OR_EQUAL,可能什么原因造成呢? [编辑 - 7/12/04 by chili] |
|
沙发#
发布于:2004-07-09 15:49
调用NdisSend的例程只能在 IRQL <= DISPATCH_LEVEL 以下运行 可能是你调用NdisSend的例程优先级过高了 |
|
板凳#
发布于:2004-07-11 14:47
跟踪后发现是在调用NdisSend后触发ptSendComplete时出现错误。
ptSendComplete代码如下: { PADAPT pAdapt =(PADAPT)ProtocolBindingContext; PNDIS_PACKET Pkt; PRSVD Rsvd; PNDIS_BUFFER pPacketBuffer = NULL; PUCHAR pPacketContent = NULL; UINT BufLength; // // Returning the Send on the Primary, will point to itself if there is no bundle // pAdapt = pAdapt->pPrimaryAdapt; Rsvd =(PRSVD)(Packet->ProtocolReserved); Pkt = Rsvd->OriginalPkt; pPacketBuffer = (PNDIS_BUFFER)Rsvd->pMyBuffer; pPacketContent = (PUCHAR)Rsvd->pMyContent; if (pPacketBuffer!=NULL) { NdisUnchainBufferAtFront(Packet,&pPacketBuffer); NdisQueryBufferSafe(pPacketBuffer,&pPacketContent,&BufLength,32); NdisFreeBuffer(pPacketBuffer); } if (pPacketContent!=NULL) { NdisFreeMemory(pPacketContent,BUFFER_SIZE,0); } NdisIMCopySendCompletePerPacketInfo (Pkt, Packet); NdisDprFreePacket(Packet); NdisMSendComplete(pAdapt->MiniportHandle,Pkt,Status);//调试发现执行此句蓝屏 } 说明: 我在RSVD中加了pMyBuffer,pMyContent以便在MPSend中保存要释放资源,如下: typedef struct _ProtRsvd { PNDIS_PACKET OriginalPkt; PVOID pMyBuffer; //added by zxd 2004-07-10 PVOID pMyContent; //added by zxd 2004-07-10 } RSVD, *PRSVD; 1.造成蓝屏原因是什么呢? 2.对在MPSend中的资源应该怎样释放? [编辑 - 7/12/04 by chili] |
|
地板#
发布于:2004-07-12 10:43
应该是很简单的,调用完NdisSend后判断Packet中的Status决定是否调用PTSendComplete,即
NdisSend( ..., Packet ); if( NDIS_GET_PACKET_STATUS( Packet ) != NDIS_STATUS_PENDING ) PTSendComplete( ..., Packet ); |
|
地下室#
发布于:2004-07-12 10:58
我现在的问题就是在ptSendComplete中执行到 NdisMSendComplete(pAdapt->MiniportHandle,Pkt,Status);时出现问题,我加了一个标示位(Flag),如果不是保存到自己数据包队列中的包则不调用NdisMSendComplete则可以,但是看了一下ddk说明觉得这样处理不妥。
请问高手们是怎么处理的?还有就是NdisSend发送保存在队列中的数据包时需不需要调用NdisIMCopySendCompletePerPacketInfo函数? |
|
5楼#
发布于:2004-07-13 09:20
我现在把ptSendComplete改成这样就没有问题了:
typedef struct _ProtRsvd { PNDIS_PACKET OriginalPkt; BOOLEAN IsPrivate; //是否自己开辟的包 PVOID pMyBuffer; //缓冲池指针 PVOID pMyContent; //缓冲指针 } RSVD, *PRSVD; { PADAPT pAdapt = (PADAPT)ProtocolBindingContext; PNDIS_PACKET Pkt; PRSVD Rsvd; PNDIS_BUFFER pPacketBuffer = NULL; PUCHAR pPacketContent = NULL; UINT BufLength; // // Returning the Send on the Primary, will point to itself if there is no bundle // pAdapt = pAdapt->pPrimaryAdapt; Rsvd =(PRSVD)(Packet->ProtocolReserved); Pkt = Rsvd->OriginalPkt; pPacketBuffer = (PNDIS_BUFFER)Rsvd->pMyBuffer; pPacketContent = (PUCHAR)Rsvd->pMyContent; if (!Rsvd->IsPrivate) { NdisIMCopySendCompletePerPacketInfo (Pkt, Packet); NdisDprFreePacket(Packet); NdisMSendComplete(pAdapt->MiniportHandle, Pkt,Status); } else { NdisUnchainBufferAtFront(Packet,&pPacketBuffer); NdisQueryBufferSafe(pPacketBuffer,&pPacketContent,&BufLength,32); NdisFreeBuffer(pPacketBuffer); NdisFreeMemory(pPacketContent,BUFFER_SIZE,0); NdisDprFreePacket(Packet); //NdisMSendComplete(pAdapt->MiniportHandle, Pkt,Status); } 可是我还是有点疑问,如果在上面没有调用NdisMSendComplete函数,那真正protocol开辟的资源由谁来释放呢??? [编辑 - 7/13/04 by chili] |
|