Cloudy_hanji
驱动牛犊
驱动牛犊
  • 注册日期2005-01-06
  • 最后登录2005-08-08
  • 粉丝1
  • 关注0
  • 积分56分
  • 威望10点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1204回复:1

过滤发包时蓝屏,大家看看不家哪里有问题

楼主#
更多 发布于:2005-04-10 21:58
这是我miniport里的MPSEND,我是过滤发送TCP包。但是现在只要我一发TCP包就蓝屏,大家帮我看看是什么问题。还有我想过滤发包应该和PTSendComplete没关系吧。
NDIS_STATUS
MPSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags
)
/*++

Routine Description:

Send handler. Just re-wrap the packet and send it below. Re-wrapping is necessary since
NDIS uses the WrapperReserved for its own use.

LBFO- All sends will be done in the secondary miniport of the bundle.

We are using the Secondary Miniport as the Send path. All sends should use that pAdapt structure.

Arguments:

MiniportAdapterContext Pointer to the adapter
Packet Packet to send
Flags Unused, passed down below

Return Value:

Return code from NdisSend

--*/
{
PADAPT pAdapt = (PADAPT)MiniportAdapterContext;
NDIS_STATUS Status;
PNDIS_PACKET MyPacket;
PUCHAR pPacketContent;
PNDIS_BUFFER PacketBuffer;
UINT PacketLen;
UINT bufLength;
PRSVD Rsvd;
PVOID MediaSpecificInfo = NULL;
ULONG MediaSpecificInfoSize = 0;
UINT headersize;
NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
HighestAcceptableAddress.LowPart = -1;
HighestAcceptableAddress.HighPart = -1;

DbgPrint(\"In MPsend!\\n\");


ASSERT (pAdapt->pSecondaryAdapt);
pAdapt = pAdapt->pSecondaryAdapt;
if (IsIMDeviceStateOn (pAdapt) == FALSE)
{
return NDIS_STATUS_FAILURE;
}

Status = NdisAllocateMemory(&pPacketContent,2000,0,HighestAcceptableAddress);//分配内存
if (Status != NDIS_STATUS_SUCCESS )
{
DbgPrint(\"mpsend: ndisallocatememory failed\\n\");
return NDIS_STATUS_FAILURE ;
}
if(pPacketContent == NULL)
{
DbgPrint(\"mpsend: pPacketContent == NULL\\n\");
return NDIS_STATUS_FAILURE ;
}
RtlZeroMemory(pPacketContent, 2000 );

CopyPacket2Buf(Packet,pPacketContent,&PacketLen);//拷贝包内容

//if(TCP == 1)
// P_IP_PACKET p_ip;
// p_ip = (P_IP_PACKET)pPacketContent;
// DbgPrint(\"拒绝发送TCP包!\");
// if(p_ip->H_frame_type == 8 && p_ip->L_frame_type == 0 && p_ip->proto == 6)
if(pPacketContent[12] == 8 && pPacketContent[13] == 0 && pPacketContent[23] == 6)
{
DbgPrint(\"拒绝发送TCP包!!\");
NdisFreeMemory(pPacketContent,2000,0);
NdisDprFreePacket(Packet);
DbgPrint(\"拒绝发送TCP包!!\");
return NDIS_STATUS_FAILURE;
}


NdisAllocatePacket(&Status,&MyPacket,pAdapt->SendPacketPoolHandle);//分配包,失败的话要把分配的内存释放掉
if (Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->SendPacketPoolHandle,pPacketContent,PacketLen);//分配buffer
NdisChainBufferAtFront( MyPacket, PacketBuffer);

Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
Rsvd->OriginalPkt = Packet;
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);//自己定义的包


NdisSend(&Status, pAdapt->BindingHandle, MyPacket);//发送
DbgPrint(\"Ndissend send complete!\\n\");



if (Status != NDIS_STATUS_PENDING)//返回pending的话自己分配的东西要在PtSendComplete里面释放
{
NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
NdisUnchainBufferAtFront(MyPacket ,&PacketBuffer);
NdisQueryBufferSafe(PacketBuffer,(PVOID *)&pPacketContent,&bufLength,32);
NdisFreeBuffer(PacketBuffer);
NdisFreeMemory(pPacketContent,2000,0);
NdisDprFreePacket(MyPacket);
}
}
else NdisFreeMemory(pPacketContent,2000,0); //没分配到包的时候释放内存

return(Status);
}

最新喜欢:

TOMG2004TOMG20...
Cloudy_hanji
驱动牛犊
驱动牛犊
  • 注册日期2005-01-06
  • 最后登录2005-08-08
  • 粉丝1
  • 关注0
  • 积分56分
  • 威望10点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-11 13:18
问题解决了,自己多事多写了个
NdisDprFreePacket(Packet);
把NdisDprFreePacket(Packet);去掉就OK了。
游客

返回顶部