驱动程序的基本结构

上传人:ji****72 文档编号:48586928 上传时间:2018-07-17 格式:PPT 页数:35 大小:265KB
返回 下载 相关 举报
驱动程序的基本结构_第1页
第1页 / 共35页
驱动程序的基本结构_第2页
第2页 / 共35页
驱动程序的基本结构_第3页
第3页 / 共35页
驱动程序的基本结构_第4页
第4页 / 共35页
驱动程序的基本结构_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《驱动程序的基本结构》由会员分享,可在线阅读,更多相关《驱动程序的基本结构(35页珍藏版)》请在金锄头文库上搜索。

1、Version 1.0驱动程序的基本结构最简单的驱动程序extern “C” #include extern “C“ NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) NTSTATUS status = STATUS_UNSUCCESSFUL; KdPrint(“Hello World!“); return status; 2 2驱动程序的入口函数NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE

2、_STRING RegistryPath) return status; 1. 参数DriverObject表示指向驱动对象的指针;2. 参数RegistryPath表示该驱动所对应的注册表服务 键的子目录3. 返回值表示初始化是否成功3 3内核模式下我们能调用哪些函数?1. Windows内核输出的内核API函数;2. DDK提供的运行时间库3. 其它驱动程序提供的服务4 4内核模式下我们不能调用哪些函数?1. Windows的用户模式API函数;2. ISO规定的C/C+标准函数库5 5DDK中一个驱动型工程的组成1. MAKEFILE文件,一般不作改动2. Sources文件:(1) 指

3、示了整个工程由哪些源程序 和资源文件构成; (2) 包含了主要的编译参数,指导 编译器和链接器的工作。 3. .cpp文件和.h文件6 6如何安装NT型驱动程序?1. 方法1:在注册表HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices下增加一个 新的项目。可以将该服务指定为开机自启动,也可 以指定为按需启动。如果是按需启动,则可以用 net start命令启动,用net stop命令停止。2. 方法2:编写另外的用户模式程序利用SCM函数 按需启动。 3. 方法3:在调试阶段可以利用第三方的工具如: DriverMoniter和IntallDri

4、ver随时安装和卸载。7 7如何安装WDM驱动程序?1. 必须编写一个安装指示文件(.inf)指导Windows 将驱动程序安装到指定位置(一般安装在 windowssystem32drivers子目录下),并在注册表 中进行登记。2. 对于即插即用类设备的驱动,操作系统会自动发 现该设备并调用“添加新硬件”程序向用户询问相应 的inf文件的位置。3. 对于非即插即用类设备的驱动,用户必须自己手 动调用“添加新硬件”程序,并通过告诉该程序inf文 件的位置。8 8inf文件主要包含了哪些内容?1. 设备类型、设备型号、厂商信息、程序版本号 。2. 对操作系统版本和CPU类型的要求3. 源文件(

5、.sys文件)的文件名和所在位置4. 安装目标子目录5. 在注册表中添加哪些内容6. 硬件配置信息7. 安全配置信息9 9驱动对象(Driver Object)1. 在操作系统首次装载一个驱动程序之后,它会 创建一个数据结构用来记录该驱动,该数据结构我 们称为驱动对象(Driver Object)。2. 驱动对象记录与驱动程序本身相关的信息,它主 要包含了除了DriverEntry之外的其它驱动程序入 口函数的入口地址。(驱动程序是一种具有多个入 口函数的程序)3. 驱动对象是由操作系统创建,然后作为 DriverEntry的第一个参数传递给你的程序。4. 在获得驱动对象的指针之后,你的程序需

6、要对其 中的一些字段进行初始化。1010驱动对象(Driver Object)1. 驱动对象在DDK的头文件(ntddk.h)中按如下方 式定义:。typedef struct _DRIVER_OBJECT CSHORT Type; CSHORT Size; DRIVER_OBJECT, *PDRIVER_OBJECT; 2. 由上面的定义可以看成,驱动对象不同于C+中 的Class,它只是一个Struct。11111212驱动对象的一些关键字段(一)1. DriverStartIo (PDRIVER_STARTIO) : 指向 StartIO入口函数的指针.2. DriverUnload (

7、PDRIVER_UNLOAD) :指向 DriverUnload入口函数的指针。在驱动程序被从内 存中卸载时,DriverUnload入口函数会被操作系统 调用,你应该在该函数内部做一些与DriverEntry 向对应的资源清除工作。 3. MajorFunction (一个数组,数组中每一元素又是 一个指向函数的指针 PDRIVER_DISPATCH):数 组中每一个指针指向一个入口函数。在接收到不同 的请求包(IRP)时,OS会调用不同的入口函数。1313驱动对象的一些关键字段(二)4. DeviceObject (PDEVICE_OBJECT) : 指向一个链 表的指针,该链表中每一个节

