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

MDL中数据读取

阅读更多
  1. 澄清一个误区:每个Net_BuFFER包含的是一个linked-list的MDL,而不仅仅是一个MDL。所以你要访问Net_BuFFER中数据,你需要在代码中根据需要的offset遍历MDL链表。比如第一个MDL只有14byte有数据(忽略unused data,backfill..),那么它就包含了EtherNet Header,那么下一个可能包含IP Header,再下一个包含TCP header,最后一个(或者多个)包含了TCP数据。至于那些数据是否真的可以完整放在某个MDL中,比如Ethernet Header是否就放在第一个中,而不会跨越第二个MDL,那就取决于NIC容量~
  2. 如果你得到一个MDL,那么你可以遍历的道,Ethernet header->Layer 3 header-->Layer 4 header(if available),假如Net_BuFFER->next(应该是pMDL->next吧) 不是NULL,那么要检查下是什么样的Layer3协议。比如它可能是ARP.
  3. 现在讨论下如何访问会更加简单些,了解下基础知识。

     
  • 假设一个MDL,它描述了事实上是一个连续的内存区域。其包含了一连串的page frame。到第一个page的‘距离’可用MmGetMdlByteOffset()得到。大多数情况你会忽略了这个长度以及MmGetSystemAddressFroMdlSafe()返回的第一Byte的连续内存空间的虚拟地址。内存空间的长度可以由MmGetMdlByteCount()返回。 也可以参考NdisQueryMdl ().
  • 如果是一串的MDL结构,那么这个串的MDL描述的是逻辑上一块连续内存空间,而在物理上是不连续的,它有很多个内存片组成,每个内存片这里用MDL来描述。这也就是说每个MDL都有一个虚拟地址和长度。那么逻辑缓存的总长度就是所有MDL长度的总和。所以对于存放在缓冲区的数据来说,可能恰好存放在某个MDL中,而又可能延伸到其他MDL中,简单说就是存放在多个MDL中。所以可能需要多次读写操作才能处理。
  • 对于NDIS6来说Buffer还支持advance和reteat操作。所以这个看起来连续的、事实上不连续的Buffer,在器某个地方存放着数据。NET_BUFFER可能还需要额外的空间来容纳更多的数据,所以需要有一种方法来辨别‘head’和'tail',用来秒速这块内存空间的起始和结束。结束比较简单:因为NET_BUFFER包含了一个长度(dataLength??)。一般缓冲区的长度都是大于这个长度。大于这个长度的而在缓冲区结束前的数据都不是属于这个packet的。至于开始的地方,一个简单的方法就是逻辑缓冲区起始地址+偏移量offset<=NET_BUFFER_DATA_OFFSET()。而假如你是使用NET_BUFFER_FIRST_MDL()来找到你的起始逻辑空间,那么你就要NET_BUFFER_DATA_OFFSET()bytes才能到data的起始处。 有一种比较有效的方式(尤其是当你有很长的一串MDL)就是使用NET_BUFFER_CURRENT_MDL()得到你正在使用的data所在的第一个MDL,然后跳过这个MDL的dataoffset---NET_BUFFER_CURRENT_MDL_OFFSET(). 这是一种较快的方式就可以访问得到真正有数据的第一个MDL。 所以要得到Ethernet header:
    ethHeader = (PEthHeader) (PUCHAR)MmGetSystemAddressForMdlSafe(NET_BUFFER_CURRENT_MDL()) + NET_BUFFER_CURRENT_MDL_OFFSET() 
     那么如果你Advance(释放used data space)Ethernet_header_size的空间,那么你很容易得到你IP_Header:
    iPHeader = (IPHeader)(PUCHAR)MmGetSystemAddressForMdlSafe(NET_BUFFER_CURRENT_MDL()) + NET_BUFFER_CURRENT_MDL_OFFSET() 
    注意的是,Advance,Retreat操作改变了NET_BUFFER_CURRENT_MDL()的返回值甚至需要的时候改变NET_BUFFER_CURRENT_MDL_OFFSET()的返回值。如图~
  • 以上从http://www.osronline.com/ShowThread.cfm?link=168715  摘取出来!

