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

拷贝MDL中数据到缓冲区

阅读更多
//Copy the packet into a buffer
  while (CurrentMdl && DataLength > 0)
    {
      NdisQueryMdl(CurrentMdl, &pSrc, &CurrLength, NormalPagePriority);
      if (pSrc == NULL)
        {
	  bytesCopied = 0;
	  break;
        }
        
      //
      //  Current buffer length is greater than the offset to the buffer
      //
      
      if (CurrLength > Offset)
        {
	  pSrc += Offset;
	  CurrLength -= Offset;
	  
	  if (CurrLength > DataLength)
            {
	      CurrLength = DataLength;
            }
	  DataLength -= CurrLength;
	  NdisMoveMemory(pDest, pSrc, CurrLength);
	  bytesCopied += CurrLength;
            
	  pDest += CurrLength;
	  Offset = 0;
        }
      else
        {
	  Offset -= CurrLength;
        }
      NdisGetNextMdl(CurrentMdl, &CurrentMdl);
      
    }

 

这段代码就是拷贝数据到缓冲区。其中CurrMDL,offset和dataLength来自Net_Buffer:

pNetBuffer = NET_BUFFER_LIST_FIRST_NB(pNetBufferList);
  
  //
  // Try to get the 1p data from OOB data
  //
  if(NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo) != 0)
    {
      Ndis8021QInfo.Value = NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo);
      UserPriority  = (UCHAR)Ndis8021QInfo.TagHeader.UserPriority;
    }     
  
  //copy the packet into a buffer
  pDest = packetBuffer;
  
  CurrentMdl = pNetBuffer->MdlChain;
  Offset = pNetBuffer->DataOffset;
  DataLength = pNetBuffer->DataLength;

 其中NET_BUFFER_LIST_FIRST_NB返回的是第一个Net_Buffer.  CurrentMDL指向MDL的list.现在来看看如何拷贝数据的。其中NdisQueryMdl返回MDL虚拟地址的基地址Psrc,和对应的缓冲区长度CurrLength


 
 1、如果CurrLenght > offset,那么把Psrc+offset,指向used data.同样,CurrLength-offset,表示当前的MDL中有用的数据长度。然后执行NdisMoveMemory的拷贝操作.紧接着把,dataLength-CurrLength,因为已经拷贝好了一部分,然后再把offset置零,因为现在指针已经到了可用数据区。

2、当再次得到下一个MDL的Psrc,和CurrLength时,因为offset已经=0,所以CurrLength肯定大于0,所以即使执行PSrc+=offset, CurrLength-=offset.最后拷贝整个长度的空间(以图为例,不都是这样!!),dataLength-CurrLength.

3、最后第三次得到pSrc,和CurrLength,但是CurrLength,已经大于dataLength,所以只拷贝dataLength的长度数据。就完成了所有数据拷贝。

4、但是如果第一次的时候offset>CurrLength,那么就是比如图中第一个MDL为unused data区,执行offset-=CurrLength.如下图:



 

 这样之后又回到了前面所说的CurrLength>offset了。

这就是拷贝数据到缓冲区的过程。不知有何疏漏,或者错误,见谅~
 

  • 大小: 21.2 KB
  • 大小: 11.1 KB
分享到:
评论

