阅读:3529回复:37
50分,谁解决谁拿走,还是那个mpsend中indicate包以后释放内存的问题,嫌少还可以加......
在passthru代码基础上,拦截本机发出的Arp请求,然后自己构造一个Arp回应,indicate给上层。
处理流程: 1。在MpSend中检查要发出的包,拦截Arp请求发出,构造自己的数据包;easy... 2。用NdisMIndicateReceivePacket通知上层接收这个数据包; 3。传送完毕,释放内存。 NDIS_STATUS MPSend( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet, IN UINT Flags ) { PADAPT pAdapt = (PADAPT)MiniportAdapterContext; NDIS_STATUS Status=NDIS_STATUS_SUCCESS; PNDIS_PACKET MyPacket,MyArpPacket; //MyArpPacket是自己组建的一个Arp Reply,用以递交给上层。 PRSVD Rsvd; PVOID MediaSpecificInfo = NULL; ULONG MediaSpecificInfoSize = 0; UINT PhysicalBufferCount; UINT BufferCount,k; UINT TotalPacketLength; PNDIS_BUFFER CurrentBuffer,NextBuffer,pArpBuffer; UINT CurrentBufferLength; PVOID CurrentBufferVA; NDIS_HANDLE PacketCopyHandle=NULL; NDIS_STATUS ReturnStatus; //PETHHDR DownEthhdr,UpEthhdr; //PARPHDR DownArphdr,UpArphdr; //PIPHDR DownIphdr; PUCHAR pArpContent; UINT PacketLen; DbgPrint(\"===>PassThru MPSend.....\\n\"); .......... //前面已经组建了要发出的MyPacket包,同PassThru的代码 //判断是不是ARP请求,如果是,则走下面的流程 //申请内存 Status=NdisAllocateMemory(&pArpContent,2000,0,HighestAcceptableMax); if(Status==NDIS_STATUS_SUCCESS) { DbgPrint(\"In MPSend:NdisAllocateMemory Successed.\\n\") if(pArpContent!=NULL) { DbgPrint(\"In MPSend:pPacketContent!=NULL\\n\"); NdisZeroMemory(pArpContent,2000); DbgPrint(\"In MPSend:Zero ArpContent Successed.\\n\"); //讲MyPacket的内容拷贝进来,然后修改成一个回应..... CopyPacket2Buffer(MyPacket,pArpContent,&TotalPacketLength); DbgPrint(\"In MPSend...Copy MyPacket to ArpContent Successed.\\n\"); PacketLen=TotalPacketLength; //修改数据,代码省略...... //开始构造组包 NdisAllocatePacketPool(&ReturnStatus,&PacketCopyHandle,1,sizeof(RSVD)); if(ReturnStatus==NDIS_STATUS_SUCCESS) { DbgPrint(\"In MPSend:Ndis Allocate ArpPacket Pool Successed.\\n\"); NdisAllocatePacket(&Status,&MyArpPacket,PacketCopyHandle); if(Status==NDIS_STATUS_SUCCESS) { DbgPrint(\"In MPSend:NdisAllocatePacket successed.\\n\"); 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); DbgPrint(\"In MPSend:Packet build down,begin query new arp packet.\\n\"); NdisQueryPacket(MyArpPacket, &PhysicalBufferCount, &BufferCount, &CurrentBuffer, &TotalPacketLength); DbgPrint(\"BufferCount:%u.\\n\",BufferCount); DbgPrint(\"TotalPacketLength:%u.\\n\",TotalPacketLength); NdisQueryBuffer(CurrentBuffer, &CurrentBufferVA, &CurrentBufferLength); DbgPrint(\"CurrentBufferLength: %u \\n\",CurrentBufferLength); ////组包完毕,用NdisMIndicateReceivePacket通知上层接收这个数据包; //开始通知上层接收这个NEW ARP PACKET。。。 NdisMIndicateReceivePacket(pAdapt->MiniportHandle,&MyArpPacket,1); if(NDIS_GET_PACKET_STATUS(MyPacket)!=NDIS_STATUS_PENDING) { NdisFreeBuffer(pArpBuffer); DbgPrint(\"In MPSend:NdisFree ArpBuffer successed.\\n\"); NdisFreePacket(MyArpPacket); DbgPrint(\"In MPSend:NdisFree MyArpPacket successed.\\n\"); NdisFreeMemory(pArpContent,2000,0); DbgPrint(\"In MPSend: FreeMemory ArpContent Successed.\\n\"); } //返回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); DBGPRINT((\"In MPReturnPacket And Free Memory...if\\n\")); } /*================== Add This Code for NdisMIndicateReceivePacket ==================*/ else { NdisUnchainBufferAtFront(Packet,&pNdisBuffer); NdisQueryBuffer(pNdisBuffer,(PVOID *)&pPacketContent,&BufferLen); NdisFreeBuffer(pNdisBuffer); NdisFreePacket(Packet); NdisFreeMemory(pPacketContent,2000,0); DBGPRINT((\"In MPReturnPacket And Free Memory...else\\n\")); } 目前的问题:兰屏,并且中间我做了很多工作,还是不行,受不了啦,哪位大侠能修改一下,让它跑起来,多谢。。。 |
|
沙发#
发布于:2003-05-12 18:51
我已经告诉你了啊,还是returnpacket的问题
|
|
板凳#
发布于:2003-05-12 17:24
什么问题?
|
|
|
地板#
发布于:2003-05-12 17:13
问题解决了,多谢各位大侠的帮助!
|
|
地下室#
发布于:2003-05-12 10:50
mikeluo大侠,请你帮帮我阿,就这个问题我已经拖了两个星期了,超郁闷!! 你用调试工具跟一下看看,你的问题应该是内存错误吧。 windbg调一下? |
|
|
5楼#
发布于:2003-05-12 10:07
mikeluo大侠,请你帮帮我阿,就这个问题我已经拖了两个星期了,超郁闷!!
|
|
6楼#
发布于:2003-05-12 09:27
mikeluo 大侠 向系统返回一个success,告诉系统这个packet已经被成功处理了,然后会由分配packet的驱动来释放, 由于packet是从pool里面分配出来的,pool是由驱动来管理的,所以只能是由分配packet的那个驱动来释放。 |
|
|
7楼#
发布于:2003-05-12 08:58
我再次恳请哪位大侠曾经做过这方面的,能帮帮我!
|
|
8楼#
发布于:2003-05-11 19:15
高见,那么我indicate包pending以后应该如何释放我分配的packet,buffer和memory呢?恳请给段代码参考,成功后我会将源码发给你一份。email已经贴上。 我不是向底层发包,而是向上层递交一个包。估计不会是调用到PtSendComplete吧?我在MpReturnPacket中也是按你的方法释放的内存的。 问题仍旧没有解决,恳求高手指点,分不是问题! |
|
9楼#
发布于:2003-05-11 13:05
mikeluo 大侠
我想问一个问题,对于构造自己包没什么问题,但是对于原来的包怎么处理?那如果将其悬挂,其资源有谁来释放? |
|
10楼#
发布于:2003-05-11 12:42
高见,那么我indicate包pending以后应该如何释放我分配的packet,buffer和memory呢?恳请给段代码参考,成功后我会将源码发给你一份。email已经贴上。
//////////////////////////////////////////////////////// 其实我提点看法吧!应为你想底层传送的宝石你自己定义的包,在xpassthru中 PtSendComplete( IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status )所指向的包为你自己的包,通过NdisUnchainBufferAtFront(Packet,&pNdisBuffer);既得到你的Buffer再通过NdisQueryBuffer返回的第二个参数既为你的Buffer所在的NdisAllocateMemory所分配的Memory的虚地址,你就可以释放了,packet知道怎么释放了吧! 我的qq:19312369再联系 |
|
11楼#
发布于:2003-05-10 22:23
唉,真就没有高手肯说点实质的东西么?
|
|
12楼#
发布于:2003-05-10 11:20
Status=NdisAllocateMemory(&pArpContent,2000,0,HighestAcceptableMax); 高见,那么我indicate包pending以后应该如何释放我分配的packet,buffer和memory呢?恳请给段代码参考,成功后我会将源码发给你一份。email已经贴上。 |
|
13楼#
发布于:2003-05-10 03:10
对了我的email ddhliu_1997@yahoo.com.cn谢谢
|
|
14楼#
发布于:2003-05-10 03:09
Status=NdisAllocateMemory(&pArpContent,2000,0,HighestAcceptableMax);
你是在MPSend中定义并分配pArpContent 而在MPReturnPacket中NdisFreeMemory(pPacketContent,2000,0); 释放pPacketContent这怎么回事,即使你释放pArpContent,他又不是全局变量,这又如何处理 |
|
15楼#
发布于:2003-05-09 23:01
我只能建议你马上安装SoftICE,然后明确找出出现蓝屏的代码行,
而不是这样毫无头绪地乱判断。 |
|
16楼#
发布于:2003-05-09 21:43
大虾 胡大侠曾经说过内存谁分配谁释放,我前面申请了这段内存,现在这里释放,有什么不对么?我认为问题不是出在这里的。 |
|
17楼#
发布于:2003-05-09 15:39
学习,有些收获!
|
|
|
18楼#
发布于:2003-05-09 13:17
大虾
请问 NdisFreeMemory(pPacketContent,2000,0);其释放的pPacketContent非全局描述符,系统如何知道你分配的虚地址在哪里? 能不能将这部分源码发点给我,我已被蓝屏高的没辙了。非常感谢 |
|
19楼#
发布于:2003-05-09 09:53
看passthru的例子吧,他的处理方式非常科学,我也是撞头才总结出来的,但我编的程序在实验室的机了呢,无法给你贴出,有时间我去找找。 多谢!一定不要忘记我阿!我这边也在不断努力中,反正有ghost,不怕系统崩,呵呵。 |
|
上一页
下一页