第1章 内核编程环境

欢迎选择内核编程这门技术,这是一个充满神奇色彩与挑战的领域,在阅读本书前,需要进行术语约定与名词解释,以保证读者在后面的阅读中可以畅通无阻。

请注意,因为大部分Windows驱动程序都是内核驱动(Kernel Driver),所以本书中,不区分“驱动编程”与“内核编程”。同时,也不区分“内核模块”(Kernel Module)、“驱动程序”(Driver)与“内核程序”,这三个词汇都指本书中编译出的扩展名为“.sys”的可执行文件(注意,内核模块的扩展名一般是.sys,但是这个是非强制的,可以是其他扩展名,也可以没有扩展名)。同理,本书也不区分“应用层”与“用户态”。

本书和一般“驱动开发”书籍不同的是,本书专注于对较通用的内核程序的开发,并不介绍针对某种硬件,比如声卡、显卡、USB等的驱动程序的开发。

本书的许多内容涉及各种不同的内核驱动程序,比如文件系统驱动(File System Driver)、硬件设备过滤驱动(Filter Driver)及网络驱动(Network Driver)。但是开发目的,并不是为了驱动某个硬件,而是要在通用的Windows上实现某种功能。

驱动可以分为不同的类型,如NT驱动、WDM驱动、WDF驱动等。简单来说,NT驱动是最简单的驱动模型,不支持硬件特性;WDM驱动是在NT驱动基础上引入的一套驱动模型,支持即插即用、电源事件等特性;WDF驱动是对WDM驱动的封装与升级,屏蔽了部分细节,简化了大量接口。这三种类型的驱动大同小异,但NT驱动是所有驱动类型中的基础,本书后面章节的内容基本上也是基于NT驱动,所以除非特殊说明,否则本书所提及的驱动都泛指NT驱动。

Windows上内核态(Kernel Mode)编程和用户态(User Mode)应用编程有很多不同的地方。初次学习,很多读者会关心如何开始动手实践。为此,本章首先重点介绍如何在Windows平台上搭建内核编程环境,其中包括Visual Studio的下载,WDK的下载以及编译环境设置。

对实际上机暂时没有兴趣,或者已经做过驱动开发的读者,可以跳过第1章。