从Intel80386开始,出于安全性和稳定性的考虑,该系列的CPU可以运行于ring0~ring3从高到低四个不同的权限级,对数据也提供相应的四个保护级别。运行于较低级别的代码不能随意调用高级别的代码和访问较高级别的数据,而且也只有运行在ring0层的代码可以直接对物理硬件进行访问。由于WindowsNT是一个支持多平台的操作系统,为了与其他平台兼容,它只利用了CPU的两个运行级别。一个被称为内核模式,对应80x86的ring0层,是操作系统的核心部分,设备驱动程序就是运行在该模式下;另一个被称为用户模式,对应80x86的ring3层,操作系统的用户接口部分(就是我们通常所说的win32 API)以及所有的用户应用程序都运行在该级别。操作系统对运行在内核模式下的代码是不设防的,所以不管是建设还是破坏内核模式下的编程都是值得去研究的。
Windows驱动程序既可以运行在用户态也可以运行在核心模态。
用户态与核心太驱动程序的区别
用户态的驱动程序运行在非特权处理机模式(nonprivileged processor mode)上,其他一些被保护的子系统代码也运行在该模式上。用户态的驱动程序不能获得系统数据的存取权,除非调用Win32 API或者系统服务。
核心态驱动程序作为操作系统的一个组成部分被执行——支持一个或多个受保护的子系统的操作系统底层组件。
用户态和核心态驱动程序有不同的结构,不同的入口点和不同的系统接口。一个设备是需要一个用户态驱动程序还是需要一个核心态驱动程序依赖于该设备的类型和操作系统对它提供的支持。
一些设备驱动程序可以完全地或部分地运行在用户态。用户态驱动程序没有堆栈空间的限制,可以访问Win32 API,并且容易调试。
大多设备驱动程序运行在核心态。核心态驱动程序可以完成某些受保护的操作,并且可以访问用户态驱动程序不能访问的系统结构体(system sturcture)。然而,访问权限的提高当然也要付出相应的代价——调试的艰难,系统随时面临毁坏的危险。当代码运行在有特权的核心态环境中时,操作系统对代码所请求的数据的完整性和有效性的检查将大大减少。
为了方便,应该用高级语言(high-level language)来编写驱动程序,通常,C适合用来编写核心态驱动程序,C或C++则适合用于编写用户态驱动程序。
用户模式与内核模式是如何交互的呢
当用户模式程序需要读取设备数据时,它就调用Win32 API函数,如ReadFile。Win32子系统模块(如KERNEL32.DLL)通过调用平台相关的系统服务接口实现该API,而平台相关的系统服务将调用内核模式支持例程。在ReadFile调用中,调用首先到达系统DLL(NTDLL.DLL)中的
一个入口点,NtReadFile函数。然后这个用户模式的NtReadFile函数接着调用系统服务接口,最后由系统服务接口调用内核模式中的服务例程,该例程同样名为NtReadFile。
系统中还有许多与NtReadFile相似的服务例程,它们同样运行在内核模式中,为应用程序请求提供服务,并以某种方式与设备交互。它们首先检查传递给它们的参数以保护系统安全或防止用户模式程序非法存取数据,然后创建一个称为“I/O请求包(IRP)”的数据结构,并把这个数据结构送到某个驱动程序的入口点。在刚才的ReadFile调用中,NtReadFile将创建一个主功能代码为IRP_MJ_READ(DDK头文件中的一个常量)的IRP。实际的处理细节可能会有不同,但对于NtReadFile例程,可能的结果是,用户模式调用者得到一个返回值,表明该IRP代表的操作还没有完成。用户模式程序也许会继续其它工作然后等待操作完成,或者立即进入等待状态。不论哪种方式,设备驱动程序对该IRP的处理都与应用程序无关。
驱动程序完成一个I/O操作后,通过调用一个特殊的内核模式服务例程来完成该IRP。完成操作是处理IRP的最后动作,它使等待的应用程序恢复运行。
转自:http://babybandf.blog.163.com/blog/static/6199353201011535430294/
分享到:
相关推荐
WDF下用户模式和内核模式之间的内存共享,张奇,谢军,Windows Driver Foundation (WDF) 是用于开发Windows 驱动程序的全新平台,也是微软推出的下一代的驱动开发模式。本文简单介绍了该平台下的一��
Windows内核模式驱动程序运行环境的分析:在各种不同情况下windows的内核模式驱动程序所运行的环境是不同" 它决定了驱动程序能使用的内核支持例程种类和数量"决定了驱动程序的功能"对于应用层程序与驱动程序的数据...
意天Windows助手 1.0.0.29_内核模式时可强杀任何进程_简体绿化免费版谢谢你下载我的软件,希望这个软件能帮助你! 更多精彩内容,欢迎来我的论坛逛逛! 快乐论坛630 http://hanranran.5d6d.com/bbs.php 快乐网赚...
用 Rust 编写的 Windows 内核模式驱动程序\n这个库只是 windows 内核模式驱动程序的概念验证,可以用 Rust 编程语言编写。\n它包含Windows Driver Kit的类型、常量和绑定 ,目标操作系统从 Windows XP (x86x64) 开始...
Windows 内核模式驱动程序体系结构设计指南
1.3.5 设置Windows内核符号表 12 1.3.6 实战调试first 13 第2章 内核编程环境及其特殊性 16 2.1 内核编程的环境 16 2.1.1 隔离的应用程序 16 2.1.2 共享的内核空间 17 2.1.3 无处不在的内核模块 18 2.2 数据...
如果读者从未接触过Windows内核编程,本部分将指导读者开始Windows内核编程,学会使用WDK,并熟悉内核编程的习惯与方法。 第4章 内核字符串与内存 38 4.1 字符串的处理 39 4.1.1 使用字符串结构 39 4.1.2 ...
如果读者从未接触过Windows内核编程,本部分将指导读者开始Windows内核编程,学会使用WDK,并熟悉内核编程的习惯与方法。 第4章 内核字符串与内存 38 4.1 字符串的处理 39 4.1.1 使用字符串结构 39 4.1.2 ...
内核模式DLL 源码 内核可调用DLL 内核 DLL 实质上等同于用户模式 DLL。主要的不同在于不能在内核 DLL 中调用任何用户模式 DLL API 历程为一个可以供驱动使用的DLL 这种资料网上基本没有 下载的
Windows驱动编程视频教程 详尽的讲解 里面还有屏幕录制的录像
打印机驱动在windows中存在已久,它的功能分别由内核模式图形代码和用户空间的打印驱动共同组成。本议题,将会讲述如何在古老的代码中挖掘出新颖的攻击面。专门为用户模式打印驱动设计了一个Fuzz框架,它有效地在...
目前,Speakeasy支持用户模式和内核模式Windows应用程序。 在仿真之前,在二进制文件中标识入口点。 例如,导出的函数全部被顺序标识和仿真。 此外,还将模拟在运行时发现的动态入口点(例如,新线程,已注册的回调...
国家队ntl是用于 Windows NT 内核模式驱动程序的 C++ 标准库(有时被错误地称为 STL)的非常小且有选择性的实现。 这个名字来自结合NT和 S TL 。测试测试是在用户模式下使用 Microsoft 的 VisualStudio C++ 单元测试...
如果读者从未接触过Windows内核编程,本部分将指导读者开始Windows内核编程,学会使用WDK,并熟悉内核编程的习惯与方法。 第4章 内核字符串与内存 38 4.1 字符串的处理 39 4.1.1 使用字符串结构 39 4.1.2 ...
krn_pcre Windows 内核模式 PCRE 库
本文的重点是集成内核模式和用户态模式的图形化调试器WinDbg。KD在脚本和自动化调试中更有用,并且在资深程序员中拥有一定地位,但是本教程将集中讨论WinDbg,只会偶尔提到KD。 本文讨论的是Windows NT 4.0,...
《内核漏洞的利用与防范》涵盖了开发可靠和有效的内核级别漏洞利用所需的理论技术和方法,并将其应用于主流操作系统——UNIX衍生系统、MacOSX和Windows。本书分4个部分共9个章。第一部分介绍了漏洞利用的目标、内核...
dokany, Windows的用户模式文件系统,带有FUSE包装器 Dokany | ! 什么是 Dokan当你想在 Windows 上创建新的文件系统时,除FAT或者NTFS之外,还需要开发文件系统驱动... 开发一个在 Windows 内核模式下工作的设备驱动
com0com是一个易于使用的内核模式虚拟串行端口驱动程序,以帮助您的工作需要。如下图所示CNCA0和CNCB0是com0com生成的两个虚拟串口,可以进行通信。安装完成后,开始创建虚拟串口:打开com0com目录的setupc.exe(可用...