无处不在的内核模块

本文节选自《寒江独钓》一书

位于高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一般都用系统进程来加载内核模块相关推荐

  1. Windows CE下流驱动的动态加载

    Windows CE下流驱动的动态加载 闲话少说,进入正题.查找EVC的帮助,发现函数ActivateDevice()可用来加载驱动程序.而这个函数的使用是相当简单的.我就不多说了,贴上一段帮助最能说 ...

  2. 通过安装和配置AD域解决Windows Server 2016的IIS无法加载SMB文件卷文件的问题

    通过安装和配置AD域解决Windows Server 2016的IIS无法加载SMB文件卷文件的问题 1. 问题描述 通过客户反馈我们发现Windows Server 2016的IIS无法加载SMB文 ...

  3. Windows自动恢复报错:无法加载操作系统,原因是关键系统驱动程序丢失或包含错误

    Windows自动恢复报错:无法加载操作系统,原因是关键系统驱动程序丢失或包含错误 1. 问题 无法加载操作系统,原因是关键系统驱动程序丢失或包含错误 上午因为有点事就没有像往常一样打开电脑,下午回到 ...

  4. 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入

    成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入 目录 解决问题 解决思路 解决方法 解决问题 .pyx格式文件,在window ...

  5. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

  6. VB 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'--继续加载工程吗?

    引用:http://blog.sina.com.cn/s/blog_5542b9c90100xsm8.html 文件未找到: 'C:\WINDOWS\system32\ieframe.dll\1'-- ...

  7. 删除Windows启动管理器下的加载项

    删除Windows启动管理器下的加载项 环境:Windows7操作系统 工具:cmd命令行工具 操作: > msconfig 系统配置工具 > bededit 启动菜单编辑器,命令行工具 ...

  8. Linux可加载内核模块(LKM)(转载)

    转载: 漏天剑 文章导航: 为校长杯流尽最后一滴血, Lkm注射, 返回首页 Linux可加载内核模块(LKM) Linux可加载内核模块完全版 --黑客.病毒程序编写者和系统管理员的概念性指南 作者 ...

  9. Linux动态加载内核模块

    Linux属于单内核,为了弥补单内核扩展性与维护性差的缺点,Linux引入动态可加载内核模块,模块可以在系统运行期间加载到内核或从内核卸载.模块是具有独立功能的程序,它可以被单独编译,但不能独立运行. ...

  10. Windows Driver开发_TraceEvents调试以及加载驱动的方法

    在最新版的WDK框架里,我们新建了Windows Driver KMDF模型之后默认使用的TraceEvents来打印输出的,这套输出机制叫WPP,我们可以在DriverEntry函数里看到它的初始化 ...

最新文章

  1. Android Activity形象描述
  2. [译]管理IIS日志的存储
  3. HDU 1850 Being a Good Boy in Spring Festival
  4. 浅谈工业机器人的运动停止
  5. 【渝粤题库】国家开放大学2021春1349学前教育科研方法答案
  6. rs232接口_RS232接口与RS485的区别
  7. 【2018】面试复习大纲
  8. 授权码模式、Token登录认证
  9. 成为技术主管需要做到的三点
  10. Bugku CTF 每日一题 旋转跳跃 BUUCTF 九连环
  11. 微信跳一跳游戏的脚本
  12. 【Unity】预计算刚体运动轨迹
  13. 校验验证码 实现登录验证
  14. IPv4与IPv6区别
  15. Mavenir融合分组核心解决方案将为德国电信在德国的5G独立组网(SA)网络提供支持
  16. 个人理解ToB和ToC业务的不同点
  17. fractal php,为 Laravel 应用程序构建的 Fractal
  18. 今日头条付费专栏的暴利赚钱模式,半年净赚40万!
  19. 【樽海鞘算法】基于樽海鞘算法求解单目标问题附matlab代码(Salp Swarm Algorithm,SSA)
  20. 20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信

热门文章

  1. 使用socket方式连接Nginx优化php-fpm性能
  2. python入门必备知识总结
  3. 微网站|h5弹窗|手机网站 html5 弹窗、弹层、提示框、加载条
  4. Dynamics CRM2013/2015 禁止欢迎屏幕(Disable the Welcome Screen)
  5. 精彩编码 【进制转换】
  6. bzoj 3672 利用点分治将CDQ分治推广到树型结构上
  7. *.pro、*.pri、*.prf、*.prl等四种文件
  8. Linux操作系统中GDB工具常见用法(一)
  9. PAT 乙级 1045 快速排序
  10. Python小程序练习一之登陆接口