ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:2993回复: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
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-28 09:28
没有人会?汗......
HU斑竹在哪里?mikeluo大侠收到我的信了么?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-28 09:34
send如果是pending,应该在sendcomplete里面进行释放packet和buffer的工作。
释放的时候要按照缓冲区-》buffer -》packet的顺序来进行,首先要把buffer从packet上unchain,NdisUnchainBufferAtBack或者NdisUnchainBufferAtFront,然后NdisQueryBuffer得到你这个buffer指向的memory的地址,然后NdisFreeMemory,然后NdisFreeBuffer,最后Ndisfreepacket
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-04-28 09:39
不过我不是在MPSend中调用NdisSend,而是调用了NdisMIndicateReceivePacket,这样返回Pending的时候还是要调用
sendcomplete么?

我没有发送包,而是接收了一个包.
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-28 10:15
 那就是returnpacket了
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-28 12:35
我知道啊,代码都贴上面了.就不知有什么问题.
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-04-28 13:21
你用的passthru的例子???

你在returnpacket里面没有释放内存 buffer就释放packet了?

还有,你NdisMIndicateReceivePacketpacket的时候怎么设置的OOB数据?

学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
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是什么呢?我经常看到这个说法,但是不知道有什么用处.
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-04-28 15:36
 
释放的时候要按照缓冲区-》buffer -》packet的顺序来进行,首先要把buffer从packet上unchain,NdisUnchainBufferAtBack或者NdisUnchainBufferAtFront,然后NdisQueryBuffer得到你这个buffer指向的memory的地址,然后NdisFreeMemory,然后NdisFreeBuffer,最后Ndisfreepacket
 


按照这个顺序来释放,
OOB数据是管理用的,

你看一下ddk里面NdisMIndicateReceivePacketpacket的说明,按照他的说明设置oob数据。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-04-29 14:54
NdisMIndicateReceivePacketpacket的说明我看了,没有特别的要求吧.我回去再看看,你能先给我讲讲应该有什么要求么?

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

mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-04-29 16:53
你看一下他的comments,写了很多要注意的东西。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-04-29 16:56
如果你只是想处理arp包,可以在应用程序里面修改arp表来实现这个目标吧?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-04-30 11:09
不止是处理ARP包那么简单。还要禁止它发出,然后通知系统一个响应。以后还要处理接受到的IP包,转发。

COMMENTs看了,还是不太清楚,您能不能给我一段相应的代码,那样学习更快捷一些。
我已经回信,请收阅。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-04-30 16:23
还没有收到你的信,主要就是设置那些oob的数据,因为那些数据是用来管理的。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
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要不要设置?我曾经看到过有人没有设置就直接发出的。
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-04-30 16:41
你给我一个国内的邮箱可否?这样更快捷一些。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-04-30 16:45


[编辑 -  4/30/03 by  mikeluo]
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-04-30 16:48
NdisChainBufferAtFront以后不用自己设置MyArpPacket->Private.Head->Next=NULL;
MyArpPacket->Private.Tail=NULL;
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
ruberman
驱动牛犊
驱动牛犊
  • 注册日期2003-04-08
  • 最后登录2011-04-06
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望15点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
18楼#
发布于: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分
19楼#
发布于:2003-04-30 17:00
你现在在什么地方出错?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
上一页
游客

返回顶部