Tesiro
驱动牛犊
驱动牛犊
  • 注册日期2008-04-18
  • 最后登录2014-04-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望387点
  • 贡献值1点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:3707回复:10

NDIS 6.0 Filter 克隆缓冲包列表

楼主#
更多 发布于:2012-09-18 18:41
    在发送例程中将所的缓冲表都克隆一份,将克隆后的缓冲表发送到下层驱动中,在发送完成例程中将克隆的缓冲表释放掉将原始的缓冲表完成,但是在window7虚拟机中出现以下情况:ICMP包可以正常收发,但是通过IE访问网页不行,请教一下这是什么情况?,代码如下:
 
VOID FilterSend(NDIS_HANDLE Context, PNET_BUFFER_LIST Buffers, NDIS_PORT_NUMBER Port, ULONG Flags)
{
 NDIS_HANDLE Handle = NULL;
 PNET_BUFFER_LIST Current = Buffers;
 PNET_BUFFER_LIST Next = NULL;
 PMODULE Module = (PMODULE)Context;
 KdPrint(("FilterSend.\n"));
 GetModuleHandle(Module, &Handle);
 do
 {
  PNET_BUFFER_LIST Clone = NULL;
  Next = NET_BUFFER_LIST_NEXT_NBL(Current);
  NET_BUFFER_LIST_NEXT_NBL(Current) = NULL;
  Clone = NdisAllocateCloneNetBufferList(Current, Filter.Buffers, Filter.Buffer, NDIS_CLONE_FLAGS_USE_ORIGINAL_MDLS);
  if (NULL != Clone)
  {
   Clone->ParentNetBufferList = Current;
   /*Clone->Context = Current->Context;*/
   if (NULL != Current->Context)
   {
    Clone->Context = Current->Context;
    KdPrint(("Context is not NULL.\n"));
   }
   NdisFSendNetBufferLists(Handle, Clone, Port, Flags);
  }
  else
  {
   KdPrint(("NdisAllocateCloneNetBufferList.\n"));
  }
  Current = Next;
 }
 while (NULL != Current);
}
 
 
VOID FilterSendComplete(NDIS_HANDLE Context, PNET_BUFFER_LIST Buffers, ULONG Flags)
{
 NDIS_HANDLE Handle = NULL; PNET_BUFFER_LIST Current = Buffers;
 PNET_BUFFER_LIST Next = NULL;
 PMODULE Module = (PMODULE)Context; KdPrint(("FilterSendComplete.\n"));
 GetModuleHandle(Module, &Handle); do
 {
  Next = NET_BUFFER_LIST_NEXT_NBL(Current);
  NET_BUFFER_LIST_NEXT_NBL(Current) = NULL;
  if (NULL != Current->ParentNetBufferList)
  {
   PNET_BUFFER_LIST Original = Current->ParentNetBufferList;
 
   NET_BUFFER_LIST_STATUS(Original) = NET_BUFFER_LIST_STATUS(Current);
   if (NDIS_STATUS_SUCCESS != NET_BUFFER_LIST_STATUS(Original))
   {
    KdPrint(("Send packet failed.\n"));
   }   Current->ParentNetBufferList = NULL;
   NdisFreeCloneNetBufferList(Current, NDIS_CLONE_FLAGS_USE_ORIGINAL_MDLS);
   NdisFSendNetBufferListsComplete(Handle, Original, Flags);
  }
  else
  {
   NdisFSendNetBufferListsComplete(Handle, Current, Flags);
  }  Current = Next;
 }
 while (NULL != Current);
}
Tesiro
驱动牛犊
驱动牛犊
  • 注册日期2008-04-18
  • 最后登录2014-04-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望387点
  • 贡献值1点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2012-09-18 18:43
有谁处理过缓冲表克隆的情况,可以QQ(215989681)联系我。
KindOf
驱动牛犊
驱动牛犊
  • 注册日期2010-01-27
  • 最后登录2012-09-21
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2012-09-18 22:13
兄弟,你是想改发送内容吧?TCP的话,你改内容后,如果数据长度发生了变化了,那就要维护序列号了,相当麻烦。由于ICMP协议不需要维护,所以ICMP就行。
Tesiro
驱动牛犊
驱动牛犊
  • 注册日期2008-04-18
  • 最后登录2014-04-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望387点
  • 贡献值1点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2012-09-18 22:50
我不修改包的内容,我只是想测试将原始缓冲表复制一份,将其发下去,等完成后再将其释放掉,主要是想使用一下NdisAllocateCloneNetBufferList这个函数,在WDK中对于克隆这个操作的说明太少了,看看具体的怎么操作,但是出现这个问题,关于发送的代码就这些了,没有对缓冲表内容进行任何的修改
Tesiro
驱动牛犊
驱动牛犊
  • 注册日期2008-04-18
  • 最后登录2014-04-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望387点
  • 贡献值1点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2012-09-21 17:36
没有人处理过吗,帮忙分析一下是可能的原因也行呀
Tesiro
驱动牛犊
驱动牛犊
  • 注册日期2008-04-18
  • 最后登录2014-04-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望387点
  • 贡献值1点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2012-09-24 04:02
没有人处理过吗,帮忙分析一下是可能的原因也行
zhangfresh
驱动牛犊
驱动牛犊
  • 注册日期2008-07-21
  • 最后登录2023-01-09
  • 粉丝1
  • 关注2
  • 积分94分
  • 威望871点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2012-09-27 17:38
NetBufferList有个成员指针还会指向下一个NetBufferList

你可能只是克隆了第一个NetBufferList,查查二者的一个成员,好像是nextNetBufferList是不是一样。
zhangfresh
驱动牛犊
驱动牛犊
  • 注册日期2008-07-21
  • 最后登录2023-01-09
  • 粉丝1
  • 关注2
  • 积分94分
  • 威望871点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2012-09-27 17:44
不对。刚才没有仔细看你的代码
跟原来的发送方式相比,你把n个NetBufferList分n次下发了,这个好像也没有问题。

在虚拟机里面采用NAT上网的方式,在代外面主机抓包下,看看http请求是否发出
Tesiro
驱动牛犊
驱动牛犊
  • 注册日期2008-04-18
  • 最后登录2014-04-16
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望387点
  • 贡献值1点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2012-09-28 18:57
终于有回复了,我按你说的试一下哈
iihacker
论坛版主
论坛版主
  • 注册日期2010-01-07
  • 最后登录2017-08-16
  • 粉丝5
  • 关注8
  • 积分377分
  • 威望1941点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2012-10-10 13:04
带外信息 ?
NDIS 1群74755180 NDIS 2群182802097 交换机软硬件技术群 187471475 FPGA PCI PCIE 群187471817
classfree
驱动小牛
驱动小牛
  • 注册日期2004-05-23
  • 最后登录2019-01-06
  • 粉丝1
  • 关注1
  • 积分873分
  • 威望276点
  • 贡献值0点
  • 好评度85点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2014-05-13 15:46
我试过自己COPY BNL, 没试过克隆, 不过COPY发送没有问题,克隆应该也没问题才对。
克隆的好像NBL中的DATA和之前的NBL的DATA是同一个缓冲区,如果要修改数据最好用COPY方式。
低调点!
游客

返回顶部