windows驱动程序分类,驱动程序对象与设备对象

1、三种类型的windows WDM驱动程序

  • 总线驱动程序(bus driver)
  • 功能驱动程序(function driver)
  • 过滤驱动程序(filter driver)

2、Windows  驱动程序其他分类方法

  • 类驱动程序(class driver)
  • 端口驱动程序(port driver)
  • 小端口驱动程序(miniort driver)

3、Windows 驱动程序对象(DRIVER_OBJECT)主要成员

  • DeviceObject: 指向一个设备对相链表,每个设备对象代表一个设备。
  • DriverExtension: 一个结构体, 该结构只有AddDevice成员可以直接访问。
  • DriverStartIo: 指向驱动程序中处理I/O请求的函数。
  • DriverUnload: 指向驱动程序中的清除函数。
  • MajorFunction: 为一个函数指针表, 指向存在于驱动程序中的各个IRP处理函数, 它定义了I/O请求如何进入驱动程序。

4、设备对象(DEVICE_OBJECT)主要成员

DriverObject: 指向与该设备对象相关的驱动程序对象。过滤驱动程序有时需要用这个指针来寻找被过滤设备的驱动程序对象。

5、驱动程序对象与设备对象的关系

一方面, 驱动程序对象通常有多个与它相关的设备对象,因此它利用DeviceObject指针指向一个设备对象列表,该列表表示驱动程序可以控制的物理设备。
另一方面, 设备对象反过来指向它自己的驱动程序对象, 这样I/O管理器就知道在接收一个I/O请求时应该调用哪个驱动程序。每个功能码都对应一个驱动程序的入口点。

6、I/O请求包(IRP)

IRP是I/O系统用来存储处理I/O请求所需信息的地方, I/O管理器在IRP中保存一个指向调用者文件对象的指针。从驱动程序编程的角度看, IRP是I/O管理器在响应一个I/O请求时从非分页系统内存中分配的一块可变大小的数据结构内存, I/O管理器每收到一个来自用户的请求就创建一个该结构,并将其作为参数传给驱动程序的DispatchXxx、StartIo等例程。

该结构中存放有请求的类型、用户缓冲区的首地址、用户请求数据的长度等信息。驱动程序处理完这个请求后, 也在该结构中添加处理结果的有关信息, 然后调用IoCompleteRequest将其返回给I/O管理器, 用户程序的请求随即返回。

7、单层驱动程序的I/O请求

  • I/O请求经过子系统DLL
  • 子系统DLL调用I/O管理器的NtWriteFile服务
  • I/O管理器分配一个描述该请求的的IRP, 并通过调用IoCallDriver函数向驱动程序(这里指设备驱动程序)发送请求
  • 驱动程序将IRP中的数据传输到设备并启动I/O操作
  • 通过中断CPU, 驱动程序发信号进行I/O完成操作
  • 在设备完成操作并且中断CPU时, 设备驱动程序服务于中断
  • 驱动程序调用IoCompleteRequest函数表明它已经处理完IRP请求, 接管I/O管理器完成I/O请求

驱动程序可用的内核态例程:

总线驱动程序和类特定的例程:

  • IRP_MJ_CREATE    创建或打开设备文件
  • IRP_MJ_CLOSE    关闭句柄
  • IRP_MJ_READ    读
  • IRP_MJ_WRITE    写
  • IRP_MJ_CLEANUP    取消文件句柄上的任何等待的IRP
  • IRP_MJ_DEVICE_CONTROL   设备I/O控制
  • IRP_MJ_INTERNAL_DEVICE_CONTROL  来自高层驱动程序的I/O控制
  • IRP_MJ_SYSTEM_CONTROL   WMI
  • IRP_MJ_POWER    电源管理请求
  • IRP_MJ_PNP    即插即用消息
  • IRP_MJ_SHUTDOWN    关闭通知

设备名:

  • 符号链接:这个名字向内核标识设备,而不是向Win32标识设备。根据约定,内核设备名从0开始编号,而符号链接名从1开始编号。用IoCreateSymbolicLink创建。
  • 设备接口:驱动程序使用设备接口使它的设备对Win32程序可见,主要思想是:每个设备使一个定义的应用程序编程接口(API)可用,全局唯一标识符(GUID)用于标识这个接口。

Windows驱动内核态例程,总线驱动和类特定的例程,驱动出错的方式

此条目发表在 windows驱动开发 分类目录,贴了 , 标签。将固定链接加入收藏夹。

发表评论