设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 服务器 > 系统 > 正文

04内核-驱动对象(5)

发布时间:2021-03-04 21:45 所属栏目:52 来源:网络整理
导读:假如MDL指定的是映射一块内核级别的虚拟地址空间,那么我们要用 MmGetSystemAddressForMdlSafe ,这样我们就能防止映射目标是来自用户模式的空间,而来自用户模式空间的物理页只能在用户模式上下文环境中使用,并且

假如MDL指定的是映射一块内核级别的虚拟地址空间,那么我们要用MmGetSystemAddressForMdlSafe ,这样我们就能防止映射目标是来自用户模式的空间,而来自用户模式空间的物理页只能在用户模式上下文环境中使用,并且随时可能被清空。用函数进行申明后,就可以防止以上情况发生了。

总结:MDL就是描述一块虚拟内存的结构体,里面有个成员记录了多个页码,这些页码即处于各个不同物理地址的物理块的页号。

所以要对一块受系统保护的区域进行写操作的话,可以这样来修改它的保护属性: 1.创建一个MDL,显然里面的物理页号数组没有初始化 IoAllocateMdl 2.初始化页码数组,使之成为实际有效的MDL MmBuildMdlForNonPagedPool 3.进行锁定,并且重新赋值新的保护属性为可读 MmProbeAndLockPages 4.获得我们所映射后的实际内存区域的虚拟地址 MmMapLockedPagesSpecifyCache

使用示例

?? const wchar_t* pStr = L"123456789abcdefg0"; // 常量字符串,不可修改.?? // 创建一个内存描述符列表?? PMDL mdl = IoAllocateMdl(pStr,17/*字节数*/,0);?? // 为内存描述符列表建立虚拟内存分页?? MmBuildMdlForNonPagedPool(mdl);??? // 将虚拟内存加载到物理内存,修改内存描述符分页属性为可写,并返回虚拟内存分页地址?? wchar_t* p = (wchar_t*)MmMapLockedPagesSpecifyCache(mdl,KernelMode,MmWriteCombined,0);?? p[1] = ‘A‘; // 本来不可修改的内存现在可以修改了.??? // 取消锁定和映射?? MmUnmapLockedPages(p,mdl);?? // 释放内存描述符列表?? IoFreeMdl(mdl);

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读