8、点都存储了一个FDO 对象。每一个FDO都代表一个由该驱动维护的硬件 设备实例。在WDM模型中,该链表由OS自动维护 。 5. DriverExtension (PDRIVER_EXTENSION) :指 向另外一个结构体,该结构体中唯一有用的字段为 AddDevice 。AddDevice字段指向一个入口函数。 在操作系统发现一个新的设备实例时,它会自动调 用AddDevice函数,你应该在该函数中做一些与设 备实例相关的初始化工作。1414DriverEntry函数的主要工作1. 在操作系统创建的驱动对象中填写其它入口函数的地址 ,使得操作系统在必要的时候能够找到这些入口函数并调用 它们。

9、2. 创建一个或多个设备对象,并将这些对象挂接在驱动对象 所指示的链表上。(只针对NT型驱动)3. 与该设备相关的其他初始化工作VOID (*PDRIVER_UNLOAD) ( IN PDRIVER_OBJECT DriverObject);VOID (*PDRIVER_STARTIO) (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp );NTSTATUS (*PDRIVER_DISPATCH) (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp );NTSTATUS (*PDRIVER_ADD_DEVICE) (IN

10、 PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject );1515DriverUnload函数的主要工作1. 删除以链表形式挂接在驱动对象上的一个或多 个 设备对象。(只针对NT型驱动)2. 进行与DriverEntry函数中相对应的反初始化工作 。例如如果在DriverEntry函数中申请了堆内存, 那么在DriverUnload函数中应该释放该堆内存。VOID DriverUnload(PDRIVER_OBJECT DriverObject)RtlFreeUnicodeString(1616第二简单的驱动程序

11、extern “C” #include VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject); NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp); extern “C“ NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) NTSTATUS status = STATUS_SUCCESS; KdPrint(“Enter

12、DriverEntryn“); KdPrint(“RegistryPath: %wZn“, pRegistryPath);pDriverObject-DriverUnload = HelloDDKUnload; pDriverObject-MajorFunctionIRP_MJ_CREATE = HelloDDKDispatchRoutine; pDriverObject-MajorFunctionIRP_MJ_CLOSE = HelloDDKDispatchRoutine; pDriverObject-MajorFunctionIRP_MJ_WRITE = HelloDDKDispatchR

13、outine; pDriverObject-MajorFunctionIRP_MJ_READ = HelloDDKDispatchRoutine;KdPrint(“Leave DriverEntryn“);return status; 1717第二简单的驱动程序(续)VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) KdPrint(“Enter DriverUnloadn“); KdPrint(“Leave DriverUnloadn“); NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJE

14、CT pDevObj, IN PIRP pIrp) NTSTATUS status = STATUS_SUCCESS; KdPrint(“Enter HelloDDKDispatchRoutinen“); KdPrint(“Leave HelloDDKDispatchRoutinen“); return status; 1818设备对象(Device Object)1. 针对每一个硬件设备,Windows都需要用一个 数据结构来记录它的相关信息,这个数据结构就叫 做 设备对象(Devcie Object)。2. 因为一个驱动程序可以同时管理多个同类型的硬 件设备,因此一个驱动对象可以对应多个设

15、备对象 。3. 对应同一个驱动对象的多个设备对象构成一个链 表挂接在驱动对象的DeviceObject字段上。4. 设备对象由驱动程序负责创建和初始化,由操作 系统负责保存和管理。5. 设备对象可以有名字,其他驱动程序或应用程序 可以通过该名字找到该设备对象。1919The Device Object2020设备对象的一些关键字段(一)1. DriverObject (PDRIVER_OBJECT) :指向与该 设备对象相对应的驱动对象的指针。 2. NextDevice (PDEVICE_OBJECT):指向下一个设 备对象的指针,利用该字段与同一个驱动对象对应 的多个设备对象就可以构成一个

16、单链表,该链表最 后挂接在驱动对象的DeviceObject字段上。2121设备对象的一些关键字段(二)3. Flags (ULONG):保存了一些标志位,这些标志 位指示了该设备的一些工作方式。DO_BUFFERED_IO Reads and writes use the buffered method (system copy buffer) for accessing usermode data. DO_DIRECT_IO Reads and writes use the direct method (memory descriptor list) for accessing usermode data. DO_EXCLUSIVEOnly one thread at a time is allowed to open a handle.DO_DEVICE_I

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号