博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MDL相关总结
阅读量:6090 次
发布时间:2019-06-20

本文共 1086 字,大约阅读时间需要 3 分钟。

MDL的本质就是记录一段虚拟地址所对应着的一系列的物理地址。

MDL数据结构的结尾是一组PFN,记录着物理地址,相关宏是MmGetMdlPfnArray。

初始化:一般用用IoAllocateMdl初始化,但是这个步骤并没有建立起虚拟地址和物理地址的联系。IoAllocateMdl会调用MmInitializeMdl用于初始化MDL,填充MDL的header。

校验MDL对应的虚拟地址可读写:MmProbeAndLockPages

建立与PFN的联系:MmBuildMdlForNonPagedPool,IoBuildPartialMdl,MmProbeAndLockPages

建立新的虚拟地址映射:MmMapLockedPages,MmMapLockedPagesSpecifyCache,MmGetSystemAddressForMdl,MmGetSystemAddressForMdlSafe

非分页:MDL_SOURCE_IS_NONPAGED_POOL

 

在驱动中使用MDL的四种可能:

1. 在驱动中如果使用METHOD_NEITHER方法,传进来的buffer就是user app的buffer。如果需要在任意进程上下文中使用这个buffer,需要创建MDL,并且判断MDL对应的内存是否可以操作,最后把它重新map到kernel mode memory。WRK中的ExLockUserBuffer是个很好的例子。其实METHOD_IN_DIRECT方式也是这个原理,只不过是OS帮你去做这些事情了。

2. 在A驱动中发起向B驱动的请求。最好的例子是磁盘类驱动ClassSendSrbSynchronous。首先创建IRP,并且创建irp->MdlAddress

3. 将大的数据量大的IRP,拆分成IRP。典型的例子是BulkUSB中的BulkUsb_DispatchReadWrite。首先创建IRP,然后创建一个MDL,紧接着调用IoBuildPartialMdl(借用Irp->MdlAddress)修改这个MDL。这个MDL作为参数传到底层驱动(或者其他驱动),其实主要操作是更新PFN数组。

4. 分配物理内存。但物理内存不一定连续。使用MmAllocatePagesForMdl分配MDL,然后用MmMapLockedPagesSpecifyCache将这段内存map到新的地址。

微软比较全的文档:

转载于:https://www.cnblogs.com/fanzi2009/archive/2011/12/13/2286400.html

你可能感兴趣的文章
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>
没有显示器的情况下安装和使用树莓派
查看>>
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
前端面试中的常见的算法问题
查看>>
计算机语言的基本理论
查看>>
nodejs流之行读取器例子
查看>>
批量文件重命名工具
查看>>
简单说一下UWP中的JumpList
查看>>
unity将object[]或者string对象转换成枚举enum
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.19. 范围函数和操作符...
查看>>
以太坊系列之六: p2p模块--以太坊源码学习
查看>>