`
yexin218
  • 浏览: 973070 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Ndis过滤驱动:拷贝NetBufferList数据

阅读更多

今天我们来看看如何拷贝NBL中的数据。有时候需要更改数据包中的某些数据,就需要用到此功能(能直接在原来的nBL上更改,然后发送吗?)。

 

  1. 新建一个NBL作为你自己要存放拷贝数据的结构:
     pCopyNBL = allocateNetBuffAndNetBufferList(pFilter, dataLength);//Defined by self
     这个其实是一个自定义的函数,用来分配一个空的NBL.具体代码见后面~
  2. 这里考虑有很多个NBL,而且每个NB中包含多个MDL.所以拿到原始NBL的第一个NB
    pCurrentNB = NET_BUFFER_LIST_FIRST_NB(pCurrentNBL);//The first NB
     再得到第一个NB的第一个MDL:
    pMDL = NET_BUFFER_FIRST_MDL(pCurrentNB);
     最后得到MDL中有用数据:包括分析offset,以及dataLength,起始地址等:
    mdlOffset = NET_BUFFER_DATA_OFFSET(pCurrentNB);//I am not sure
    ...
     NdisQueryMdl( pMDL,(PVOID *)&pData,&dataBufferLength,NormalPagePriority);
                    if(pData == NULL)
                    {
                        DEBUGP(DL_TEST,("pData is NULL ---Fail \n"));
                        break;
                    }
     
  3. 同理我们得到我们自定义NBL中的MDL(只有一个),同时拿到起始地址:
    pCopyMDL  =  NET_BUFFER_FIRST_MDL(NET_BUFFER_LIST_FIRST_NB(pCopyNBL));
    ....
    NdisQueryMdl(pCopyMDL,(PVOID *)&pNewBuffer, &newBufferLength,NormalPagePriority);
                if(pNewBuffer == NULL)
                {
                    DEBUGP(DL_TEST,("pNewBuffer is NULL ---Fail \n"));
                    break;
                }
     
  4. 然后把pData的数据拷贝到pNewBuffer中,这里注意拷贝的长度:
    bytesToCopy = dataBufferLength - mdlOffset;
                    if(bytesToCopy > newBufferLength)
                    {
                        bytesToCopy = newBufferLength;
                    }
                    NdisMoveMemory((pNewBuffer + offset),(pData + mdlOffset), bytesToCopy);//copy data
                    newBufferLength -= bytesToCopy;
                    offset += bytesToCopy;
                    mdlOffset = 0;//CurrentMdlOffset is used only for the first Mdl processed. For the remaining Mdls, it is 0.
     这里mdlOffset=0,是指以后以后连续的MDL中没有unused 数据。就是整个MDL中的数据都是我们要的。
  5. 然后循环这个NB中所有的MDL.每个NB拷贝完之后,设置NB的datalength:
            NET_BUFFER_DATA_LENGTH(NET_BUFFER_LIST_FIRST_NB(pCopyNBL)) = dataLength;
            pCopyNBL->SourceHandle = pCurrentNBL->SourceHandle;
    
     
  6. 循环所有的NBL,把每个NBL串起来:
    if(pNewNetBufferLists == NULL)
            {
                pNewNetBufferLists = pCopyNBLTail = pCopyNBL;
            }
            else
            {
                NET_BUFFER_LIST_NEXT_NBL(pCopyNBLTail) = pCopyNBL;
            }
    
            pCurrentNBL = NET_BUFFER_LIST_NEXT_NBL(pCurrentNBL);
    
     
  7. 结束拷贝~附上NBL分配函数代码:
    PNET_BUFFER_LIST allocateNetBuffAndNetBufferList(
        IN  PMS_FILTER pFilter,
        IN  ULONG BufferSize
    )
    {
        PMDL  pMDL =  NULL;
        PUCHAR pMDLAddress =NULL;
        PNET_BUFFER_LIST pNetBufferList = NULL;
        DEBUGP(DL_TEST,("==============>allocateNetBuffAndNetBufferList\n"));
        pMDLAddress = (PUCHAR)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle,BufferSize,FILTER_ALLOC_TAG, LowPoolPriority);
        NdisZeroMemory(pMDLAddress, BufferSize);
        do
        {
            pMDL = NdisAllocateMdl(pFilter->FilterHandle, pMDLAddress, BufferSize);
            if(pMDL == NULL)
            {
                DEBUGP(DL_TEST,("PMDL Fail....\n"));
                break;
            }
    
            pNetBufferList = NdisAllocateNetBufferAndNetBufferList(
                                 pFilter->SendNetBufferListPool,
                                 sizeof(FILTER_SEND_NETBUFLIST_RSVD), //Request control offset delta
                                 0,           // back fill size
                                 pMDL,
                                 0,          // Data offset
                                 BufferSize);
            if(pNetBufferList == NULL)
            {
                NdisFreeMdl(pMDL);
                break;
            }
        }
        while(FALSE);
        DEBUGP(DL_TEST,("<==============allocateNetBuffAndNetBufferList\n"));
        return pNetBufferList;
    }
     需要注意分配MDL,一定要使用NdisAllocateMemoryWithTagPriority分配一个空间地址~
  8. 最后是检查是否拷贝正确,参考了这里的代码(打印部分自行添加~):

    基于NDIS Filter 抓包:

  9. 效果图:

     浏览百度的:

     浏览Javaeye的:

     
  10. 还有一些疑问:除了程序编译的时候还有三个Warning.就是好像我只考虑了每个NBL中只有一个NB的情况~可能还需要更多的测试~【今天我把NB也循环了,就是考虑一个NBL多个NB的情况,可是测试中发现一般都自由一个NB】

参考: http://www.osronline.com/showthread.cfm?link=180159

 

  • 大小: 27.7 KB
  • 大小: 31.9 KB
  • 大小: 21.8 KB
2
1
分享到:
评论
2 楼 yexin218 2010-04-20  
凌绿寒绮 写道
在管理博客

呵呵,偶尔管理下啊 
1 楼 凌绿寒绮 2010-04-20  
在管理博客

相关推荐

    NDIS中间层 NDIS6过滤驱动开发笔记

    在详细探讨NDIS中间层和过滤驱动开发的过程中,首先需要明确NDIS(Network Driver Interface Specification)网络驱动接口规范的角色与作用。NDIS定义了一组标准接口,它允许开发者能够编写能够在Windows平台上运行...

    基于NDIS中间层驱动的网络数据过滤程序开发概括

    基于NDIS中间层驱动的网络数据过滤程序开发概括 NDIS中间层驱动程序是基于DDK中passthru框架扩展的,用于网络数据过滤和拦截。NDIS中间层驱动程序可以拦截和过滤网络数据,使得网络数据的传输更加安全。 NDIS中间...

    Filter驱动开发笔记

    Ndis过滤驱动:拷贝NetBufferList数据 - **拷贝方法**:使用NdisMCopyFromBusMemory等函数可以从NetBufferList中拷贝数据。 - **注意事项**:确保内存对齐和数据长度正确。 #### 50. Filter驱动:过滤(修改)接受...

    NDIS过滤驱动在广域网络会话劫持防范技术中的应用研究

    NDIS(Network Driver Interface Specification)过滤驱动是Windows操作系统中用于网络数据包处理的关键组件,它为网络通信提供了底层接口。在广域网络会话劫持防范技术中,NDIS过滤驱动扮演着至关重要的角色,因为...

    NDIS 驱动开发 网络驱动 开发指南

    NDIS驱动开发涉及到网络驱动的多个层次,包括协议驱动、过滤驱动和微型端口驱动等。本开发指南将深入探讨NDIS驱动开发,特别是中间层驱动程序(IMD)的开发。 一、NDIS概述 NDIS作为网络驱动程序的基础,定义了上层...

    ndis驱动:无线局域网 NDIS 小端口驱动实现

    ### NDIS小端口驱动实现概述 #### 一、引言 随着无线局域网(Wireless Local Area Network, WLAN)技术的不断发展与成熟,特别是IEEE制定的802.11-1999及802.11b标准的推出,使得WLAN的应用越来越广泛。WLAN的实现...

    NDIS.rar_ndis_site:www.pudn.com

    5. **NDIS数据结构**:讲解NDIS中使用的数据结构,如NDIS_PACKET、NDIS_OID请求和应答等,以及如何操作这些数据结构。 6. **NDIS事件和通知**:NDIS如何通过事件和通知机制来协调驱动程序间的操作,如状态指示、 ...

    ndis windows网络驱动程序的范例

    5. NDIS过滤驱动:除了基本的MINIPORT和PROTOCOL驱动,NDIS还支持过滤驱动,它们可以插入到驱动堆栈中,对数据包进行拦截、修改或转发,以实现额外的功能,如网络安全、性能优化等。 6. NDIS版本:随着Windows操作...

    NDIS协议驱动程序源代码

    NDIS驱动程序是网络通信的关键组成部分,它们处理网络数据的接收和发送,以及硬件的管理和配置。 在NDIS协议驱动程序源代码中,通常包含以下几个主要部分: 1. **初始化和卸载**:驱动程序的初始化函数(如...

    NDIS.rar_doc_ndis_ndis 过滤端口

    描述中提到的"NDIS过滤驱动 小端口驱动 参考文章,DOC类型",暗示了我们有两个文档资料,分别是"NDISWDM驱动学习笔记.doc"和"NDIS驱动框架探究.doc",这两份文档可能是深入解析NDIS驱动技术,特别是小端口驱动和过滤...

    NDIS驱动,捕获过滤数据包,防火墙

    NDIS驱动,捕获过滤数据包,防火墙 好东西,分享

    NDIS协议驱动程序源代码.zip

    2. **过滤驱动**:位于微型端口驱动之上,可以对数据包进行拦截、修改或者转发。它们用于实现网络监控、安全策略和其他高级功能。 3. **协议驱动**:位于NDIS层的顶端,处理上层协议(如TCP/IP)与NDIS之间的交互。...

    NDIS协议驱动开发

    1. **NDIS数据结构**:驱动开发中,理解NDIS数据结构至关重要,如NDIS_PACKET、NDIS_BUFFER、NDIS_MINIPORT_ADAPTER_CONTEXT等,这些都是驱动程序处理网络数据和状态的核心元素。 2. **NDIS接口函数**:每个NDIS...

    VISUAL C++ VC制作防火墙软件 源代码_WDM,NDIS过滤驱动.zip

    VC开发防火墙软件 源代码_WDM,NDIS过滤驱动.zip

    移远4G/5G模块基于windows USB NDIS拨号驱动

    这个技术允许用户通过计算机的USB接口与4G/5G模块连接,然后利用NDIS驱动程序实现网络数据传输,从而达到在Windows系统上拨号上网的目的。 描述中的“QUECTEL模块基于windows USB NDIS驱动,可实现基于windows系统...

    NDIS网络数据过滤驱动

    实现了网络数据流的过滤,嗯,内部也实现了主动发送数据包的函数..... 写不下去了 本来这个项目是之前做的一个系统安全项目&gt;的一小模块,优化版就不发了 这是初始版.... 很适合学习用(想想之前自己查资料的时候一个...

    NDIS协议驱动开发.pdf

    NDIS 协议驱动负责处理网络数据的收发和处理,NDIS 中间层驱动提供数据过滤功能,NDIS 微端口驱动是网卡厂家提供的网卡驱动。 开发 NDIS 协议驱动需要了解 Windows 网络 NDIS 接口模型和 NDIS 框架的相关知识。NDIS...

    一个NDIS的驱动小程序,适合初学操作系统的人

    中间驱动位于微型端口驱动和协议驱动之间,可以用来实现特定的功能,如过滤数据包、性能优化或安全功能。中间驱动可以接收来自上层协议驱动的数据包,处理后转发到下层微型端口驱动,或者直接发送到网络。 对于初学...

    NDIS协议驱动程序设计

    ### NDIS协议驱动程序设计 #### 一、预备知识 ##### 计算机网络技术基础 计算机网络技术是计算机技术和通信技术相结合的产物,它使分布在不同地理位置的计算机系统能够通过特定的通信设备和线路相互连接,从而...

Global site tag (gtag.js) - Google Analytics