《Windows驱动程序设计入门.ppt》由会员分享,可在线阅读,更多相关《Windows驱动程序设计入门.ppt(35页珍藏版)》请在金锄头文库上搜索。
1、Version 1.0Windows驱动程序设计入门驱动程序设计入门Windows设备驱动程序设计设备驱动程序设计Windows的虚拟内存管理的虚拟内存管理/ a.cpp#include int main() int a, *pa;pa = &a;printf(%xn, pa); / 输出输出1*pa = 18; getchar(); / 使程序暂停住使程序暂停住printf(%dn, *pa); / 输出输出2return 0;/ b.cpp#include int main() int a, *pa;pa = &a;printf(%xn, pa); / 输出输出1*pa = 2008;pr
2、intf(%dn, *pa); / 输出输出2return 0;2 2Windows的虚拟内存管理的虚拟内存管理 Windows的的虚拟内存管理虚拟内存管理机制为应用程序和驱动机制为应用程序和驱动 程程序提供了两种服务:序提供了两种服务:使每个进程都拥有自己独立的内存地址空间使每个进程都拥有自己独立的内存地址空间;对于;对于32位位Windows而言,每个任务可寻址的内存地址空而言,每个任务可寻址的内存地址空间都为间都为0x000000000xFFFFFFFF(232,4GB)当物理内存不够当物理内存不够4GB时,虚拟内存管理模块会用磁时,虚拟内存管理模块会用磁盘空间模拟内存空间,并且该模拟过
3、程对程序是透盘空间模拟内存空间,并且该模拟过程对程序是透明的。明的。3 3用户地址空间用户地址空间与与内核地址空间内核地址空间1. Windows将每个进程的将每个进程的4GB的独立地址空间又划分的独立地址空间又划分为为用户地址空间用户地址空间(0x000000000x7FFFFFFF)和和 内核地址空间内核地址空间(0x800000000xFFFFFFFF)两部分。两部分。2.操作系统内核代码和数据存放在操作系统内核代码和数据存放在内核地址空间内核地址空间;每;每个进程自己私有的代码和数据存放在个进程自己私有的代码和数据存放在用户地址空间用户地址空间3.虽然虽然Windows的内核代码和数据
4、被映射到了每个进的内核代码和数据被映射到了每个进程的地址空间中(所有进程看到的内容是相同的),程的地址空间中(所有进程看到的内容是相同的),但在实际的物理内存中,只有内核代码和数据的一但在实际的物理内存中,只有内核代码和数据的一份拷贝。份拷贝。4 4用户地址空间用户地址空间与与内核地址空间内核地址空间5 5用户模式用户模式与与内核模式内核模式1.为了更好地保护系统,为了更好地保护系统,Windwos规定了两种处理器工作模式:规定了两种处理器工作模式:用户模式用户模式和和内核模式内核模式。2.工作在工作在用户模式用户模式的程序只能使用的程序只能使用CPU支持指令集的一个子集,支持指令集的一个子集
5、,只能访问用户空间中的内存,并且不能直接访问硬件。只能访问用户空间中的内存,并且不能直接访问硬件。3.工作在工作在内核模式内核模式的程序不受任何限制,可以使用的程序不受任何限制,可以使用CPU支持的支持的任意指令,可以访问任意的内存空间,可以直接访问硬件。任意指令,可以访问任意的内存空间,可以直接访问硬件。4.所有的所有的Windows应用程序都工作于应用程序都工作于用户模式用户模式,Windows内核内核程序都工作于程序都工作于内核模式内核模式。5.也可以认为:位于也可以认为:位于用户空间用户空间的代码都工作于的代码都工作于用户模式用户模式,位于,位于内核空间内核空间的代码都工作于的代码都工
6、作于内核模式内核模式。6.应用程序只能通过应用程序只能通过Windows规定的一些规定的一些API访问内核模式的代访问内核模式的代码和数据。码和数据。6 6什么是什么是Windows驱动程序?驱动程序?1.Windows驱动程序是一种驱动程序是一种位于内核地址空间位于内核地址空间并且并且 工工作于内核模式作于内核模式的一种特殊的程序类型的一种特殊的程序类型(.sys文件文件)。2.驱动程序是操作系统信任的一个驱动程序是操作系统信任的一个内核扩展模块内核扩展模块。3.驱动程序和操作系统之间遵循的是驱动程序和操作系统之间遵循的是容器与插件容器与插件模型。模型。OS负责管理负责管理Driver的生命
7、周期;的生命周期;Driver是一种被动是一种被动的软件模块。的软件模块。4.驱动程序类似于驱动程序类似于DLL程序,它是一个回调函数程序,它是一个回调函数(子子程序程序)的集合体,这些函数由的集合体,这些函数由OS在适当的时候调用在适当的时候调用5.驱动程序也可以通过驱动程序也可以通过Windows内核内核API获得获得OS的一的一些服务。些服务。7 7编驱动程序用什么编程语言?编驱动程序用什么编程语言?1.C语言语言2.C+语言语言3.1的情况下会用到的情况下会用到汇编语言汇编语言4.目前还不能用其它高级语言编写驱动程序。目前还不能用其它高级语言编写驱动程序。8 8编驱动程序用什么开发工具
8、?编驱动程序用什么开发工具?1.DDK (Driver Development Kit) (可以到微软网站可以到微软网站上免费下载上免费下载)2.Driver Studio(Compuware NuMega公司的产品)公司的产品)DDK3.WinDriver DDK9 9DDK中包含什么?中包含什么?1.与与Windows内核内核API函数相关的函数相关的头文件头文件(如如ddk.h, wdm.h等等)2.与与Windows内核内核API函数相关的函数相关的导入库导入库(wdm.lib等等)3.内核专用内核专用C运行时间库运行时间库的头文件和导入库的头文件和导入库4.关于驱动程序编程模型和内核
9、关于驱动程序编程模型和内核API函数的函数的帮助文档帮助文档5.C+编译器和链接器,综合创建工具编译器和链接器,综合创建工具6.内核调试工具、分析工具内核调试工具、分析工具1010驱动程序的入口函数驱动程序的入口函数extern “C” #include “wdm.h” extern CNTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) return STATUS_SUCCESS;1111HelloWorld版的驱动程序版的驱动程序extern “C” #include “wd
10、m.h” extern CNTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)NTSTATUS status = STATUS_DEVICE_CONFIGURATION_ERROR;KdPrint(Hellow World!);return status;1212内核模式下我们内核模式下我们能能调用哪些函数?调用哪些函数?1.Windows内核输出的内核输出的内核内核API函数函数;2.DDK提供的运行时间库提供的运行时间库3.其它驱动程序提供的服务其它驱动程序提供的服务1313
11、内核模式下我们内核模式下我们不能不能调用哪些函数?调用哪些函数?1.Windows的的用户模式用户模式API函数函数;2.ISO规定的规定的C/C+标准函数库标准函数库1414DDK中一个驱动型工程的组成中一个驱动型工程的组成1.MAKEFILE文件,一般不作改动文件,一般不作改动2.Sources文件文件:(1) 指示了整个工程由哪些源程序和指示了整个工程由哪些源程序和资源文件构成资源文件构成; (2) 包含了主要的编译参数,指导包含了主要的编译参数,指导编译器和链接器的工作。编译器和链接器的工作。3.cpp文件和文件和.h文件文件1515如何安装驱动程序?如何安装驱动程序?1.必须编写一个
12、必须编写一个安装指示文件安装指示文件(.inf)指导指导Windows将将驱动程序安装到指定位置驱动程序安装到指定位置(一般安装在一般安装在windowssystem32drivers子目录下子目录下),并在注册表,并在注册表中进行登记。中进行登记。2.对于对于即插即用即插即用类设备的驱动,操作系统会自动发现类设备的驱动,操作系统会自动发现该设备并调用该设备并调用“添加新硬件添加新硬件”程序向用户询问相应程序向用户询问相应的的inf文件的位置。文件的位置。3.对于非即插即用类设备的驱动,用户必须自己手动对于非即插即用类设备的驱动,用户必须自己手动调用调用“添加新硬件添加新硬件”程序,并通过告诉
13、该程序程序,并通过告诉该程序inf文文件的位置。件的位置。1616inf文件主要包含了哪些内容?文件主要包含了哪些内容?1.设备类型、设备型号、厂商信息、程序版本号设备类型、设备型号、厂商信息、程序版本号。2.对操作系统版本和对操作系统版本和CPU类型的要求类型的要求3.源文件源文件(.sys文件文件)的文件名和所在位置的文件名和所在位置4.安装目标子目录安装目标子目录5.在注册表中添加哪些内容在注册表中添加哪些内容6.硬件配置信息硬件配置信息7.安全配置信息安全配置信息1717“即插即用即插即用”型外设型外设1.从用户角度看,从用户角度看,即插即用外设即插即用外设具备如下两种能力:具备如下两
14、种能力:主机能够自动发现该外设;主机能够自动查找并加载相应的驱动程序。2.从专业角度看,从专业角度看,即插即用型外设即插即用型外设还具有如下功能:还具有如下功能:能够利用即插即用总线协议向主机汇报自己的唯一标识信息和I/O资源请求;能够通过即插即用总线协议接收主机的I/O资源分配结果并对自己的硬件逻辑作出相应的调整。3.常用的常用的I/O资源包括:资源包括:I/O地址空间、内存空间、中地址空间、内存空间、中断号、断号、DMA通道号等。通道号等。1818总线总线与与总线驱动总线驱动1.可以这样认为,一台计算机中除了可以这样认为,一台计算机中除了CPU和内存之外和内存之外的其他硬件模块都可以称之为
15、的其他硬件模块都可以称之为外设外设。凡是外设都需凡是外设都需要驱动程序要驱动程序。2.CPU与外设之间的连接和通信必须通过与外设之间的连接和通信必须通过总线总线。一条。一条总线即可以链接一台外设,也可以连接多台外设。总线即可以链接一台外设,也可以连接多台外设。3.以以CPU本身的地址总线和数据总线为根,计算机系本身的地址总线和数据总线为根,计算机系统中的各类总线形成一种统中的各类总线形成一种树形结构树形结构。4.总线也被视为总线也被视为外设外设,也需要驱动程序支持。这类总,也需要驱动程序支持。这类总线型外设的驱动被称为线型外设的驱动被称为总线驱动总线驱动。5.CPU本身的总线所对应的驱动称为本
16、身的总线所对应的驱动称为“根总线驱动根总线驱动”1919总线总线的树形结构的树形结构2020即插即用总线即插即用总线1.能够连接即插即用设备的总线称为能够连接即插即用设备的总线称为即插即用总线即插即用总线。2.每一种即插即用总线都规定了一套每一种即插即用总线都规定了一套即插即用协议即插即用协议用用于和设备之间的身份识别,于和设备之间的身份识别,I/O 资源协商等。资源协商等。3.常见的即插即用总线包括:常见的即插即用总线包括:PnP-ISA、PCI、USB、1394、PCMCIA等等2121即插即用型设备驱动的加载过程即插即用型设备驱动的加载过程现假设驱动程序已被正确安装:现假设驱动程序已被正
17、确安装:1.某种某种PnP总线驱动发现了即插即用设备的存在:总线驱动发现了即插即用设备的存在:对于热插拔设备,则发现过程发生于插入设备的瞬间;如果是非热插拔设备,则发现过程发生于系统启动时2.PnP总线驱动利用即插即用协议询问设备的总线驱动利用即插即用协议询问设备的ID信息信息1.设备的ID信息是一个能够唯一标识该设备的字符串,一般格式为:总线类型总线类型&厂商厂商ID&产品产品ID&设备设备ID&版本号版本号3.PnP总线驱动将该总线驱动将该ID信息上报给信息上报给OS4.OS利用该设备利用该设备ID信息查找信息查找硬件键硬件键(注册表注册表HKLM SYSTEMCurrentControl
18、SetEnum的某个子目录的某个子目录)2222即插即用型设备驱动的加载过程即插即用型设备驱动的加载过程5.OS查找到该设备的硬件键之后,再通过硬件键的查找到该设备的硬件键之后,再通过硬件键的Service子键查到该设备的子键查到该设备的服务键服务键(HKLMSYSTEM CurrentControlSetServices的的某个子目录某个子目录)6.通过服务键的通过服务键的ImagePath子键的值就可以找到该设子键的值就可以找到该设备所对应的驱动程序。备所对应的驱动程序。7.OS扫描内存,看该驱动是否已被加载,如果没有,扫描内存,看该驱动是否已被加载,如果没有,则立即加载该驱动,并调用该驱
19、动的则立即加载该驱动,并调用该驱动的“DiverEnry”回调函数。回调函数。8.加载完毕之后,加载完毕之后,OS调用该驱动的调用该驱动的“AddDevice”回回调函数通知驱动程序有新的设备到来。调函数通知驱动程序有新的设备到来。2323即插即用型设备驱动的加载过程即插即用型设备驱动的加载过程9.PnP总线驱动利用即插即用协议询问设备的总线驱动利用即插即用协议询问设备的I/O资源资源请求,并将请求信息上报给请求,并将请求信息上报给OS;10.OS根据目前系统资源使用情况进行资源分配,并根据目前系统资源使用情况进行资源分配,并将分配结果反馈给总线驱动和该设备的驱动;将分配结果反馈给总线驱动和该
20、设备的驱动;11.现在该设备的硬件和驱动都知道了资源分配结果就现在该设备的硬件和驱动都知道了资源分配结果就可以正常工作了。可以正常工作了。2424非即插即用型设备驱动的加载过程非即插即用型设备驱动的加载过程1.非非PnP总线驱动在系统启动时通过扫描注册表发现总线驱动在系统启动时通过扫描注册表发现非非PnP设备的存在,并向设备的存在,并向OS报告报告ID信息。信息。(例如根例如根总线驱动通过扫描总线驱动通过扫描HKLM SYSTEM CurrentControlSetEnumRoot的各个子目录。的各个子目录。)2.后面的加载步骤与即插即用型设备类似。后面的加载步骤与即插即用型设备类似。3.唯一
21、不同的是非唯一不同的是非PnP设备的资源请求直接写在了注设备的资源请求直接写在了注册表里,总线驱动不再询问设备。册表里,总线驱动不再询问设备。2525递归加载递归加载1.根总线驱动根总线驱动负责发现并装载挂到它上面的二级总线负责发现并装载挂到它上面的二级总线(如(如PCI、ISA等)的驱动。等)的驱动。2.二级总线二级总线的驱动被装载并正常工作之后负责发现挂的驱动被装载并正常工作之后负责发现挂在它们上面的外设以及在它们上面的外设以及三级总线三级总线的驱动,并依次类的驱动,并依次类推。这个过程称为推。这个过程称为递归加载过程递归加载过程。2626如何卸载驱动程序?如何卸载驱动程序?1.在在控制面
22、板控制面板 系统系统 硬件硬件设备管理器设备管理器中找到该中找到该设备并右击设备并右击“卸载卸载”2727基于基于I/O请求包请求包(IRP)的工作方式的工作方式2828驱动的层次结构驱动的层次结构1.在在Windows系统中,与一个设备相关的驱动程序至系统中,与一个设备相关的驱动程序至少包含两种:少包含两种:功能驱动功能驱动和和总线驱动总线驱动。2.另外一个设备还可以包含可选的另外一个设备还可以包含可选的过滤驱动过滤驱动。3.Windows为每个驱动程序都建立一个数据结构为每个驱动程序都建立一个数据结构Driver Object,用于记录与该驱动本身相关的信息,用于记录与该驱动本身相关的信息
23、4.每个驱动程序为属于自己管理的设备创建一个数据每个驱动程序为属于自己管理的设备创建一个数据结构结构Device Object,用于记录与设备相关的信息。,用于记录与设备相关的信息。5.功能驱动创建的功能驱动创建的Device Object叫叫FDO,过滤驱动创,过滤驱动创建的叫建的叫FiDO,总线驱动创建的叫,总线驱动创建的叫PDO。6.FDO、FiDO和和PDO串连在一起形成串连在一起形成设备对象栈设备对象栈。2929驱动的层次结构驱动的层次结构 3030驱动对象驱动对象(Driver Object)1.在操作系统首次装载一个驱动程序之后,它会创建在操作系统首次装载一个驱动程序之后,它会创
24、建一个数据结构用来记录该驱动,该数据结构我们称一个数据结构用来记录该驱动,该数据结构我们称为为驱动对象驱动对象(Driver Object)。2.驱动对象驱动对象记录与驱动程序本身相关的信息,它主要记录与驱动程序本身相关的信息,它主要包含了除了包含了除了DriverEntry之外的其它驱动程序入口之外的其它驱动程序入口函数的入口地址。(函数的入口地址。(驱动程序是一种具有多个入口驱动程序是一种具有多个入口函数的程序函数的程序)3.驱动对象是由操作系统创建,然后作为驱动对象是由操作系统创建,然后作为DriverEntry的第一个参数传递给你的程序。的第一个参数传递给你的程序。4.在获得驱动对象的
25、指针之后,你的程序需要对其中在获得驱动对象的指针之后,你的程序需要对其中的一些字段进行初始化。的一些字段进行初始化。3131驱动对象驱动对象(Driver Object)1.驱动对象在驱动对象在DDK的头文件的头文件(Wdm.h)中按如下方式定中按如下方式定义:。义:。typedefstruct_DRIVER_OBJECTCSHORTType;CSHORTSize;DRIVER_OBJECT,*PDRIVER_OBJECT;2.由上面的定义可以看成,驱动对象不同于由上面的定义可以看成,驱动对象不同于C+中的中的Class,它只是一个,它只是一个Struct。32323333驱动对象的一些关键字
26、段驱动对象的一些关键字段(一一)1.DriverStartIo (PDRIVER_STARTIO) : 指向指向StartIO入入口函数的指针口函数的指针.2.DriverUnload (PDRIVER_UNLOAD) :指向:指向DriverUnload入口函数的指针。在驱动程序被从内入口函数的指针。在驱动程序被从内存中卸载时,存中卸载时,DriverUnload入口函数会被操作系统入口函数会被操作系统调用,你应该在该函数内部做一些与调用,你应该在该函数内部做一些与DriverEntry向对应的资源清除工作。向对应的资源清除工作。3.MajorFunction (一个数组,数组中每一元素又是
27、一一个数组,数组中每一元素又是一个指向函数的指针个指向函数的指针 PDRIVER_DISPATCH):数组:数组中每一个指针指向一个入口函数。在接收到不同的中每一个指针指向一个入口函数。在接收到不同的请求包请求包(IRP)时,时,OS会调用不同的入口函数。会调用不同的入口函数。3434驱动对象的一些关键字段驱动对象的一些关键字段(二二)4.DeviceObject (PDEVICE_OBJECT) : 指向一个链表的指向一个链表的指针,该链表中每一个节点都存储了一个指针,该链表中每一个节点都存储了一个FDO对象。对象。每一个每一个FDO都代表一个由该驱动维护的硬件设备实都代表一个由该驱动维护的硬件设备实例。例。在在WDM模型中,该链表由模型中,该链表由OS自动维护自动维护。5.DriverExtension (PDRIVER_EXTENSION) :指向另外:指向另外一个结构体,该结构体中唯一有用的字段为一个结构体,该结构体中唯一有用的字段为 AddDevice 。AddDevice字段指向一个入口函数。字段指向一个入口函数。在操作系统发现一个新的设备实例时,它会自动调在操作系统发现一个新的设备实例时,它会自动调用用AddDevice函数,你应该在该函数中做一些与设函数,你应该在该函数中做一些与设备实例相关的初始化工作。备实例相关的初始化工作。3535