




已阅读5页,还剩56页未读, 继续免费阅读
(检测技术与自动化装置专业论文)基于windows内核驱动的加密文件系统.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
i 摘 要 现阶段计算机大容量存储介质代替了纸张成为信息存储的主要方式,随之带来的存储系统安全问题成为一个至关重要的问题。如企业的商业秘密、科研单位的研究成果以及军事单位的各种保密信息等的丢失可能带来的巨大损失。针对日益严峻的存储系统安全问题,在研究 windows 内核驱动的基础上,本论文分析了现有文件系统功能,提出了以驱动程序作为加密文件系统的设计基础的新思路。 本文通过驱动程序设计过程中的大量尝试,制定了切实可行的加密机制,完成了加密文件系统的设计。本文详细介绍了驱动程序实现加密机制的关键处理,以及系统的整体结构设计。在以驱动程序为核心的加密文件系统的体系结构中,采用了层次化的结构设计方法,中间层使用动态链接库的方式提供访问驱动的接口,使得系统的开发灵活,更具扩展性,同时更利于上层应用程序的开发。在加密算法的实现上,系统对选用的多种加密算法进行封装,提供统一的接口。本文也对驱动程序的这类特殊的程序设计做了简要介绍,包括开发和调试工具的使用等。 通过内核性能分析工具和专门开发的文件读写操作的效率分析工具,对加密文件系统的性能进行分析,总结了现有加密文件系统的优缺点,对未来的加密文件系统的开发提出新的建议和想法。加密文件系统如能克服现有的一些缺点,将来必能在信息安全领域有广阔的应用前景。 关键词:加密 内核驱动 文件系统 信息安全 ii abstract nowadays computer mass storage media replaces papers as a major method of information storages and the information security problems grow to be remarkable. the stealing of business secret, research findings or military confidential information may inflict enormous loss. since currently more and more fiercely storage system security problems must be solved, based on study on windows kernel- mode drivers, the thesis puts forward kernel- mode driver as encrypted file system s design methodology after analyzing current file system. the thesis has make a great amounts of attempts in the course of driver program design, so that feasible encrypt mechanism has been established, and the design of encrypted file system has been completed. the processing of great importance in encrypt mechanism realization by driver program are discussed in details, and the whole systematic architecture is designed in the thesis. the structure design method of hierarchical architecture is adopted in systematic structure of encrypted file system centralized- driver program. interface layer designed as a dynamic link library make the system flexible and extensible, and make the application layer development easy. for the realization of encrypt algorithm, system encapsulates several encrypt algorithms to inform a common interface. this thesis also describes common knowledge about kernel- mode drivers, especially about development and debugging tools used in driver development. this thesis makes the performance evaluation of present encrypted file system by using the kernel- mode performance analysis and the specially- developed read- write efficiency analysis tools designed in the thesis work, the advantages and disadvantages of the present encrypted file system has been concluded. the thesis puts forward some viewpoints about future encrypted file system. after current problems being solved, encrypted file system will have broad application prospect in information security field. keywords: encrypt kernel- mode driver file system information security 独创性声明 本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。 学位论文作者签名: 日期: 年 月 日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 保密,在 年解密后适用本授权书。 本论文属于 不保密。 (请在以上方框内打“” ) 学位论文作者签名: 指导教师签名: 日期: 年 月 日 日期: 年 月 日 11 绪论 1 . 1 研究背景 近年来,随着我国社会、经济活动信息化的飞速发展,以及全球经济一体化的加剧,信息传输的途径己经越来越依赖于电信网络的方式,尤其是计算机互联网络。随之而来的信息安全问题也日益突出。如何保证网络上信息的安全逐渐成为人们关注的焦点,政府、企业和个人对安全的需求也日益迫切1。 现阶段,计算机硬盘以及其他大容量存储介质代替了纸张成为信息存储的主要方式。这样带来新的信息安全问题也日渐突出,文件信息丢失或被窃取有可能为个人甚至于国家带来极大的损失,比如企业的商业秘密、科研单位的研究成果以及军事单位的各种保密信息等。另一方面,存储信息保护的侧重点和方式发生了很大的变化,信息有可能通过网络甚至计算机软硬件制造商故意制造的安全漏洞而被窃取。所以近些年信息存储加密成为信息安全应用领域的热点之一。 无论是私人信息还是部门信息、无论是军用信息还是商业信息,在进行处理和传递前,首先要以电子文档的形式存储在单机、服务器,或是网络上任意一台客户机上。因此信息或电子文档的安全存储应该是信息安全实现的首要条件。 美国联邦调查局和中国国家信息安全评测认证中心的调查结果均显示,政府和企业因信息被窃取所造成的损失超过病毒破坏和黑客攻击所造成的损失,超过 70%以上的安全威胁来自泄密和内部人员犯罪2。如何更有效地防范有目的的信息窃取,全方位地对信息进行安全保护则是各个企业和单位所面临的非常重要的问题。 1 . 2 研究意义 将数据以密文形式存储在计算机中,这样即使信息被非法窃取,因没有密钥,得到的也只是无法辨认的乱码,从而达到保护信息资源的目的。 加密作为提高信息安全的一种手段,被政府、企业和个人广泛的采用,目前存 2储系统的加密方式一般有三种。即常规的文件加密方式,存储介质加密方式和加密文件系统3。 (1) 文件加密方式 最基本的文件加密方式是使用一些文件加密工具,它不需要操作系统的支持。用户通过自己选择的密钥对文件进行加密。但访问加密文件时,加密工具先对文件进行解密,使用完毕后再对文件进行加密。这种繁琐的方式使得它在实际应用中缺乏足够的吸引力,并且需要用户参与的地方也比较多,所以也比较容易出错,这种方式只适合对安全要求不太高的场合。 (2) 存储介质加密 这种加密方式通常在设备驱动层实现。由驱动程序透明地对写入存储设备上的数据进行加密,对从存储设备上读到的数据上解密。如对整个磁盘进行加密。这种方式数据安全性能保证,但在实际应用中显得非常不灵活,这种方式不能对指定的文件进行加密。 (3) 加密文件系统 这种加密方式是在文件系统驱动的基础上进行扩展。它和存储介质加密方式一样,能对数据进行透明的加解密。同时在安全性,效率,以及灵活性上得到较好的平衡。相对于存储介质加密方式,它最大的优点是能实现对指定文件的加密。也就是说我们可以选择对哪些文件需要加密,那些文件不需要加密。 一个文件系统中一般只有特定的文件需要保密,这样的结果是加密文件系统相对于存储介质加密方式性能上有较大的优势。加密文件系统是一种加解密不由信息使用者决定,在系统底层自动实现对信息加密解密的技术,它对于信息使用者来说是透明的。 相对于传统的加密方式,加密文件系统更加灵活、方便、安全。在避免内部人员泄密的同时,也不影响用户的既有使用习惯,对集团用户信息保密具有实际的意义。 31 . 3 加密文件系统的发展 加密文件系统在 linux 下已经有比较多的成果: (1) 基于 linux2.4 内核开发的红旗安全操作系统 4.0 该系统提供多种先进的访问控制机制、安全审计、基于 vfs 的高强度加密文件系统、安全域隔离和可信路径等安全机制。 红旗安全操作系统 4.0 实现了对应用透明的加密文件系统, 可直接对文件和目录进行加密,通过高强度的加密算法有效防止了通过直接访问物理存储设备等手段窃取敏感信息的行为。另外,加密文件系统作为访问控制的有力补充手段,为用户的敏感信息提供了多层次的保护。 (2) linux 操作系统中的 cfs cfs (cryptographic file system)是一种透明的、在用户空间实现的加密文件系统。cfs 加密的核心思想是:cfs 为目录和文件提供一个透明的接口,并自动使用用户的密钥加密。使用时只要一条命令就可以把一个密钥和一个目录关联起来,关联后,在该目录内写文件时对文件进行自动加密,打开文件时对文件进行自动解密。 (3) 基于 linux 操作系统的 tcfs tcfs (transparent cryptographic file system)是在内核空间实现的一种透明加密文件系统,tcfs 通过将加密服务和文件系统紧密集成,使用户感觉不到文件的加密过程。tcfs 不修改文件系统的数据结构,也不改变备份、恢复和用户访问加密文件的语义。 虽然基于 linux 的加密文件系统已经有不少研究,但基于 windows 下的加密文件系统却不多见,只有最近两年才能看到比较少的讨论,但没看到这类系统比较稳定的产品出现。这是有原因的:linux 是一个自由的国度,大部分资源都是公开的,像 ext2/ext3 这样的文件系统格式的定义也是公开的, 反观 windows 系统, 能查到的资料相对有限,很难透彻的研究系统内核的机制,在此基础上开发出加密文件系统显得更加困难。 但 windows 操作系统的市场占有率却超过 90%以上, 实现基于 windows 下的加 4密文件系统具有更大的意义。 1 . 4 主要工作内容 本文主要工作是针对企业信息安全的现状和趋势,查阅大量文献和资料,完成了基于 windows 内核驱动的加密文件系统。本论文主要研究内容有: (1) 系统的体系结构设计 经查阅大量资料,选择加密文件系统的核心方案,制定切实可行的加解密机制,设计系统的体系结构。 系统的加解密机制是在整个系统的实现过程中,不断修改和完善的。 (2) 完整的内核驱动程序设计 对于驱动程序这一类特殊的软件,其开发和调试相对于一般的应用程序开发有很大的区别,论文也对驱动程序的一般性开发作了简述,同时对该系统所实现的驱动程序的关键处理以流程图的形式表述出来。 (3) 实现了制定加密策略的用户界面 设计了制定加密策略的应用程序,可以对整个加密文件系统的功能进行验证,同时也能对加密文件系统进行测试。 (4) 系统性能分析 分析加密文件系统对操作系统现有内核模块以及对应用程序访问文件的效率影响,专为效率分析做了测试工具。 52 设备驱动及文件系统驱动 2.1 设备驱动的分类 以某种观点来看,操作系统都是由一个操作系统核心和多个驱动程序组成,这些驱动程序与系统中的硬件相对应4。 设备驱动程序提供连接到计算机的硬件的软件接口,它是操作系统的个信任部分。用户应用程序以一种规范的方式访问硬件,而不必考虑必须如何控制硬件。例如,磁盘驱动程序可以隐藏数据就必须以 512 字节块来写这样的事实。 驱动程序是一个软件。在装入后成为操作系统内核的一部分,它使个或多个设备可用于用户模式程序员。每个设备代表一个物理的或逻辑的硬件。例如一个物理硬盘可以看成两个逻辑盘 c 和 d。 图 2- 1 是 windows 下设备驱动的分类。 虚拟设备驱动程序(vdd)内核模式驱动程序文件系统驱动程序遗留设备驱动程序pnp驱动程序显示驱动程序wdm驱动程序类驱动程序mini驱动程序 图 2- 1 驱动程序分类 ( 1 ) 虚拟设备驱动程序( v d d ) 是一个用户模式部件,它可以使 d o s 应用程序访问x 8 6 平台上的硬件。v d d 通过屏蔽 i / o 权限掩码来捕获端口存取操作,它基本 6上是模拟硬件操作,这对于那些直接对裸机硬件编程的应用程序特别有用。尽管这种驱动程序在 w i n d o w s 9 8 和 w i n d o w s 2 0 0 0 / x p 中共享一个名称并且有相同的功能,但实际上它们完全不同。用 v d d 缩写代表这种驱动程序,用 v x d缩写代表 w i n d o w s 9 8 中的虚拟设备驱动程序以示区别。 ( 2 ) 内核模式驱动程序的分类包含许多子类。 p n p 驱动程序就是一种遵循 w i n d o w s 2 0 0 0 / x p 即插即用协议的内核模式驱动程序。大部分对硬件开发的驱动都应该是 p n p 的。 ( 3 ) w d m 驱动程序是一种 p n p 驱动程序,它同时还遵循电源管理协议,并能在w i n d o w s 9 8 和 w i n d o w s 2 0 0 0 / x p 间实现源代码级兼容。w d m 驱动程序还细分为类驱动程序( c l a s s d r i v e r ) 和迷你驱动程序( m i n i d r i v e r ) ,类驱动程序管理属于已定义类的设备,迷你驱动程序向类驱动程序提供厂商专有的支持。 ( 4 ) 显示驱动程序是用于显示和打印设备的内核模式驱动程序。 ( 5 ) 文件系统驱动程序在本地硬盘或网络上实现标准 p c 文件系统模型( 包括多层次目录结构和命名文件概念) 。 ( 6 ) 遗留设备驱动程序也是一种内核模式驱动程序,它直接控制一个硬件设备而不用其它驱动程序帮助。这种驱动程序主要包括 w i n d o w s n t 早期版本的驱动程序,它们可以不做修改地运行在 w i n d o w s 2 0 0 0 / x p 中。 2.2 文件系统驱动及过滤驱动 文件系统驱动是存储管理系统的一个组成部分,它给用户提供从非易失性存储媒体如磁盘或磁带上存取信息的方法56。它由内核驱动来实现,除了由 windows ddk 提供的 irp 接口,文件系统驱动必须包含其它的一些特性,例如:cache 管理,内存管理,安全性,同步等7。 一个典型的文件系统驱动具有的功能为:能够创建、修改和删除文件;可以在文件系统之间通过一个安全的。可控制的方式来共享文件和传递信息;使应用程序能够比较简单的存取文件内容;能够识别文件的逻辑名和符号名,而不是物理设备名;能够比较快速的访问数据,而不是要经常处理物理的数据。 7windows nt,它由 fastfat(过时的 fat 文件系统)、ntfs、用于 cd- rom 的cdfs、局域网管理器 redirector 等等组成。然而,上面的这么多文件系统中,没有一种提供了即时加解密数据的功能。那怎么实现公用的加密文件系统呢?写一个完整的新的文件系统驱动过于耗费时间,并且基于现有 windows 文件系统,重新开发文件系统驱动也不合理。现在能做的事就是设计一个过滤驱动来拦截、扩展原来的请求,实现加解密功能。 一个过滤驱动是一个拦截即将发送到目标模块(如文件系统驱动或磁盘驱动)请求的中间驱动。通过拦截发送到目标的请求,过滤驱动就有了扩展或替换原始请求功能的机会7。 实现过滤驱动,需要将驱动的设备对象插入到现有驱动堆栈中的一个合适位置。一旦将过滤驱动插入到驱动堆栈中的一个合适位置,它就能拦截来自用户的 i/o 请求,然后执行你的意图,接着再发给它的目的模块(如文件系统或磁盘驱动)。因此它们能继续正常的功能, 例如管理磁盘卷标的枚举或者读取磁盘数据等。 图 2- 2 展示出了过滤驱动可以在设备堆栈中的两个位置。 i/o管理器user spacekernel space过滤驱动fat or ntfs or cdfs磁盘驱动过滤驱动 图 2- 2 过滤驱动程序在设备堆栈的位置 8因此,当插入过滤驱动对象到目标设备对象堆栈中,它就可以拦截发给文件系统驱动的 i/o 请求, 在文件系统驱动将数据写到存储设备之前对其进行加密, 同时也可以在文件系统从存储设备获取数据之后对加密的数据进行解密(在数据被发回给用户之前)。 当然,如果决定在文件系统下面拦截 i/o 请求,也要遵循同样的方法,除了需要找到一个时机去修改那块经过现有文件系统驱动处理过的缓存。 正是由于所有的驱动对处理 irp 都遵循一套定义好的、层次的驱动接口,才使得过滤驱动的存在变得有意义。也使得过滤驱动的扩展性变得很强,原则上可以实现对多种底层驱动的过滤,在不同文件系统驱动上的同一个过滤驱动变得可能。 2.3 内核驱动的特点 内核模式驱动有许多共有的属性: (1) 可移植性 硬件抽象层(hal)将处理器和平台依赖于 os 和设备驱动程序代码分开。通常,在设备驱动程序代码被移植到一个新的平台时只需要重新编译即可。设备驱动程序依赖于 hal 中的宏,来访问硬件寄存器和总线。设备驱动程序代码必须依赖于 i/o管理器中提供的抽象宏来控制硬件资源。从而使设备驱动程序能独立于平台而存在。 (2) 可配置性 内核模式驱动程序应避免对设备特征或某些系统设置作绝对假设,这些系统设置会随着平台的改变而改变。例如,在 x86 平台上,标准串行口使用一个专用的 irq和 8 个 i/o 端口,这些数值持续 20 年从未改变。把这些值直接写到驱动程序中将使驱动程序失去可配置性。为了实现可配置性,首先应该在代码中避免直接引用硬件,即使是在平台相关的条件编译块中也是这样。应该使用 hal 工具或调用低级总线驱动程序,或者实现一个标准的或定制的控制接口,并通过控制面板程序与用户交互。另外,还应该支持 windows 管理仪器(wmi)控件,这种控件允许用户和管理员在分布式企业环境中配置硬件特征。最后,应该使用注册表作为配置信息的数据库,这可以使配置信息在系统重新启动后仍然存在。 9(3) 可抢占性 windows 2000/xp 和 windows 98 都是多任务操作系统,可以为任意多个线程分配 cpu 时间。 在大部分时间中, 驱动程序例程执行在可以被其它线程(在同一个 cpu上)抢先的环境中。线程抢先取决于线程的优先级,系统使用系统时钟为线程分配cpu 时间片。 windows 2000/xp 还使用了一个中断优先级的概念,即 irql。可以认为 cpu中有一个 irql 寄存器,它记录着 cpu 当前的执行级别。有三个 irql 值对设备驱动程序有重要意义:passive_level(值为 0)、dispatch_level(值为 2),以及所谓的设备中断请求级 dirql(大于 2 的值,设备的中断服务例程在该级上执行)。在大部分时间中,cpu 执行在 passive_level 级上,所有的用户模式代码也运行在passive_level 级上,并且驱动程序的许多活动也都发生在 passive_level 级上。当 cpu 运行在 passive_level 级时,当前运行的线程可以被任何优先级大于它的线程抢先。然而,一旦 cpu 的 irql 大于 passive_level 级,线程抢先将不再发生,此时 cpu 执行在使 cpu 越过 passive_level 级的任意线程上下文中。 可以把高于 passive_level 级的 irql 看成是针对中断的优先级。这是一个与支配线程抢先机制不同的优先级方案,正如我前面说的,在 passive_level 级上没有线程抢先发生。但是,运行在任何 irql 级上的活动都可以被更高 irql 级上的活动中断。所以驱动程序必须假定在任何时刻都可能失去控制权,而此时系统可能需要执行更基本的任务。 (4) 多处理器同步 windows 2000/xp 可以运行在多处理器计算机上。 windows 2000/xp 使用对称多处理器模型,即所有的处理器都是相同的,系统任务和用户模式程序可以执行在任何一个处理器上,并且所有处理器都平等地访问内存。多处理器的存在给设备驱动程序带来了一个困难的同步问题,因为执行在多个 cpu 上的代码可能同时访问共享数据或共享硬件资源。windows 提供了一个同步对象,自旋锁(spin lock),驱动程序可以使用它来解决多处理器的同步问题。 (5) 基于对象 10windows 2000/xp 内核是基于对象的, 即驱动程序和内核例程使用的许多数据结构都有公共的特征,这些特征集中由对象管理器管理。这些特征包括名称、参考计数、安全属性,等等。在内部,内核中包含了许多执行公共对象管理的方法例程,例如打开和关闭对象或析取对象名。 驱动程序使用内核部件输出的服务例程来维护对象或对象中的域。某些内核对象,例如内核中断对象,是不透明的,ddk 头文件中没有其数据成员的声明。其它内核对象,如设备对象或驱动程序对象则是部分不透明的,ddk 头文件中声明了其结构的全部成员, 但 ddk 文档中仅描述了可访问的成员并警告驱动程序开发者不要直接访问或修改其它成员。对于驱动程序必须间接访问的不透明域,可以用支持例程访问。部分不透明的对象类似于 c+的类,有任何人都能访问的公共成员,还有必须通过方法函数才能访问的私有成员和保护成员。 (6) 包驱动 i/o 管理器和设备驱动程序使用 i/o 请求包来管理 i/o 操作的具体细节。首先,某个内核模式部件创建一个 irp, 该 irp 可以是让设备执行一个操作、 向驱动程序发送一个命令,或者向驱动程序询问某些信息的请求。然后 i/o 管理器把这个 irp 发送到驱动程序输出的例程上。一般,每个驱动程序例程仅执行 irp 指定的一部分工作然后返回 i/o 管理器。最后,某个驱动程序例程完成该 irp,之后 i/o 管理器删除该 irp 并向原始请求者报告结束状态。 (7) 异步 windows 2000/x 允许应用程序和驱动程序在起动一个 i/o 操作后继续执行,而此时 i/o 操作仍在进行。所以,需要长时间运行的 i/o 操作应该以异步方式执行。即当驱动程序接收到一个 irp 后,它首先初始化用于管理该 i/o 操作的任何状态信息,然后安排 irp 的执行,而该 irp 将在以后的某个时刻完成,最后返回调用者。由调用者决定是否等待该 irp 的完成。 作为一个多任务操作系统, windows 2000/xp 根据线程的适合性和优先级来调度它们在有效处理器上的执行。通常,驱动程序在某些不可预测线程的上下文中应该使用异步方式处理 i/o 请求。使用术语任意线程上下文(arbitrary thread context)来描 11述驱动程序并不知道(或并不关心)处理器当前执行在哪一个线程上的上下文。 驱动程序应避免阻塞任意线程,这使得驱动程序有了这样的架构:通过执行离散的操作并返回来响应硬件事件。 2.4 内核驱动程序结构 内核模式驱动程序看上去不同于常规应用程序。一般而言,一个驱动程序只是操作系统软件(通常是 i/o 软件)调用的例程集合。流程图对于表示控制路径并没什么好处,驱动程序例程被动地存在,只是等待 i/o 管理器激发它们。 根据驱动程序的不同,当出现如下所列的条件时,i/o 管理器会调用一个驱动程序例程: (1) 装入驱动程序时。 (2) 卸载驱动程序,或系统关闭时。 (3) 插入或移走设备时。 (4) 用户模式程序发出一个 i/o 系统服务调用。 (5) 驱动程序能够使用共享硬件资源时。 (6) 在真实设备运行期间的各个关键时刻8。 2.4.1 初始化和卸载例程 驱动程序装入系统时,必须执行各种不同的任务。同样,在驱动程序被卸载之前需要清除。驱动程序提供了几种例程来执行这些操作。 (1) driverentry(驱动程序入口)例程 io 管理器在驱动程序首次装入时调用该例程,最早可能在启动时间发生,但是驱动程序可以在任何时间动态地装入。driverentry 例程执行所有的第一次初始化任务,诸如声明所有其他驱动程序例程的地址。它定位将控制的硬件,或者确认资源使用(端口、中断、dma),并为发现的每种硬件设备提供对其余系统可见的设备名称。对于参与即插即用的 wdm 驱动程序来讲,这一硬件分配步骤被延迟,并由例 12程 adddevice 函数完成。 (2) reinitialize(重新初始化)例程 一些驱动程序可能不能在 driverentry 期间完成初始化工作。在驱动程序依赖于还要装入的另一个驱动程序时, 或者驱动程序所需操作系统的支持, 比在 driverentry被初次调用时引导驱动程序所需操作系统的支持还要多时,这种情况就有可能发生。这些类型的驱动程序可能要求它们的初始化工作被延迟,在 driverentry 期间提供一个 reinitialize 例程。 (3) unload(卸载)例程 在驱动程序被动态卸载时,i/o 管理器调用驱动程序的 unload 例程。它必须反转 driverentry 所执行的任何行为,不保留任何己经分配的资源。这些行为包括删除初始化期间为所有受控设备提供的系统范围的设备名。对于 wdm 驱动程序来讲,设备资源(和名称)在 removedevice 期间随着每种设备的删除而被删除。 (4) shutdown(关闭)例程 unload 例程不在系统关闭期间被激发。因为系统无论如何是要被关闭了,所以也就不要任何清除工作了。另外,io 管理器激活一个驱动程序的 shutdown 例程,使硬件有机会恢复到静止状态。 (5) bugcheck(故障检验)例程 如果驱动程序需要在系统崩溃时获取控制,它就提供一个 bugcheck 例程。若该例程经过正确注册,则该例程在一个有序的“崩溃”过程中被内核调用。 2.4.2 系统调用派遣例程 当 i/o 管理器接收到一个来自用户模式应用程序的请求时,请求类型(读、写等)被转换成一个函数代码。i/o 管理器标识用来处理该请求的合适的驱动程序,然后调用驱动程序中几个分派例程之一。每个函数代码有一个被驱动程序支持的分派例程。驱动 程 序 的相应的分派例程验证请求,如果有必要,则要求 i/o 管理器使设备请求入队列以执行真实工作。然后返回到 i/o 管理器,把请求标志为挂起。 (1) 打开和关闭操作 13所有驱动程序必须提供一个create分派例程, 它处理 win32函数reatefile 请求。在 win32 closehandle 调用上执行清除工作的驱动程序,必须提供一个 close 派遣例程。 (2) 设备操作 根据 设 备 情况,一个驱动程序可以有单独的分派例程来处理数据传输和控制操作。win32 函数 readfile,writefile,deviceiocontrol,都被 i/o 管理器发送到驱动程序中提供的例程。此外,一个驱动程序只需为它支持的那些操作提供例程。 如果一个用户程序向驱动程序不能支持的一个派遣例程的 i/o 设备发出一个请求,该程将序接收到一个错误,指示不支持请求的操作。 2.4.3 设备服务派遣例程 依据设备的本质和复杂性不同,设备操作包括许多不同的驱动程序例程。 (1) startio 例程 每当设备需要开始数据传输的启动时,i/o 管理器调用驱动程序的 startio 例程。每次一个高级的 i/o 请求结束而另一个请求等待在队列中时, 由 i/o 管理器产生该请求。换句话说,i/o 管理器(默认)使所有 i/o 请求进入队列,并串行化所有 i/o 请求。只有在前一个请求完成时才重新起动受影响的设备(能够处理同步请求的复杂设备可以选择不使用这种串行化的方法)。 startio 例程由驱动程序提供, 分配所需的资源以处理请求的 i/o,并动态设置设备。 (2) 中断服务例程(isr) 每当设备产生一个中断时,内核的中断调度程序调用驱动程序的中断服务例程。isr 负责全部的硬件中断服务。在 isr 返回时,应当从硬件观点释放中断。只有最少量的操作会由 isr 自身完成。如果服务中断之后要求其他费时的行为,应当在 isr中调度 dpc。接着,isr 的其余工作能够在一个小于 dirql 的 irql 等级上完成。 (3) dpc 例程 一个驱动程序能够不提供或者提供多个 dpc 例程, 以执行或完成常规设备操作。 14这就会包括系统资源释放(诸如一个 dma、页面描述符等)、报告错误条件、i/o 请求标志为完成(complete),以及根据需要启动下一个设备运行。 如果完成中断服务只要求一个 dpc,则可以用 i/o 管理器支持的一种简化方案,称为 dpcforisr 例程。但是,一些驱动程序可能希望提供不同用途的 dpc,也许是两个不同的 dpc,一个完成写操作,一个完成读操作,这是很方便的。可以调度 dpc,使它只在 irql 为 dispatch_level 的等级上执行工作。 一个驱动程序可以有任意数量的常规 dpc 例程。 2.5 内核驱动程序对象 前文也有提到 windows 2000/xp 内核是基于对象的,这是指驱动程序和内核例程使用的许多数据结构都有公共的特征,这些特征集中由对象管理器管理9。这些特征包括名称、类型、参考计数、安全属性等等。 2.5.1 驱动程序对象 每个驱动程序只有唯一的一个驱动程序的对象。 当装入一个驱动程序时,i/o 管理器建立一个驱动程序对象。如果驱动程序初始化失败,i/o 管理器删除该对象。在 driverentry 初始化的过程中,直接设置各派遣例程的入口地址到驱动程序对象的各个域里面。 在驱动程序初始化的过程中,driverentry 例程加载驱动程序的其它驱动程序函数的指针到驱动程序对象中。当一个 irp 被发送到一个指定的设备,i/o 管理器使用相关的驱动程序对象找到正确的驱动程序的派遣例程。 如果请求包含一个设备硬件的操作, i/o 管理器使用驱动程序对象找到驱动程序的 start i/o 例程。如果驱动程序被卸载,i/o 管理器使用驱动程序对象找到驱动程序的 unload 例程,当 unload 例程返回后,i/o 管理器就删除这个驱动程序对象。 同时 i/o 管理器使用驱动程序对象来代表每个设备驱动程序, 驱动程序对象里记录着一个设备对象链表,每个设备对象代表一个设备。i/o 管理器把多个设备对象连 15接起来并维护这个域。 2.5.2 设备对象(fdo)和设备扩展 i/o 管理器和驱动程序在任何时刻都需要知道 i/o 设备所进行的工作。设备对象通过保存关于设备特征和状态的信息,使上述任务成为可能。系统上的每个虚拟、逻辑和物理设备有一个设备对象。 如果是支持即插即用的驱动程序,那么设备对象就在 adddeivce 例程里被新建,否则就在 driverentry里新建。 i/o 管理器使用设备对象中的反向指针来定位相应的驱动程序对象。 在那里能够找到作用于 i/o 请求的驱动程序例程。 它还维护附属于设备对象的当前和挂起的一个irp 队列。 deviceextension(pvoid)指向一个由用户定义的数据结构,该结构可用于保存每个设备实例的信息。i/o 管理器为该结构分配空间,但该结构的名字和内容完全由用户决定。一个常见的做法是把该结构命名为 device_extension。通常,用它来保存与特定设备关联的任何信息。使用全局或静态变量违背了驱动程序可以完全重入的要求。通过把设备状态保存在设备扩展中,驱动程序代码的单个副本能够管理多个设备。 2.5.3 i/o 请求包(irp) irp 是一个内核“对象” ,它是一个预先定义的数据结构。带有一组对它进行操作的 i/o 管理器例程。i/o 管理器接收一个 i/o 请求,然后在把它传递到合适的驱动程序堆栈中的最高驱动程序之前,分配并初始化一个 irp。 一个 irp 有一个固定的首部和可变数目的 irp 堆栈单元块。每个 i/o 请求有一个主功能代码(如 irp_mj_create 对于文件打开)并可能有次功能代码。 irp 的固定部分(irp 结构自身)含有 irp 的固定属性,每个堆栈单元(一个io_stack_location 结构) 事实上含有大多数有关的 irp 参数。 16当一个 irp 由多个驱动程序处理时,使用多个 irp 栈单元。每个驱动程序从当前 irp 栈单元得到它的 irp 参数。如果把一个 irp 沿当前设备的驱动程序栈向下传递,必须使用正确的参数设置下一个栈单元。向下传递的参数必须与正在处理的参数不同。 i/o 堆栈的主要目的是存储 i/o 请求的函数代码和参数,通过检查 i/o 堆栈的majorfunction 部分,驱动程序可以知道需要执行什么操作和怎样解释 parameters 联合体。 2.5.4 其它内核对象 常用的内核对象还有:中断对象,定时器对象,dpc, dma,文件对象等等。 中断对象用于连接设备中断源和中断服务程序到中断向量表,或者连接一个中断服务程序和一个中断转移例程到二级中断向量表。 定时器主要用于处理设备超时。 dpc 是一组通常需要延时执行的内核队列。dpc 通常用于计划的 i/o 操作发生在中断服务例程经常发生在较高的 irql,希望将一些操作延时,直到当前的 irql比较低时,再执行这些操作。 dma对象用来实现dma功能。 即在设备和内存中不经过cpu而直接传输数据。它由设备本身或 dma 控制器来处理10。 文件对象代表文件,设备,目录或卷等打开的一个实例。对设备来说,一个文件对象通常表示一个设备对象。 2.6 驱动的编译、调试、安装和测试 2.6.1 开发工具 谈到 windows 驱动的开发工具自然会想起 ddk。其实 ddk 有很多版本的,甚至为文件系统驱动的开发提供了单独的工具。 ddk 3790.1830 提供在 windows server 2003 sp1,windows xp,以及 windows 172000 这些操作系统上运行的驱动开发工具。 ifsddk 为开发者提供编写文件系统驱动或文件系统过滤驱动的接口和文档。 设计这样的一个 ifs 的主要目标是为文件系统驱动开发提供关键的资源。 两者之前的差别就是 ifsddk 包含了文件系统驱动相关的一些数据结构和函数定义以及一些文件系统的帮助文档。 这里的选择是开发工具用 ddk,但在实际的工程里包含一些文件系统驱动开发必须的一些数据结构。 驱动的编译可以在 ddk 的命令行下直接运行 build 命令,或在.net 2003 等集成工具下新建 makefile 工程来编译。 在 ddk 开发工具中的命令行做法为: (1) 运行目标操作系统版本下对应的 build 工具,checked 版为开发过程中调试时用的版本,free 版本为驱动发布时使用的版本。 (2) 使用 cd 命令转到源码所在的目录。在源码目录下必须包含 source 文件和makefile 文件,其中 source 文件指定需要编译的文件,以及驱动的类型及编译结果存放的位置,makefile 指定产生文件的依赖性以及命令列表。一个标准的 makefile 都是相同的。 (3) 运行 build cz 开始编译,如果编译的过程中出现错误,这里会自动提示。编译后的结果会放在指定目录下。 在.net 2003 集成编辑环境下编译步骤为: (1) 新建 makefile 类型工程,并包含驱动的源码。 (2) 指定 nmake 指令。这里会用到一个 ddkbuild.bat 的批处理文件。帮助将nmake 命令连接到 ddk 的工具中。这里需要指定 ddk 的所在的目录。 在驱动编译过程中可以有一系列的工具辅助内核驱动的开发,用于帮助缩短开发周期,常用的有 prefast 和 driver verifier。 prefast 是一个静态的源码检查工具,它可以帮助检查出源码中一些如某些系统函数调用是否过时等由编译器不容易找到的一些问题。 driver verifier 是一个动态的检测工具。它可以监视内核驱动是否使用了不合法 18的函数调用,或导致系统崩溃。它能够对驱动进行大量的检查,甚至进行一系列的压力测试,如随机的使一些内存分配函数调用失败等11。 2.6.2 调试工具 调试方法是程序开发的关键,如果没有好的调试工具,我们仅仅能通过内核打印显示的方式来观察程序的流程。但这样的开发效率就会很低,也会有很多无法解决的问题。 当前的主流的 windows内核调试软件有debugging tools for windows和softice两种,下面分别介绍。 (1) debugging tools for windows debugging tools for windows 是一套专用于 microsoft windows 家族的功能强大的工具。能够调试应用程序,服务,驱动,以及 windows 内核。适用于 32 位 x86,intel itanium,以及 x64 平台的 windows nt 4.0, windows 2000, windows xp,microsoft windows server 2003 和 windows vista 可以实时调试目标机以及 dump 文件,本地机器以及远程机器。 除了这些外,它还有支持以下功能:支持在 windows ddk中包含的特殊的调试函数,宏定义,以及全局变量等。可以在驱动里发送消息到调试器或者设置断点来帮助调试。可以访问 windows 的符号文件,如果在调试的时候可以访问因特网,我们可以指定调试器的符号文件路径为 windows 的符号文件服务器。如果在调试的时候不能访问因特网,可以事先从微软的网站上下载好 windows 符号文件。 debugging tools for windows 包含 windbg,一个图形界面的调试器,一个控制台,以及基于控制台的调试器 ntsd, cdb, 和 kd。 windbg 通过基于图形用户接口和文本接口提供源码级的调试方式,使用 visual studio 格式的调试符号信息来进行源码级调试。 它能访问由符号文件导出的任意函数名和变量名。 windbg 能观看源码,设置断点,观察变量(包括 c+的对象) ,堆栈跟踪,和内存察看。它包含一个能发送大量范围种类的命令,而不是通过下拉菜单的方式。 19对于内核调试,windbg 需要两台计算机(主机和目标机),同时它也支持远程用户模式程序调试。 调试准备条件: 1) 建立一个运行主机调试的主机,同时一个运行被调试程序的目标机,通过一个 1394 或串口线来连接两台机器。 2) 下载并安装最新版的调试工具。 3) 设置符号文件路径,源码路径,以及 image 文件路径。 4) 设置目标机系统启动方式为调试模式。 5) 下断点。 (2) softice softice 是一款经典的老牌动态调试工具,同时也是个非常成熟、完善的软件产品,从早期的 dos 平台到现在的 windows 平台, softice 都有全线的产品支持,其正式推出的软件产品基于如下的平台: dos、 windows 3.1、 windows 9x和 windows nt,虽然如此,它仍然可以在 dos、windows 3.1、windows 95/98、windows me、windows nt 直至 windows 2000/xp 上运行12。 softice 的功能非常全面,它能提供调试包括任意软件,驱动,服务,甚至大部分的 bios 代码,可以支持单机调试和双机调试。 softice 和 windbg 两者功能上各有优缺点, 但在 windows 内核驱动调试上我选择 windbg。原因有: 1) windbg 是个图形化的调试工具,观察变量和调用堆栈等信息时比 softice这种用纯命令的工具效率要高很多。 2) softice 虽然也可以双机调试,但实际上,主机上安装的只是一个串口接收、发送的工具,功能上比 windbg 要差一些。 3) softice 调试时稳定性也不能够保证。特别是在 windbg 2000/xp 上使用时经常会导致系统崩溃,同时安装和卸载也不方便。 当然 softice 支持的平台远比 windbg 要广,也有其自己的优势。 202.6.3 驱动的安装 驱动的安装是通过 inf 文件来实现的。通过 inf 文件安装的主要作用是:增加驱动程序的系统注册表入口,设置它的加载顺序和一些适当的配置数据。同时将驱动程序文件拷贝到适当的系统路径。 inf 文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 南京创新周活动策划方案(3篇)
- 光纤广播施工方案(3篇)
- 路基验槽施工方案(3篇)
- 江苏eps墙体施工方案(3篇)
- 英语口译考试题库及答案
- 北京市门头沟区2023-2024学年八年级下学期期末考试道德与法制考题及答案
- 北京市门头沟区2023-2024学年八年级上学期期末考试地理试题及答案
- 辛亥革命历史题目及答案
- 家有小白800字7篇
- 有关我喜欢的的动物作文高一的(9篇)
- 《俗世奇人》整本书导读课件
- 餐饮管理安全管理制度
- 传统白酒生产项目商业计划书
- 2025年教师资格证考试综合素质(中学)试题及答案
- 江苏省淮安市2024-2025学年高一下学期期末考试物理试卷(解析版)
- 《基孔肯雅热防控技术指南(2025年版)》解读课件
- 2025年呼伦贝尔市生态环境局所属事业单位引进人才(2人)模拟试卷附答案详解(综合卷)
- 2025年中国建设银行招聘考试(综合知识)历年参考题库含答案详解(5套)
- BMS基础知识培训课件
- 承接战略贴近业务人力资源规划设计到应用
- 2025年广元市专业技术人员公需科目继续教育考试试题及答案
评论
0/150
提交评论