chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1606回复:5

NdisSend资源释放问题?

楼主#
更多 发布于:2004-07-08 17:27
我在自己的线程中调用
NdisSend(&Status,pAdapt->BindingHandle,pPacket)发送我保存在队列中的数据包时,系统蓝屏,softice显示IRQL_NOT_LESS_OR_EQUAL,可能什么原因造成呢?

[编辑 -  7/12/04 by  chili]
ririri
驱动牛犊
驱动牛犊
  • 注册日期2004-06-02
  • 最后登录2005-07-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-09 15:49
 
 
调用NdisSend的例程只能在 IRQL <= DISPATCH_LEVEL 以下运行
 
可能是你调用NdisSend的例程优先级过高了
 
 
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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]
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-12 10:43
应该是很简单的,调用完NdisSend后判断Packet中的Status决定是否调用PTSendComplete,即
NdisSend( ..., Packet );
if( NDIS_GET_PACKET_STATUS( Packet ) != NDIS_STATUS_PENDING )
 PTSendComplete( ..., Packet );
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-12 10:58
我现在的问题就是在ptSendComplete中执行到 NdisMSendComplete(pAdapt->MiniportHandle,Pkt,Status);时出现问题,我加了一个标示位(Flag),如果不是保存到自己数据包队列中的包则不调用NdisMSendComplete则可以,但是看了一下ddk说明觉得这样处理不妥。
请问高手们是怎么处理的?还有就是NdisSend发送保存在队列中的数据包时需不需要调用NdisIMCopySendCompletePerPacketInfo函数?
chili
驱动牛犊
驱动牛犊
  • 注册日期2004-03-31
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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]
游客

返回顶部