----------------------------------------------------------------------------------------------------------------------------------

An NBL contains a list of NET_BUFFERs (NB); each NB describes an IP packet.

 

On recv path, one NBL only contains one NB. So nbl->FirstNetBuffer is the packet.

 

Each NB contains a chain of MDLs with the CurrentMdl referring to the MDL where the beginning of the packet resides. So nb->CurrentMdl contains the IP header.

 

The MappedSystemVa field inside the MDL points to the system virtual memory. Advance this pointer by the amount of nb->DataOffset you will be looking at the beginning of the IP header.

 

Yes the NBL referred to the clone on which you had invoked FwpsConstructXxx api function.

 

Here would be an example you can try with the code you posted --

    NET_BUFFER* netBuffer =

       NET_BUFFER_LIST_FIRST_NB(clonedNetBufferList);

    ULONG netBufferOffset = netBuffer->DataOffset;

    MDL* currentMdl = netBuffer->CurrentMdl;

     

    UCHAR* packet = currentMdl->MappedSystemVa + netBufferOffset;

    // beginning of the IP header

 

netBuffer->DataLength is the length of your packet (starting from the "packet" variable).

 

It is possible that one packet consists of multiple MDLs, in which case CurrentMdl->Next is not NULL. If that's the case the ByteCount field of the MDL will be smaller than netBuffer->DataLength and you will need to traverse to the next MDL for more data.

-->http://social.msdn.microsoft.com/forums/en-US/wfp/thread/3ccb32da-c240-477b-bd28-ea584784bd48/

 

附上:MDL struct:

typedef struct _MDL
{
     PMDL Next;
     SHORT Size;
     SHORT MdlFlags;
     PEPROCESS Process;
     PVOID MappedSystemVa;
     PVOID StartVa;
     ULONG ByteCount;
     ULONG ByteOffset;
} MDL, *PMDL;

 

  • 大小: 4.5 KB
分享到:
评论

