阅读:3147回复: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\")); } } 问题:代码安装后兰屏 我认为就是在内存释放的问题上, 但是才识不足,看不出错在哪里, 希望斑竹,各位大侠能帮帮我。 |
|
最新喜欢:![]() |
沙发#
发布于:2003-05-06 21:20
对了,又看了一遍你的帖子,跟我的问题好像,区别只是我要在接受到数据包是发送,而你是在发送数据包时接收。差不多啦差不多 :D
我觉得你的问题还是在MPReturnPacket里面。也许MPReturnPacket被调用时,实际参数的数据包并不是你自己的驱动构建的,而是来自底层(mimiport)。所以你应该加一个判断 if(NdisGetPoolFromPacket(Packet)==自己的poor) { // 是自己构建的包,想怎么做就怎么做吧 } 先说这么多,即使不是这个原因导致死机,我想用SoftICE也应该能调出来,good luck |
|
板凳#
发布于:2003-05-06 21:15
其实你的驱动,如果一安装就会死机,这种情况用SoftICE很好调试的啊。设几个断点就全搞定了。
除非蓝屏在很偶然的情况,那就难搞了,我现在就是这样,惨~ |
|
地板#
发布于:2003-05-06 20:26
就是说拦截Arp请求,然后自己构造一个回答? 能具体讲讲么?DPC |
|
地下室#
发布于:2003-05-06 18:14
就是说拦截Arp请求,然后自己构造一个回答?
俺用DPC做的,在DPCROUTE里面调用NdisMEthIndicateReceive和NdisMEthIndicateReceiveComplete,自己申请内存和释放内存,目前为止跑得都很好,没什么问题阿。 |
|
5楼#
发布于:2003-05-06 17:57
详细讲一下你的处理过程???
都修改了那些地方? |
|
|
6楼#
发布于:2003-05-06 16:39
高手哪里去了?
这几天我也在不断努力,谁能有效的帮帮我阿? |
|
7楼#
发布于:2003-05-01 15:08
问题还没有解决阿,哪位大侠能作出正确回答,分不是问题。
|
|
8楼#
发布于:2003-04-30 17:16
还是兰屏。NDIS.sys出错。您能否给我写一个在MPsend中用ndisindicatereceivepacket收包,然后释放内存的代码,让我有个
参考?如果不想贴出来发到我邮箱可以了。 [编辑 - 4/30/03 by ruberman] |
|
9楼#
发布于:2003-04-30 17:00
你现在在什么地方出错?
|
|
|
10楼#
发布于:2003-04-30 16:52
收到,多谢指导。虽然问题没有解决,但是把分先给你,分不是问题。
[编辑 - 4/30/03 by ruberman] |
|
11楼#
发布于:2003-04-30 16:48
NdisChainBufferAtFront以后不用自己设置MyArpPacket->Private.Head->Next=NULL;
MyArpPacket->Private.Tail=NULL; |
|
|
12楼#
发布于:2003-04-30 16:45
[编辑 - 4/30/03 by mikeluo] |
|
|
13楼#
发布于:2003-04-30 16:41
你给我一个国内的邮箱可否?这样更快捷一些。
|
|
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:23
还没有收到你的信,主要就是设置那些oob的数据,因为那些数据是用来管理的。
|
|
|
16楼#
发布于:2003-04-30 11:09
不止是处理ARP包那么简单。还要禁止它发出,然后通知系统一个响应。以后还要处理接受到的IP包,转发。
COMMENTs看了,还是不太清楚,您能不能给我一段相应的代码,那样学习更快捷一些。 我已经回信,请收阅。 |
|
17楼#
发布于:2003-04-29 16:56
如果你只是想处理arp包,可以在应用程序里面修改arp表来实现这个目标吧?
|
|
|
18楼#
发布于:2003-04-29 16:53
你看一下他的comments,写了很多要注意的东西。
|
|
|
19楼#
发布于:2003-04-29 14:54
NdisMIndicateReceivePacketpacket的说明我看了,没有特别的要求吧.我回去再看看,你能先给我讲讲应该有什么要求么?
你说的释放顺序是这样么? NdisFreeMemory,然后NdisFreeBuffer,最后Ndisfreepacket |
|
上一页
下一页