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

40分,请教MpSend中接收包的内存释放问题

楼主#
更多 发布于:2003-04-27 14:56
目的:当本机发出一个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\"));
}
}

问题:代码安装后兰屏
我认为就是在内存释放的问题上,
但是才识不足,看不出错在哪里,
希望斑竹,各位大侠能帮帮我。

最新喜欢:

peralperal
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-06 21:20
对了,又看了一遍你的帖子,跟我的问题好像,区别只是我要在接受到数据包是发送,而你是在发送数据包时接收。差不多啦差不多 :D

我觉得你的问题还是在MPReturnPacket里面。也许MPReturnPacket被调用时,实际参数的数据包并不是你自己的驱动构建的,而是来自底层(mimiport)。所以你应该加一个判断

if(NdisGetPoolFromPacket(Packet)==自己的poor)
{
  // 是自己构建的包,想怎么做就怎么做吧
}

先说这么多,即使不是这个原因导致死机,我想用SoftICE也应该能调出来,good luck
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-06 21:15
其实你的驱动,如果一安装就会死机,这种情况用SoftICE很好调试的啊。设几个断点就全搞定了。

除非蓝屏在很偶然的情况,那就难搞了,我现在就是这样,惨~
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-06 20:26
就是说拦截Arp请求,然后自己构造一个回答?
俺用DPC做的,在DPCROUTE里面调用NdisMEthIndicateReceive和NdisMEthIndicateReceiveComplete,自己申请内存和释放内存,目前为止跑得都很好,没什么问题阿。


能具体讲讲么?DPC
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地下室#
发布于:2003-05-06 18:14
就是说拦截Arp请求,然后自己构造一个回答?
俺用DPC做的,在DPCROUTE里面调用NdisMEthIndicateReceive和NdisMEthIndicateReceiveComplete,自己申请内存和释放内存,目前为止跑得都很好,没什么问题阿。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-06 17:57
详细讲一下你的处理过程???

都修改了那些地方?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-06 16:39
高手哪里去了?
这几天我也在不断努力,谁能有效的帮帮我阿?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-01 15:08
问题还没有解决阿,哪位大侠能作出正确回答,分不是问题。
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-04-30 17:16
还是兰屏。NDIS.sys出错。您能否给我写一个在MPsend中用ndisindicatereceivepacket收包,然后释放内存的代码,让我有个
参考?如果不想贴出来发到我邮箱可以了。

[编辑 -  4/30/03 by  ruberman]
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-04-30 17:00
你现在在什么地方出错?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-04-30 16:52
收到,多谢指导。虽然问题没有解决,但是把分先给你,分不是问题。

[编辑 -  4/30/03 by  ruberman]
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-04-30 16:48
NdisChainBufferAtFront以后不用自己设置MyArpPacket->Private.Head->Next=NULL;
MyArpPacket->Private.Tail=NULL;
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-04-30 16:45


[编辑 -  4/30/03 by  mikeluo]
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-04-30 16:41
你给我一个国内的邮箱可否?这样更快捷一些。
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
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要不要设置?我曾经看到过有人没有设置就直接发出的。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-04-30 16:23
还没有收到你的信,主要就是设置那些oob的数据,因为那些数据是用来管理的。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-04-30 11:09
不止是处理ARP包那么简单。还要禁止它发出,然后通知系统一个响应。以后还要处理接受到的IP包,转发。

COMMENTs看了,还是不太清楚,您能不能给我一段相应的代码,那样学习更快捷一些。
我已经回信,请收阅。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-04-29 16:56
如果你只是想处理arp包,可以在应用程序里面修改arp表来实现这个目标吧?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-04-29 16:53
你看一下他的comments,写了很多要注意的东西。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-04-29 14:54
NdisMIndicateReceivePacketpacket的说明我看了,没有特别的要求吧.我回去再看看,你能先给我讲讲应该有什么要求么?

你说的释放顺序是这样么?
NdisFreeMemory,然后NdisFreeBuffer,最后Ndisfreepacket

上一页
游客

返回顶部