笔记--①内核模式驱动程序基础
1.Kernel Mode驱动程序基础
Windows NT为基础的操作系统上用Win32汇编开发KMD,包括NT4.0、2000、XP和2003等操作系统。开发Windows 95/98/ME使用的VxD驱动程序方面的知识并不在本教程讲述的范围内.
^_^ 反正偶入门迟,现在95/98/ME的系统也很久没见了.就是写了我也不想看
1.1 KMD结构概述
1.1.2 内核模式和用户模式

1.1.2 内核模式和用户模式
^_^ 4G的虚拟地址,2G为用户模式的地址,2G为内核模式的地址.
1.2 Windows NT设备驱动程序
在不同的资料中,对驱动程序的分类方法可能完全不同,但这并不是问题。
从名称理解,设备驱动程序是用于控制某个设备的,但这个"设备"并不一定指的是物理上存在的设备,它也可以是虚拟设备。
从文件结构上讲,设备驱动程序就是一个普普通通的PE格式文件,就像其他EXE或者DLL文件一样。设备驱动程序是一个可装载的内核模式模块,一般以SYS为扩展名。他们之间的不同点在于两种的装载方法是完全不同的。实际上,我们可以把设备驱动程序理解成一个内核模式的DLL,用于完成在用户模式下所不能完成的功能,本质上的不同就在于我们无法直接存取设备驱动程序的代码和数据(注:DLL的代码和数据是可以被直接存取的,这方面的资料可以参考《Windows环境下32位汇编语言程序设计一书》中的DLL一章),唯一的存取方式是通过I/O管理器,它提供了简单的驱动程序管理环境。
刚开始学习KMD的开发的时候,你可能感觉自己根本就是一个菜虫(旁白:就是比菜鸟还低级,呵呵~~~),因为你以前用Windows API开发程序的经验在这里根本帮不上忙,即使你以前写过n多个(n趋向无穷大……)用户模式下的应用系统也没用。内核提供了完全不同的函数和数据结构,以至于你要从头开始了解,而且资料奇缺无比,一般情况下,可供参考的只有头文件。
^_^ 我所学不多.完全用不上也不可惜.倒是需要的基础太多了还要恶补.
1.2.2 分层的和单层的设备驱动程序
大部分控制硬件设备的驱动程序是分层的驱动程序,分层驱动的概念就是当用户模式发出一个请求时,每个请求从高层次的驱动程序逐层处理并流传到低层次的驱动程序中,一个I/O请求的处理可能分步在多个驱动程序中,例如,如果一个应用程序发出读盘请求,处理请求会在多个驱动程序中流过,在其中你也可以再加入n多个过滤驱动程序(比如插入一个加解密的模块)。
单层的驱动程序是最简单的一类驱动程序,这一类驱动程序通常并不依赖于其他已装载的驱动程序,他们的接口仅仅针对用户模式的应用程序,开发和调试这一类驱动程序是非常简单的,我们即将开始讨论的就是这类程序,其他类型的驱动程序将在以后讨论。
1.3 线程上下文(Thread Context)
^_^ 这个熟悉.....简单点说就是线程切换的时候需要用到的.为了避免切换线程的消耗.驱动运行在下列环境中:
1. 在发起I/O请求的用户线程中运行
2. 在内核模式下的系统线程中运行
3. 作为中断运行(并不处于哪个特定的进程或线程中,因为它们都被暂时挂起了)
1.4 中断请求级别
0--31级 .0级为被动级别.31最高级.用户模式线程都是在0级.
因此这里还有两个重要的结论:
首先:当驱动程序运行于用户模式程序的线程中时,代码的执行可能被高IRQL级别的代码打断,一些函数可以用来获取当前的IRQL值,并可以对其进行提升或者降低。
第二:被动模式IRQL下的代码可以调用任何的内核函数(DDK指明了每个函数允许调用的IRQL级别),可以对已分页的或未分页的内存进行寻址(注:即已映射过的虚拟地址还是物理内存地址)。反过来,当在一个比较高的IRQL级别下对分页内存进行寻址时(指等于或高于DISPATCH_LEVEL),系统将崩溃,因为这时内存管理器的IRQL级别反而比较低,以至于无法处理页错误了。
1.5 系统崩溃
^_^ 在内核模式下运行的程序要小心啊...很容易"Blue Screen Of Death"......怕怕
1.6 Driver Development Kit
Windows DDK是MSDN专业版和宇宙版的一部分,它也可以从http://www.microsoft.com/ddk/下载,对于开发设备驱动程序来说,DDK是关于Windows NT内部信息,包括系统函数、数据结构等的丰富资源,不幸的是,微软已经停止了免费发放DDK,所以现在只好去买正版的CD了(没有枪,没有炮,盗版游击队给我们造~~~)
除了文档,DDK还包含了一堆的库文件(*.lib),这些库可以在链接的时候用上。这些库有两种版本:普通的版本(称为free build)和特殊的包含Debug信息的版本(称为checked build),它们分别位于%ddk%\libfre\i386和%ddk%\libchk\i386目录下,check build是在编译Windows源代码时加上DEBUG标志后生成的,在开发驱动程序时,它们可以提供更加精确的错误定位,但是你首先要根据你的操作系统选择合适的lib版本才行。
1.7 汇编程序员使用的KmdKit
KmdKit包含了所有用汇编开发KMD所需要的东西:include文件、lib文件、宏定义、例子文件、工具和一些文章,
1.8 驱动程序的调试
又要和SoftICE打交道了,恨啊.........对这个的使用还是不熟.......
^_^ 要是OD能调试这个就好了.IDA也好啊....郁闷....
总结: 感觉良好,没遇到什么深奥和难懂的了.不像想象中的那么难.....加油
o(∩_∩)o...

浙公网安备 33010602011771号