zhangyifeng.198
驱动牛犊
驱动牛犊
  • 注册日期2007-09-02
  • 最后登录2011-12-29
  • 粉丝1
  • 关注0
  • 积分16分
  • 威望65点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1470回复:0

DS写驱动如何搞PMDL的方法

楼主#
更多 发布于:2009-03-04 14:55
  

如果你在设备对象中指定DO_DIRECT_IO方式,I/O管理器将创建一个MDL用来描述包含该用户模式数据缓冲区的锁定内存页

对于I/O管理器执行的Direct方式的读写操作,其过程可以想象为下面代码:
KPROCESSOR_MODE mode; // either KernelMode or UserMode
PMDL mdl = IoAllocateMdl(uva, length, FALSE, TRUE, Irp);
MmProbeAndLockPages(mdl, mode, reading ? IoWriteAccess : IoReadAccess);//mode 很重要either KernelMode or UserMode

MmUnlockPages(mdl);
ExFreePool(mdl);
I/O管理器首先创建一个描述用户缓冲区的MDL。IoAllocateMdl的第三个参数(FALSE)指出这是一个主数据缓冲区。第四个参数(TRUE)指出内存管理器应把该内存充入进程配额。最后一个参数(Irp)指定该MDL应附着的IRP。在内部,IoAllocateMdl把Irp->MdlAddress设置为新创建MDL的地址,以后你将用到这个成员,并且I/O管理器最后也使用该成员来清除MDL。
这段代码的关键地方是调用MmProbeAndLockPages(以粗体字显示)。该函数校验那个数据缓冲区是否有效,是否可以按适当模式访问。如果我们向设备写数据,我们必须能读缓冲区。如果我们从设备读数据,我们必须能写缓冲区。另外,该函数锁定了包含数据缓冲区的物理内存页,并在MDL的后面填写了页号数组。在效果上,一个锁定的内存页将成为非分页内存池的一部分,直到所有对该页内存加锁的调用者都对其解了锁。
在Direct方式的读写操作中,对MDL你最可能做的事是把它作为参数传递给其它函数。例如,DMA传输的MapTransfer步骤需要一个MDL。

参考Programming the Microsoft Windows Driver Model
游客

返回顶部