ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:3529回复:37

50分,谁解决谁拿走,还是那个mpsend中indicate包以后释放内存的问题,嫌少还可以加......

楼主#
更多 发布于:2003-05-06 21:06
在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\"));
}

目前的问题:兰屏,并且中间我做了很多工作,还是不行,受不了啦,哪位大侠能修改一下,让它跑起来,多谢。。。

最新喜欢:

chilichili wyp_janewyp_ja...
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-12 18:51
我已经告诉你了啊,还是returnpacket的问题
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-12 17:24
什么问题?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-12 17:13
问题解决了,多谢各位大侠的帮助!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-12 10:50
mikeluo大侠,请你帮帮我阿,就这个问题我已经拖了两个星期了,超郁闷!!


你用调试工具跟一下看看,你的问题应该是内存错误吧。

windbg调一下?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-12 10:07
mikeluo大侠,请你帮帮我阿,就这个问题我已经拖了两个星期了,超郁闷!!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-12 09:27
mikeluo 大侠

我想问一个问题,对于构造自己包没什么问题,但是对于原来的包怎么处理?那如果将其悬挂,其资源有谁来释放?
 

向系统返回一个success,告诉系统这个packet已经被成功处理了,然后会由分配packet的驱动来释放,
由于packet是从pool里面分配出来的,pool是由驱动来管理的,所以只能是由分配packet的那个驱动来释放。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-12 08:58
我再次恳请哪位大侠曾经做过这方面的,能帮帮我!
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-11 19:15
高见,那么我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再联系
 

我不是向底层发包,而是向上层递交一个包。估计不会是调用到PtSendComplete吧?我在MpReturnPacket中也是按你的方法释放的内存的。
问题仍旧没有解决,恳求高手指点,分不是问题!
qishi1997
驱动牛犊
驱动牛犊
  • 注册日期2003-03-20
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-11 13:05
mikeluo 大侠

我想问一个问题,对于构造自己包没什么问题,但是对于原来的包怎么处理?那如果将其悬挂,其资源有谁来释放?

qishi1997
驱动牛犊
驱动牛犊
  • 注册日期2003-03-20
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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再联系
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-10 22:23
唉,真就没有高手肯说点实质的东西么?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-05-10 11:20
Status=NdisAllocateMemory(&pArpContent,2000,0,HighestAcceptableMax);
你是在MPSend中定义并分配pArpContent
而在MPReturnPacket中NdisFreeMemory(pPacketContent,2000,0);
释放pPacketContent这怎么回事,即使你释放pArpContent,他又不是全局变量,这又如何处理


 

高见,那么我indicate包pending以后应该如何释放我分配的packet,buffer和memory呢?恳请给段代码参考,成功后我会将源码发给你一份。email已经贴上。
qishi1997
驱动牛犊
驱动牛犊
  • 注册日期2003-03-20
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-05-10 03:10
对了我的email ddhliu_1997@yahoo.com.cn谢谢
qishi1997
驱动牛犊
驱动牛犊
  • 注册日期2003-03-20
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-05-10 03:09
Status=NdisAllocateMemory(&pArpContent,2000,0,HighestAcceptableMax);
你是在MPSend中定义并分配pArpContent
而在MPReturnPacket中NdisFreeMemory(pPacketContent,2000,0);
释放pPacketContent这怎么回事,即使你释放pArpContent,他又不是全局变量,这又如何处理


slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-05-09 23:01
我只能建议你马上安装SoftICE,然后明确找出出现蓝屏的代码行,
而不是这样毫无头绪地乱判断。
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-05-09 21:43
大虾
请问 NdisFreeMemory(pPacketContent,2000,0);其释放的pPacketContent非全局描述符,系统如何知道你分配的虚地址在哪里?
能不能将这部分源码发点给我,我已被蓝屏高的没辙了。非常感谢

胡大侠曾经说过内存谁分配谁释放,我前面申请了这段内存,现在这里释放,有什么不对么?我认为问题不是出在这里的。
shrimp
驱动牛犊
驱动牛犊
  • 注册日期2003-04-30
  • 最后登录2003-08-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-05-09 15:39
学习,有些收获!
不要拒绝我... 哈!哈! 给分!
qishi1997
驱动牛犊
驱动牛犊
  • 注册日期2003-03-20
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-05-09 13:17
大虾
请问 NdisFreeMemory(pPacketContent,2000,0);其释放的pPacketContent非全局描述符,系统如何知道你分配的虚地址在哪里?
能不能将这部分源码发点给我,我已被蓝屏高的没辙了。非常感谢
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-05-09 09:53
看passthru的例子吧,他的处理方式非常科学,我也是撞头才总结出来的,但我编的程序在实验室的机了呢,无法给你贴出,有时间我去找找。

多谢!一定不要忘记我阿!我这边也在不断努力中,反正有ghost,不怕系统崩,呵呵。
上一页
游客

返回顶部