Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6628054
  • 博文数量: 227
  • 博客积分: 10047
  • 博客等级: 上将
  • 技术积分: 6678
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-11 10:33
个人简介

网上的蜘蛛

文章分类

全部博文(227)

文章存档

2010年(19)

2009年(29)

2008年(179)

分类: C/C++

2010-04-20 16:24:31

Filter驱动可以实现简单的防火墙功能。它可以过滤所有接收到的包,然后进行分析处理,最后根据情况决定是否网上传递给Protocol层,最 后给应用程。

我们的原则是不能在接收到的NBL修改数据,因为后面我们还会需要这个完整的包结构,尤其是在调用 NdisFReturnNetBufferLists释放NBL的owership的时候。所以第一步要做的就是拷贝数据:拷贝 NetBufferList数据

拷贝好了数据之后,我们需要做的是:

  1. 首先通知底层驱动,可能是Miniport driver,意思是:Filter已经收到数据,现在归还NBL的所有权,甚至说Miniport Driver可以继续往NBL写数据了。
    C代码
    1. //Call return function to info the underlying driver of releasing ownership of NBL  
    2.        NDIS_SET_RETURN_FLAG(ReturnFlags, NDIS_RETURN_FLAGS_DISPATCH_LEVEL);  
    3.        NdisFReturnNetBufferLists(pFilter->FilterHandle, NetBufferLists, ReturnFlags);  
     
  2. 其次就是把自己刚才拷贝好的数据,根据需要更改数据,比如更改port number等。
  3. 发送已经更改好的NBL
    Cpp代码
    1. NdisFIndicateReceiveNetBufferLists(  
    2.            pFilter->FilterHandle,  
    3.            pCopyNetBufferLists,  
    4.            PortNumber,  
    5.            NumberOfNetBufferLists,  
    6.            ReceiveFlags);  
     
  4. 最后一步,别忘记了,往上发自己创建的NBL,是不能调用NdisFReturnNetBufferLists的,因为这个是Filter创建 的,不是由底层发上来的,如果调用了,就会出错了。所以在FilterReturnNetBufferLists中拦截销毁自己定义的NBL,因为这是 protocol已经把NBL中的数据拷贝好了~
    C代码
    1. if(NetBufferLists->SourceHandle == pFilter->FilterHandle)  
    2.    {  
    3.        //Please just free this NBL  
    4.        ReadNetBuffer(NetBufferLists);//print out something...  
    5.        result = FreeMdlAndNetBufferList(NetBufferLists);  
    6.        if(result == TRUE)  
    7.        {  
    8.            DEBUGP(DL_TEST, ("Free my own NBL ======ReturnNetBufferLists\n"));  
    9.        }  
    10.    }  
    11.    else  
    12.    {  
    13.        NdisFReturnNetBufferLists(pFilter->FilterHandle, NetBufferLists, ReturnFlags);  
    14.    }  
     
  5. 关于释放NBL,这里贴出来:
    C代码
    1. BOOLEAN  
    2. FreeMdlAndNetBufferList  
    3. (  
    4.     PNET_BUFFER_LIST NetBufferLists  
    5. )  
    6. {  
    7.     BOOLEAN result = FALSE;  
    8.     PNET_BUFFER_LIST    CurrNbl,nextNbl= NULL;  
    9.     PNET_BUFFER         Currbuff;  
    10.     PMDL                mdl,pMdl;  
    11.     UINT                BufferLength;  
    12.     PUCHAR              pCopyData = NULL;  
    13. //Free all the NBLs allocate by myself  
    14.     CurrNbl = NetBufferLists;  
    15.     while(CurrNbl)  
    16.     {  
    17.         Currbuff =NET_BUFFER_LIST_FIRST_NB(CurrNbl);  
    18.         while(Currbuff)  
    19.         {  
    20.             pMdl = NET_BUFFER_FIRST_MDL(Currbuff);  
    21.   
    22.             FILTER_ASSERT(pMdl != NULL);  
    23.             NdisQueryMdl(  
    24.                 pMdl,  
    25.                 (PVOID *)&pCopyData,  
    26.                 &BufferLength,  
    27.                 NormalPagePriority);  
    28.             FILTER_ASSERT(pCopyData != NULL);  
    29.             NdisFreeMdl(pMdl);//Free MDL  
    30.             pCopyData = NULL;  
    31.             Currbuff = NET_BUFFER_NEXT_NB(Currbuff);  
    32.         }  
    33.         nextNbl = NET_BUFFER_LIST_NEXT_NBL(CurrNbl);//get Next MBL  
    34.         NdisFreeNetBufferList(CurrNbl);//Free CurrentNBL  
    35.         CurrNbl = nextNbl;  
    36.     }  
    37.     result =  TRUE;  
    38.     return result;  
    39. }  

展示运行结果:

首先是拷贝数据结构:

写道
00000066 10.77174854 ===============>copyNetBufferList
00000067 10.77175713 NDISLWF:
00000068 10.77176189 ==============>allocateNetBuffAndNetBufferList
00000069 10.77177429 NDISLWF:
00000070 10.77178001 <==============allocateNetBuffAndNetBufferList
00000071 10.77178478 NDISLWF:
00000072 10.77179432 newBufferLength is 231, mdlOffset is 18 and Current mdl offset 18
00000073 10.77179909 NDISLWF:
00000074 10.77180481 There are 1 NB in this list---_---
00000075 10.77180958 NDISLWF:
00000076 10.77181625 There are 1 NBLs
00000077 10.77182007 <============copyNetBufferList

 最后是往上发送的:

写道
00000079 10.77193928 ===>ReturnNetBufferLists, NetBufferLists is 890D5540.
00000080 10.77194309 NDISLWF:
00000081 10.77194786 ==============>ReadNetBuffer
00000082 10.77195263 NDISLWF:
00000083 10.77195644 ---Read From NBL: Ethernet Header info:
00000084 10.77198792 NDISLWF:
00000085 10.77200031 00-19-e0-e0-2d-30 -> 00-1d-0f-af-50-b0 Mac地址
00000086 10.77200699 NDISLWF:
00000087 10.77201366 DestIPAddr: 221.5.88.88 -> 192.168.1.105 ip地址
00000088 10.77201843 NDISLWF:
00000089 10.77202225 <==============ReadNetBuffer
00000090 10.77202702 NDISLWF:
00000091 10.77203274 Free my own NBL ======ReturnNetBufferLists销毁数据
阅读(4417) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-05-10 15:55:48

http://www.twtiyi.com/ 灵芝 http://www.tiantianseo.com/ seo http://www.shanghai-seo.org/ 上海seo http://www.seo03.com/ 网站优化 http://www.ajax-cms.org/ 网站建设 http://www.lepro-energy.com/ 逆变器 http://www.jiansuji6.com/ 齿轮减速机 http://www.jiansuji6.com/ 减速机 http://www.shtssj.cn/ 上海KTV招聘 http://www.shtssj.cn/ 上海夜总会招聘 http://www.hobpv.com/ 电动球阀 http://www.hobpv.com/ 气动蝶阀 http://www.mikeycartoon.com/ 卡通服装 http://www.mikeycartoon.com/ 卡通服饰 http://www.mikeycartoon.com/ 订做卡通服装