相关推荐

    MDL文件读取器

    在OpenGL编程中,理解MDL文件的结构并能读取这些数据是创建自定义游戏内容的关键步骤。开发者可以利用MDL文件读取器加载模型,然后通过OpenGL将模型数据转换为适合渲染的顶点数组,结合纹理和骨骼信息,实现在屏幕上...

    lis3mdl参考手册.pdf

    快速读取(FAST_READ)选项则是在I2C通信中提高数据读取效率的方法。 要正确读取输出数据,需要遵循一定的启动序列,并且掌握读取磁力计数据的具体步骤。这包括使用DRDY信号和STATUS_REG寄存器来确定何时进行数据...

    cs mdl 读取direct3d渲染

    首先,MDL.cpp是实现MDL模型解析的源代码文件,它负责读取模型文件并将其转换为适合Direct3D使用的数据结构。这包括解析模型的顶点、法线、纹理坐标,以及骨骼和动画信息。优化的关键在于减少内存分配和数据复制,...

    Filter驱动开发笔记

    MDL中数据读取 - **读取方法**:使用NdisMReadPortUchar等函数可以从MDL中读取数据。 - **注意事项**:需要注意内存对齐和数据长度等问题。 #### 14. IEEE802.1Q中的数据读取 - **IEEE802.1Q**:定义了VLAN标签...

    LIS2MDL驱动文件

    当新的数据可用时,中断服务程序会处理数据读取。HAL库提供了中断相关的回调函数,如HAL_I2C_Master_RxCpltCallback(),在接收完成时调用。 4. **数据解析**:LIS2MDL返回的数据需要进行解析,将其转换为可读的磁...

    磁力计LIS2MDL开发(1)-轮询获取磁力计数据

    ---轮询获取磁力计数据CSDN文字教程:https://blog.csdn.net/qq_24312945/article/details/134961091B站教学视频:https://www.bilibili.com/video/BV1pc41127iw/本文将介绍如何使用 LIS2MDL 传感器来读取数据。...

    MDL算法,mdp算法,matlab

    "tapeerr"可能是指在实现或测试MDL算法过程中遇到的错误,通常这可能与存储或读取数据有关。在MATLAB环境中,这类错误可能涉及到数据的读写操作或者磁带文件(在MATLAB中,"tape"常用于模拟数据记录设备)的使用。 ...

    e2studio开发磁力计LIS2MDL(1)-轮询获取磁力计数据

    本文将介绍如何使用 LIS2MDL 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取磁力数据和温度数据。读取到的数据会被转换为适当的单位并...

    怎样读元器件的直流测试曲线mdl文件文件

    完成文件选择后,ADS会自动读取.mdl文件中的数据,并将其加载到当前的数据集。此时,可以通过数据展示窗口查看导入的直流测试曲线,进行进一步的分析与处理。 ### 如何使用IC-CAP读取.mdl文件 #### 步骤一:打开IC...

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

    信源数估计MDL算法MATLAB程序"很可能包含了实现MDL算法的核心代码,包括数据读取、模型构建、描述长度计算以及模型选择等功能。 通过运行这个MATLAB程序,用户可以对特定的数据集进行信源数估计,理解不同信源数量...

    lis3mdl.pdf

    手册还提供了寄存器映射表,通过这些寄存器,用户可以对器件进行配置和读取测量数据。 综合以上内容,LIS3MDL是一款高度集成、性能可靠的三轴磁力计,适合广泛的应用于消费类电子、工业、汽车等领域中的磁场测量...

    MDL.rar_.mdl_mdl

    这个加载器允许开发者在他们的应用程序中读取和显示MDL格式的3D模型。 MDL格式起源于Quake系列游戏,由id Software开发,用于存储游戏角色、武器和其他游戏对象的三维几何信息、纹理、动画以及物理属性。它包含顶点...

    陀螺仪LSM6DSOW开发(3)-FIFO数据读取与配置

    陀螺仪LSM6DSOW开发(3)----FIFO数据读取与配置 CSDN文字教程:https://blog.csdn.net/qq_24312945/article/details/140758710 B站教学视频:https://www.bilibili.com/video/BV1Dw4m1r712/ 本文档旨在详细介绍如何...

    mdl.zip_.mdl_life_mdl

    它可能包含了读取MDL文件结构的函数,将二进制数据转化为内存中的结构体,以便游戏引擎可以理解和使用。此外,它可能还涉及模型的动画系统,比如如何根据时间轴播放不同帧的动画。 3. **anorms.h**: 这个头文件...

    mdl format

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

    MDL_Test.rar_mdl

    3. **使用MDL进行DMA操作**: DMA允许硬件直接从系统内存读取或写入数据,而无需CPU干预。驱动程序必须正确设置MDL以供DMA控制器使用。 4. **MDL的释放与清理**: 完成I/O操作后,驱动程序应使用`IoFreeMdl`释放MDL...

    骨骼动画MDL-3D-OpenGL

    1. **加载MDL模型**:这包括读取模型的几何数据、纹理信息和骨骼结构。通常需要一个专门的解析器来处理MDL文件格式。 2. **构建骨骼层次结构**:根据MDL文件中的骨骼信息,创建一个骨骼树结构,每个骨骼都有父骨骼和...

    lis3mdl_datasheet_magnetometer_LIS3MDL_zip_

    LIS3MDL数据手册还提供了实用的示例代码和应用注释,帮助开发者快速理解和集成这款磁力计。无论你是初次接触传感器的工程师,还是经验丰富的专业人士,这份详尽的手册都是理解LIS3MDL并将其成功应用于项目中的宝贵...

    lis3mdl_STdC.zip

    4. **示例代码**:可能包含C、C++或Python等语言的示例代码,展示如何读取和处理传感器数据,以及如何进行数据校准。 5. **应用笔记**:可能有技术文章或白皮书,解释如何正确解读和利用传感器输出的数据,以及在...

    Source-number-estimation-MDL.rar_MDL算法_mdl number_信源数估计_信源数估计mdl

    这些代码可能包括数据读取、预处理函数、模型构建函数、描述长度计算函数以及源数估计和验证的相关算法。通过运行这个程序,研究人员和工程师可以对实际的信号数据进行信源数估计,以适应各种信号处理应用场景,比如...

Global site tag (gtag.js) - Google Analytics