阅读:2993回复:27
40分,请教MpSend中接收包的内存释放问题
目的:当本机发出一个Arp请求时,我禁止它发出,而是根据自己需要构造一个Arp回应,然后传回上层。
工具:base of passthru 做法: 在MpSend中禁止Arp请求发出,构造自己的数据包;(已经实现) 用NdisMIndicateReceivePacket通知上层接收这个数据包; NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyArpPacket,1); MyArpPacket是我自己组建的一个Arp Reply,用以递交给上层。 不知道代码对不对。我是在MpSend中的,第一个参数可以这样写么? 接下来是两种情况 1)如果返回值不是Pending,我用如下代码释放内存: NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyArpPacket,1); if(NDIS_GET_PACKET_STATUS(MyArpPacket)!=NDIS_STATUS_PENDING) { NdisFreeBuffer(pArpBuffer);//free buffer DbgPrint(\"In MPSend:NdisFree ArpBuffer successed.\\n\"); NdisFreePacket(MyArpPacket);//free packet DbgPrint(\"In MPSend:NdisFree MyArpPacket successed.\\n\"); NdisFreeMemory(pArpContent,2000,0);//free memory DbgPrint(\"In MPSend: FreeMemory ArpContent Successed.\\n\"); } 2)如果返回值是Pending,那么就要调用MpReturnPacket 我编写了如下代码,这是最有可能出问题的地方。 VOID MPReturnPacket( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet ) { PADAPT pAdapt = (PADAPT)MiniportAdapterContext; PNDIS_PACKET MyPacket; PRSVD Resvd; PNDIS_BUFFER pNdisBuffer; PUCHAR pPacketContent; UINT BufferLen; Resvd = (PRSVD)(Packet->MiniportReserved); MyPacket = Resvd->OriginalPkt; if(MyPacket) { NdisFreePacket(Packet); NdisReturnPackets(&MyPacket, 1); } else { NdisUnchainBufferAtFront(Packet,&pNdisBuffer); NdisQueryBuffer(pNdisBuffer,(PVOID *)&pPacketContent,&BufferLen); NdisFreeBuffer(pNdisBuffer); NdisFreeMemory(pPacketContent,2000,0); NdisFreePacket(Packet); DBGPRINT((\"In MPReturnPacket And Free Memory\\n\")); } } 问题:代码安装后兰屏 我认为就是在内存释放的问题上, 但是才识不足,看不出错在哪里, 希望斑竹,各位大侠能帮帮我。 |
|
最新喜欢:peral |
沙发#
发布于:2003-04-28 09:28
没有人会?汗......
HU斑竹在哪里?mikeluo大侠收到我的信了么? |
|
板凳#
发布于:2003-04-28 09:34
send如果是pending,应该在sendcomplete里面进行释放packet和buffer的工作。
释放的时候要按照缓冲区-》buffer -》packet的顺序来进行,首先要把buffer从packet上unchain,NdisUnchainBufferAtBack或者NdisUnchainBufferAtFront,然后NdisQueryBuffer得到你这个buffer指向的memory的地址,然后NdisFreeMemory,然后NdisFreeBuffer,最后Ndisfreepacket |
|
|
地板#
发布于:2003-04-28 09:39
不过我不是在MPSend中调用NdisSend,而是调用了NdisMIndicateReceivePacket,这样返回Pending的时候还是要调用
sendcomplete么? 我没有发送包,而是接收了一个包. |
|
地下室#
发布于:2003-04-28 10:15
那就是returnpacket了
|
|
|
5楼#
发布于:2003-04-28 12:35
我知道啊,代码都贴上面了.就不知有什么问题.
|
|
6楼#
发布于:2003-04-28 13:21
你用的passthru的例子???
你在returnpacket里面没有释放内存 buffer就释放packet了? 还有,你NdisMIndicateReceivePacketpacket的时候怎么设置的OOB数据? |
|
|
7楼#
发布于:2003-04-28 13:43
if(MyPacket)
{ NdisFreePacket(Packet); NdisReturnPackets(&MyPacket, 1); } else { NdisUnchainBufferAtFront(Packet,&pNdisBuffer); NdisQueryBuffer(pNdisBuffer,(PVOID *)&pPacketContent,&BufferLen); NdisFreeBuffer(pNdisBuffer); NdisFreeMemory(pPacketContent,2000,0); NdisFreePacket(Packet); DBGPRINT((\"In MPReturnPacket And Free Memory\\n\")); } 你是说应该在if{}中加入释放buffer ,memory的语句么? 其次,OOB_DATA是什么呢?我经常看到这个说法,但是不知道有什么用处. |
|
8楼#
发布于:2003-04-28 15:36
释放的时候要按照缓冲区-》buffer -》packet的顺序来进行,首先要把buffer从packet上unchain,NdisUnchainBufferAtBack或者NdisUnchainBufferAtFront,然后NdisQueryBuffer得到你这个buffer指向的memory的地址,然后NdisFreeMemory,然后NdisFreeBuffer,最后Ndisfreepacket 按照这个顺序来释放, OOB数据是管理用的, 你看一下ddk里面NdisMIndicateReceivePacketpacket的说明,按照他的说明设置oob数据。 |
|
|
9楼#
发布于:2003-04-29 14:54
NdisMIndicateReceivePacketpacket的说明我看了,没有特别的要求吧.我回去再看看,你能先给我讲讲应该有什么要求么?
你说的释放顺序是这样么? NdisFreeMemory,然后NdisFreeBuffer,最后Ndisfreepacket |
|
10楼#
发布于:2003-04-29 16:53
你看一下他的comments,写了很多要注意的东西。
|
|
|
11楼#
发布于:2003-04-29 16:56
如果你只是想处理arp包,可以在应用程序里面修改arp表来实现这个目标吧?
|
|
|
12楼#
发布于:2003-04-30 11:09
不止是处理ARP包那么简单。还要禁止它发出,然后通知系统一个响应。以后还要处理接受到的IP包,转发。
COMMENTs看了,还是不太清楚,您能不能给我一段相应的代码,那样学习更快捷一些。 我已经回信,请收阅。 |
|
13楼#
发布于:2003-04-30 16:23
还没有收到你的信,主要就是设置那些oob的数据,因为那些数据是用来管理的。
|
|
|
14楼#
发布于:2003-04-30 16:39
NdisAllocateBuffer(&Status,&pArpBuffer,pAdapt->SendBufferPoolHandle,pArpContent,PacketLen);
NdisChainBufferAtFront(MyArpPacket,pArpBuffer); MyArpPacket->Private.Head->Next=NULL; MyArpPacket->Private.Tail=NULL; NDIS_SET_PACKET_HEADER_SIZE(MyArpPacket,14); 我想那些timesend,timetosend等不用设置了吧。还有Packet的status要不要设置?我曾经看到过有人没有设置就直接发出的。 |
|
15楼#
发布于:2003-04-30 16:41
你给我一个国内的邮箱可否?这样更快捷一些。
|
|
16楼#
发布于:2003-04-30 16:45
[编辑 - 4/30/03 by mikeluo] |
|
|
17楼#
发布于:2003-04-30 16:48
NdisChainBufferAtFront以后不用自己设置MyArpPacket->Private.Head->Next=NULL;
MyArpPacket->Private.Tail=NULL; |
|
|
18楼#
发布于:2003-04-30 16:52
收到,多谢指导。虽然问题没有解决,但是把分先给你,分不是问题。
[编辑 - 4/30/03 by ruberman] |
|
19楼#
发布于:2003-04-30 17:00
你现在在什么地方出错?
|
|
|
上一页
下一页