相关推荐

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

    拷贝MDL中数据到缓冲区,以及从MDL中读取数据包,都需要遵守特定的内存管理规则以避免内存损坏。 高级话题中,研究异步I/O、完成端口以及驱动程序和应用层之间的异步通信也是关键内容。这涉及到深入理解Windows系统...

    Filter驱动开发笔记

    - **拷贝方法**:可以通过NdisMCopyFromBusMemory等函数将MDL中的数据复制到连续的缓冲区中。 #### 13. MDL中数据读取 - **读取方法**:使用NdisMReadPortUchar等函数可以从MDL中读取数据。 - **注意事项**:需要...

    MDL_Driver

    MDL描述了数据缓冲区在物理内存中的映射。 3. 获取物理地址:驱动程序可以使用MmGetMdlPhysicalPage或MmGetMdlByteOffset函数从MDL中获取物理地址信息。 4. 执行I/O操作:驱动程序使用MDL提供的信息与硬件设备进行...

    MDL_Test.rar_mdl

    MDL是Windows内核模式驱动程序用来描述I/O缓冲区的一种数据结构。当驱动程序处理I/O请求时,它可能需要映射物理内存到虚拟内存,以便处理器能够访问这些数据。MDL提供了一种方式来跟踪这些映射,确保数据在DMA...

    MDL.rar_.mdl_mdl

    接着,将这些数据转化为GPU可理解的格式,如顶点缓冲区和索引缓冲区。同时,还要加载相关的纹理和材质信息,应用到模型表面。在渲染时,根据模型的动画状态更新顶点位置,然后提交到GPU进行绘制。 MDL模型加载器的...

    13.信源数估计MDL算法MATLAB程序_信源数估计_MDL信源估计_mdl_MDLmatlab_

    MDL是统计学和信息论中的一种准则,用于模型选择和数据压缩。在这一领域,MDL原理主张选择能够以最短编码长度描述数据的模型,从而达到最优的预测或解释能力。 描述中的“经典信源数估计算法,MDL算法,可直接下载...

    lis3mdl参考手册.pdf

    在读取磁力计数据时,BDU特性可以确保读取到的是一个完整的数据集合,而不是处于更新过程中的部分数据。快速读取(FAST_READ)选项则是在I2C通信中提高数据读取效率的方法。 要正确读取输出数据,需要遵循一定的...

    MDL文件读取器

    MDL文件格式包含了模型的几何信息、纹理贴图、动画帧以及骨骼绑定等数据,使得游戏中的角色、武器和其他物体能够生动地展示出来。 在游戏开发和编程领域,尤其是使用OpenGL进行图形渲染时,理解并能够读取MDL文件是...

    MDL算法,mdp算法,matlab

    "secondxrt"没有明确的IT术语含义,可能是一个特定项目的名称或者是自定义的函数或者工具,它可能在MDL源数估计的过程中起到了某种辅助作用,例如数据处理或结果展示。 在提供的文件名"13.信源数估计MDL算法MATLAB...

    LIS2MDL驱动文件

    在本文中,我们将深入探讨如何使用STM32的硬件IIC(Inter-Integrated Circuit)接口,基于HAL(Hardware Abstraction Layer)库来开发LIS2MDL磁力计的驱动程序。LIS2MDL是一款由意法半导体(STMicroelectronics)...

    13_MDL信源数估计_MDL算法_信源估计_未知信源_信源数估计

    在信源估计问题中,MDL方法被用来确定数据来自多少个独立的信源。假设我们有一系列观测数据,这些数据可能来自一个或多个未知的离散信源。MDL的目标是找出能以最少描述长度解释这些数据的信源数目。 MDL算法通常...

    MDL MDX转换软件

    MDL MDX转换软件能够确保转换过程中的几何数据、纹理贴图、动画序列等关键元素得到准确无误地保留和适配。 MDL文件格式通常包含模型的顶点信息、纹理坐标、多边形索引、骨骼绑定和动画数据。MDX则在MDL的基础上增加...

    信源数估计MDL算法MATLAB程序.rar

    2. **构建模型**:MDL算法涉及到多种可能的模型,例如独立同分布模型、线性模型、非线性模型等。对于信源数估计,可能的模型可能是多个高斯分布或者泊松分布的混合。 3. **计算模型复杂度**:MDL的关键在于计算每个...

    lis3mdl.pdf

    LIS3MDL是一款超低功耗、高性能的三轴磁力计,其数据手册详细介绍了该产品的功能特性、电气参数、封装信息以及应用领域等方面的知识点。 首先,LIS3MDL支持用户可选的全量程范围,包括±4/±8/±12/±16高斯,这...

    MDL模型浏览器

    MDL模型是Valve公司开发的一种3D模型格式,广泛应用于诸如《半条命》、《反恐精英》和《求生之路》等知名游戏中。了解MDL模型浏览器及其相关知识点对于游戏开发人员来说至关重要。 首先,我们来详细解释一下MDL模型...

    CS,MDL模型查看工具

    MDL,全称Model Data Language,是Valve公司开发的一种模型文件格式,用于存储游戏中的三维模型数据,包括角色、武器、环境物体等。在CS中,MDL模型是构成游戏视觉元素的核心部分,它们决定了游戏内物体的外观和动画...

    LwConvert安装包,可用于stk中mdl文件的转化

    总的来说,LwConvert是解决STK中mdl文件导入问题的关键工具,通过它可以实现数据格式的兼容,使得用户能够更灵活地在不同系统之间交换和使用模型数据。正确理解和使用这样的专业工具,对于提升工作效率和保证项目...

    mdl format

    MDL格式的解析过程涉及读取文件中的指令并将其转换为引擎可理解的数据结构。引擎会根据这些数据在运行时动态构建和渲染模型。 在提供的压缩包中,`Mdl.exe`可能是一个用于处理MDL文件的工具,如模型查看器或编译器...

    Bentley 一步步学习MDL_示例

    3. **HelloWorld.h**:另一个可能包含MDL相关声明的头文件,可能包括自定义的数据结构、宏定义或常量。 4. **HelloWorld.mke**:这是MicroStation的Makefile,用于编译和链接MDL程序。它包含了编译设置、依赖项和...

    13.信源数估计MDL算法MATLAB程序.rar_courageiwf_mdl_sicko2s_信源数估计_源 估计

    在信源数估计中,这意味着我们需要找到一个模型,该模型能够以最少的信息量解释观测到的数据。MDL算法通过平衡模型复杂度和拟合优度来达到这一目标。更具体地说,它考虑了两个组成部分:一个是模型的复杂性,通常由...

Global site tag (gtag.js) - Google Analytics