加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 系统 > 正文

04内核-驱动对象

发布时间:2021-03-05 09:14:53 所属栏目:系统 来源:网络整理
导读:副标题#e# 驱动对象 驱动程序:就是一个 .sys 模块, 驱动对象:则是 .sys 被加载到内核中的实例化出来的对象,用于表示这个驱动模块. Windows内核使用 DRIVER_OBJECT 结构体来描述一个驱动对象. 虽然Windows内核源码使用C语言编写,但也使用了面向对象的思想.

假如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);

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读