阅读:1204回复:1
过滤发包时蓝屏,大家看看不家哪里有问题
这是我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); } |
|
最新喜欢:TOMG20... |
沙发#
发布于:2005-04-11 13:18
问题解决了,自己多事多写了个
NdisDprFreePacket(Packet); 把NdisDprFreePacket(Packet);去掉就OK了。 |
|