Windows一般都用系统进程来加载内核模块
无处不在的内核模块
本文节选自《寒江独钓》一书
位于高2G空间内的操作系统内核,并非做死的一个巨大程序。因为计算机硬件种类繁多,不可能做出一个能支持所有硬件的巨大内核。
内核是有接口的,微软提供规定的格式,让硬件驱动的编程人员,能按照规定的格式编写“驱动程序”。这些驱动程序能够作为模块加载到内核中,成为内核的一部分,这样内核只要简单地安装驱动程序,就可以适应各种不同的硬件了。
本书中的大部分例子都是编译成内核模块的,实际上也可以称为驱动程序(Driver)。但是它们大部分并不驱动任何硬件,有人称之为“软件驱动”。但是笔者认为这不够贴切,所以本书使用Linux程序员们的叫法,称之为内核模块(Kernel module)。也许这样要更贴切一些,驱动程序可以看成内核模块的一种(少量的应用层驱动程序除外)。
内核模块已经位于内核空间,作为R0代码执行,所以不受任何限制,可以任意修改内核。因此许多使用应用程序无法实现的功能,可以通过编写内核模块来实现。
起初的Windows,似乎并没有打算让应用软件的编程人员来提供内核模块。但是,一些特殊的应用软件的编程人员首先自己突破了这些限制,他们编写了虚拟光驱、防毒软件的实时监控、防火墙等特殊的不驱动任何硬件的内核模块。最终微软也意识到了内核编程对软件也是很有用的,因此在内核中又提供了更多的接口,比如方便进行文件过滤、网络过滤等的新接口,这些是专门提供给非硬件驱动开发的软件编程人员使用的。
WDK是微软目前提供的最新的驱动开发包,同时也包括了给软件内核编程提供的所有接口和例子。硬件驱动与软件的内核编程这二者目前并没有严格分开,双方的技术和许多代码都是相通的。
初学者在编写一个内核模块时,常常有的一个疑问就是:这些代码运行在哪个进程的空间中呢?
内核模块位于内核空间,而内核空间又被所有的进程共享。因此,内核模块实际上位于任何一个进程空间中。但是任意一段代码的任意一次执行,一定是位于某个进程空间中的。这个进程是哪一个?这取决于请求的来源、处理的过程等。PsGetCurrentProcessId函数能得到当前进程的进程号,这个函数的原型如下:
HANDLE
PsGetCurrentProcessId(
);
这个函数返回的HANDLE,实际上是一个进程ID。这个数字和我们打开任务管理器时,看到的PID是一样的。
有些读者会误以为所有内核代码都运行在系统进程内。
Windows的所谓系统进程是一个名为“System”的进程,是Windows自身生成的一个特殊进程,这个进程在Windows XP下PID始终为4。读者只要调用PsGetCurrentProcessId就会发现内核模块中分发函数调用时,当前进程一般都不是System进程。但是DriverEntry函数被调用时,一般都位于系统进程中。这是因为Windows一般都用系统进程来加载内核模块,并不说明内核代码始终运行在System进程里。
Windows一般都用系统进程来加载内核模块相关推荐
- Windows CE下流驱动的动态加载
Windows CE下流驱动的动态加载 闲话少说,进入正题.查找EVC的帮助,发现函数ActivateDevice()可用来加载驱动程序.而这个函数的使用是相当简单的.我就不多说了,贴上一段帮助最能说 ...
- 通过安装和配置AD域解决Windows Server 2016的IIS无法加载SMB文件卷文件的问题
通过安装和配置AD域解决Windows Server 2016的IIS无法加载SMB文件卷文件的问题 1. 问题描述 通过客户反馈我们发现Windows Server 2016的IIS无法加载SMB文 ...
- Windows自动恢复报错:无法加载操作系统,原因是关键系统驱动程序丢失或包含错误
Windows自动恢复报错:无法加载操作系统,原因是关键系统驱动程序丢失或包含错误 1. 问题 无法加载操作系统,原因是关键系统驱动程序丢失或包含错误 上午因为有点事就没有像往常一样打开电脑,下午回到 ...
- 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入
成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入 目录 解决问题 解决思路 解决方法 解决问题 .pyx格式文件,在window ...
- Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...
Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...
- VB 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'--继续加载工程吗?
引用:http://blog.sina.com.cn/s/blog_5542b9c90100xsm8.html 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'-- ...
- 删除Windows启动管理器下的加载项
删除Windows启动管理器下的加载项 环境:Windows7操作系统 工具:cmd命令行工具 操作: > msconfig 系统配置工具 > bededit 启动菜单编辑器,命令行工具 ...
- Linux可加载内核模块(LKM)(转载)
转载: 漏天剑 文章导航: 为校长杯流尽最后一滴血, Lkm注射, 返回首页 Linux可加载内核模块(LKM) Linux可加载内核模块完全版 --黑客.病毒程序编写者和系统管理员的概念性指南 作者 ...
- Linux动态加载内核模块
Linux属于单内核,为了弥补单内核扩展性与维护性差的缺点,Linux引入动态可加载内核模块,模块可以在系统运行期间加载到内核或从内核卸载.模块是具有独立功能的程序,它可以被单独编译,但不能独立运行. ...
- Windows Driver开发_TraceEvents调试以及加载驱动的方法
在最新版的WDK框架里,我们新建了Windows Driver KMDF模型之后默认使用的TraceEvents来打印输出的,这套输出机制叫WPP,我们可以在DriverEntry函数里看到它的初始化 ...
最新文章
- Android Activity形象描述
- [译]管理IIS日志的存储
- HDU 1850 Being a Good Boy in Spring Festival
- 浅谈工业机器人的运动停止
- 【渝粤题库】国家开放大学2021春1349学前教育科研方法答案
- rs232接口_RS232接口与RS485的区别
- 【2018】面试复习大纲
- 授权码模式、Token登录认证
- 成为技术主管需要做到的三点
- Bugku CTF 每日一题 旋转跳跃 BUUCTF 九连环
- 微信跳一跳游戏的脚本
- 【Unity】预计算刚体运动轨迹
- 校验验证码 实现登录验证
- IPv4与IPv6区别
- Mavenir融合分组核心解决方案将为德国电信在德国的5G独立组网(SA)网络提供支持
- 个人理解ToB和ToC业务的不同点
- fractal php,为 Laravel 应用程序构建的 Fractal
- 今日头条付费专栏的暴利赚钱模式,半年净赚40万!
- 【樽海鞘算法】基于樽海鞘算法求解单目标问题附matlab代码(Salp Swarm Algorithm,SSA)
- 20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信
热门文章
- 使用socket方式连接Nginx优化php-fpm性能
- python入门必备知识总结
- 微网站|h5弹窗|手机网站 html5 弹窗、弹层、提示框、加载条
- Dynamics CRM2013/2015 禁止欢迎屏幕(Disable the Welcome Screen)
- 精彩编码 【进制转换】
- bzoj 3672 利用点分治将CDQ分治推广到树型结构上
- *.pro、*.pri、*.prf、*.prl等四种文件
- Linux操作系统中GDB工具常见用法(一)
- PAT 乙级 1045 快速排序
- Python小程序练习一之登陆接口