stevehe
驱动牛犊
驱动牛犊
  • 注册日期2002-12-15
  • 最后登录2011-02-16
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望24点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
阅读:1729回复:6

修改PassThru的问题

楼主#
更多 发布于:2004-11-25 11:43
PassThru 中如下两段代码:
NDIS_STATUS
PtReceive(
IN  NDIS_HANDLE ProtocolBindingContext,
IN  NDIS_HANDLE MacReceiveContext,
IN  PVOID HeaderBuffer,
IN  UINT HeaderBufferSize,
IN  PVOID LookAheadBuffer,
IN  UINT LookAheadBufferSize,
IN  UINT PacketSize
)

{
...................以上省略

pAdapt->IndicateRcvComplete = TRUE;
switch(pAdapt->Medium)
{
 case NdisMedium802_3:
NdisMEthIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer,
HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize,
PacketSize);
break;
          
            .................省略
      
} while(FALSE);

return Status;
}


VOID
PtReceiveComplete(
IN NDIS_HANDLE ProtocolBindingContext
)
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;

........................

if((pAdapt->MiniportHandle != NULL) && pAdapt->IndicateRcvComplete)
{
switch(pAdapt->Medium)
{
 case NdisMedium802_3:
NdisMEthIndicateReceiveComplete(pAdapt->MiniportHandle); break;
..................................

}
}
pAdapt->IndicateRcvComplete = FALSE;
}


我把ptReceive 该成以下形式:



NDIS_STATUS
PtReceive(
IN  NDIS_HANDLE ProtocolBindingContext,
IN  NDIS_HANDLE MacReceiveContext,
IN  PVOID HeaderBuffer,
IN  UINT HeaderBufferSize,
IN  PVOID LookAheadBuffer,
IN  UINT LookAheadBufferSize,
IN  UINT PacketSize
)

{
PVOID HeaderBuffer1,LookAheadBuffer;

..............
...................以上省略
NdisMoveMemory(HeaderBuffer1,HeaderBuffer,HeaderBufferSize);
NdisMoveMemory(LookAheadBuffer1,LookAheadBuffer,LookAheadBufferSize);
pAdapt->IndicateRcvComplete = TRUE;
switch(pAdapt->Medium)
{
 case NdisMedium802_3:
NdisMEthIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer1,
HeaderBufferSize,
LookAheadBuffer1,
LookAheadBufferSize,
PacketSize);
break;
          
            .................省略
      
} while(FALSE);

return Status;
}

请问:LookAheadBuffer1和HeaderBuffer1在哪里释放比较合适?
是调用完NdisMEthIndicateReceive立即释放还是在PtReceiveComplete中释放,谢谢大虾们指点。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-26 12:16
好象上在PtReceiveComplete中释放,好久没有弄NDIS了,记的不是很清楚
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
ririri
驱动牛犊
驱动牛犊
  • 注册日期2004-06-02
  • 最后登录2005-07-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-20 23:13
根本就不需要释放
 
记住:“谁申请,谁释放”
这两个缓冲区:HeaderBuffer:一般是MAC帧头部,以太网下是14
这时候HeaderBufferSize应该是14
 
LookAheadBuffer是IP包的开始部分,或者是整个IP包

如果PacketSize == LookAheadBufferSize,说明LookAheadBuffer装的就是一个完整的IP包(包括IP包的头部)
如果PacketSize > LookAheadBufferSize说明这个前视缓冲区只有部分Ip包,系统将要激发MPTransData()例程,在该例程中使用系统调用NdisTranstData()获取没有提交完整的部分

因为HeaderBuffer和LookAheadBuffer都是网卡提交上来的缓冲区
你不必释放它,网卡会自己处理的
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-22 16:27
我想这部分是由内核来管理的,不必自己释放
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
shortlight
驱动牛犊
驱动牛犊
  • 注册日期2003-11-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望81点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-23 09:34
楼上几位,你们都弄错了吧?人家没问HeaderBuffer和LookAheadBuffer什么时候释放,人家问的是LookAheadBuffer1和HeaderBuffer1在哪里释放比较合适.你们不看清楚问题就胡乱回答,这不是误人子弟吗?
我觉得在哪里释放要看LookAheadBuffer1和HeaderBuffer1中的内容在什么时候使用完毕.只要使用完毕就可以释放了
zhaojiejie
驱动牛犊
驱动牛犊
  • 注册日期2007-01-09
  • 最后登录2009-06-06
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-02-13 09:47
               
liuyan1
驱动老牛
驱动老牛
  • 注册日期2001-08-27
  • 最后登录2023-04-18
  • 粉丝0
  • 关注0
  • 积分1031分
  • 威望477点
  • 贡献值0点
  • 好评度187点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-05-28 14:28
我倒,这个帖子有意思。强!!!
楼上的客,楼下的客,听我老坎说明白,要苛屎有草纸,不要扯我的麦席子,要苛尿有夜壶,不要在床上划地图。
游客

返回顶部