MDL相关总结

MDL(Memory Descriptor List)在Windows驱动中扮演重要角色,用于描述虚拟地址与物理地址之间的映射关系。初始化通常由IoAllocateMdl完成,但不建立实际映射。MmBuildMdlForNonPagedPool、IoBuildPartialMdl和MmProbeAndLockPages等函数用于建立和校验映射。MDL常用于METHOD_NEITHER方法的用户缓冲区处理、驱动间通信、IRP拆分和物理内存分配。
摘要由CSDN通过智能技术生成

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。首先创建IR

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值