WDF驱动简介及几个驱动对象介绍

1.1   WDF简述:
WDF是微软提出的全新驱动程序模型,它提供了面向对象、事件驱动的驱动程序开发框架,对它的研究是设计高效稳定设备驱动程序的基础。注意理解WDF模型的特点,对象模型,以及基本结构.

设备驱动程序是硬件设备连接到计算机系统的软件接口,任何设备都必须有相应的驱动程序才能在计算机系统上正常工作。设备驱动程序的优劣直接关系到整个系统的性能和稳定性,因此,设计和开发稳定高效的驱动程序具有重要意义。

WDF(Windows Driver Foundation)是微软提出的下一代全新的驱动程序模型,它是在WDM(Windows Driver Model)的基础上发展而来的,支持面向对象、事件驱动的驱动程序开发,提供了比WDM更高层次抽象的高度灵活、可扩展、可诊断的驱动程序框架。WDF框架管理了大多数与操作系统相关的交互,实现了公共的驱动程序功能(如电源管理、PNP支持),隔离了设备驱动程序与操作系统内核,降低了驱动程序对内核的影响。

WDF提供了两个框架:KMDF(内核模式驱动程序框架)和UMDF(用户模式驱动程序框架)。

 

1.2   WDF对象模型
KMDF框架支持面向对象、事件驱动的驱动程序模型

它定义了一系列的对象用来表示设备、驱动、中断等,每个对象有对应的属性、方法和事件。驱动程序利用这些方法创建对象、设置属性和响应事件。

框架定义的主要对象有:

1.2.1 WDFDRIVER对象
对应于WDM中的DRIVER-OBJECT,描述驱动在内存中的实例,包括加载的位置、有关的属性和所管理的设备。

1.2.2 WDFDEVICE对象
对应于WDM中的DEVICE-OBJECT,描述由驱动程序管理的单个设备实

例。设备可以是命名的也可以是未命名的,用户模式程序可以通过设备接口或设备名称访问设备。WDFDEVICE对象具有丰富的属性,如PNP和电源管理相关的事件处理回调函数(callbacks)。

1.2.3 WDFREQUEST对象
对应于WDM中的IRP,表示一个I/O请求。

1.2.4 WDFQUEUE对象
每个WDFQUEUE对象和一个WDFDEVICE对象关联,描述一个特殊的I/O请求队列。它具有一系列的事件处理回调函数,当I/O请求进入队列时,框架将自动调用驱动程序中对应的callback。

1.2.5 WDFINTERRUPT对象
表示设备中断。驱动程序可以通过WDFINTERRUPT对象的中断使能和禁止事件处理callbacks使能或禁止设备中断;通过ISR和DPC for ISR例程处理设备中断。

 

1.3          WDF的对象模型是层次化的模型。
WDFDRIVER对象是根对象,其他对象都是它的子对象。对于大多数对象,驱动程序在创建它们的时候可以指定父对象,如果没有指定,则框架默认其父对象为WDF DRIVER对象。

WDF大大简化了WDM中的PNP和电源管理的开发。WDF框架为设备停止、设备删除、电源状态切换等PNP和电源管理事件提供了适合的缺省行为,驱动程序本身不再纠缠于复杂的PNP和电源管理事件处理。

 

1.4          WDF请求队列
一个设备可以有多个请求队列,每个请求队列可以有一种模式。

1.4.1  WdfIoQueueDispatchSerial模式
请求队列将请求串行化后再处理

1.4.2  WdfIoQueueDispatchParallel模式
自动在每个请求到来时调用相应的回调函数;

1.4.3  WdfIoQueueDispatchManual模式
允许驱动程序手工分发请求,类似于WDM的工作方式。

 

在WDM驱动程序中,I/O请求的取消是一个复杂难以理解的过程,开发人员必须有对内核深刻的理解才能正确处理I/O请求的取消。WDF框架支持内建的I/O请求取消处理,使得驱动程序处理取消I/O请求的工作大大简化。

 

 

1.5           I/O请求包(IRP) 
1.5.1  IRP简介
IRP是I/O系统用来存储处理I/O请求所需信息的地方, I/O管理器在IRP中保存一个指向调用者文件对象的指针。

从编程的角度看, IRP是I/O管理器在响应一个I/O请求时从非分页系统内存中分配的一块可变大小的数据结构内存, I/O管理器每收到一个来自用户的请求就创建一个该结构,并将其作为参数传给驱动程序的DispatchXxx、StartIo等例程。该结构中存放有请求的类型、用户缓冲区的首地址、用户请求数据的长度等信息。驱动程序处理完这个请求后, 也在该结构中添加处理结果的有关信息, 然后调用IoCompleteRequest将其返回给I/O管理器, 用户程序的请求随即返回。     

  每个IRP可以被看成由两部分组成:

 固定部分和一个I/O堆栈。IRP的固定部分包含关于请求的信息, I/O堆栈则包含一系列I/O堆栈单元(I/O Stack location), 单元的数目应与驱动程序堆栈中处理这一请求的驱动程序数目相同, 每个单元对应一个将处理该IRP的驱动程序。     

1.5.2  IRP固定部分的域
 MdlAddress(Memory Descriptor List, MDL): 指向一个内存描述表。当驱动程序使用直接I/O时, MDL用来描述一个与该请求相关联的用户模式缓冲区       AssociatedIrp: 该域是一个三指针联合, 其中与WDM驱动程序相关的指针是AssociatedIrp.SystemBuffer。如果设备执行缓冲I/O, 则SystemBuffer指针指向系统空间缓冲区, 否则为NULL。 

      RequestorMode: 取值为一个枚举常量UserMode或KernelMode, 指定请求初始化的模式为用户模式还是核心模式。驱动程序有时需要查看这个值来决定是否需要信任某些参数 

      Cancel: 该域为BOOLEAN类型。如果为TRUE, 则表明IoCancelIrp已被调用, 该函数用于取消这个请求。如果为FALSE, 则表明没有调用IoCancelIrp函数 

      CancelIrql: 一个IRQL(I/O Request Query Level)值, 表明那个专用的取消自旋锁是在这个IRQL上获取的。当驱动程序在取消例程中释放自旋锁时应该参考这个域 

      CancelRoutine: 指向驱动程序取消例程的地址。应该使用IoSetCancelRoutine函数设置CancelRoutine域而不是直接修改该域  

1.5.3      IRP堆栈单元中的域 
      任何内核模式程序在创建一个IRP时, 同时还创建了一个与之关联的I/O堆栈。堆栈中的I/O堆栈单元由IO_STACK_LOCATION结构定义, 每个堆栈单元都对应一个将处理的IRP的驱动程序。为了在一个给定的IRP中确定当前的IRP I/O堆栈单元, 驱动程序可以调用IoGetCurrentIrpStackLocation函数, 该函数返回当前I/O堆栈单元的指针。 

      MajorFunction: 该IRP的主要功能代码, 它指出所要执行的I/O操作类型。例如: 主功能代码IRP_MJ_READ表示通过Win32 API函数CreateFile发送的请求。主功能代码与驱动程序对像的MajorFunction表中的某个分发函数指针相对应。 

      MinorFunction: 该IRP的副功能代码, 它进一步指出该IRP属于哪个主功能类。例如: IRP_MJ_PNP请求有十几个副功能代码, 包括IRP_MN_START_DEVICE、IRP_MN_REMOVE_DEVICE等。 

      DeviceObject: 指向该堆栈单元对应的设备对象地址, 该域由IoCallDriver函数负责填写。 

      FileObject: 指向与一个I/O请求有关的文件对象地址。  

1.5.4  I/O功能代码 
      IRP_MJ_CREATE: 打开设备  CreateFile 

IRP_MJ_CLEANUP: 在关闭设备时, 取消挂起的I/O请求  CloseHandle       

IRP_MJ_CLOSE: 关闭设备  CloseHandle

 IRP_MJ_READ: 从设备获得数据  ReadFile       

IRP_MJ_WRITE: 向设备发送数据  WriteFile 

       IRP_MJ_DEVICE_CONTROL: 对用户模式或内核模式客户可用的控制操作  DeviceControl 

       IRP_MJ_INTERNAL_DEVICE_CONTROL: 只对内核模式客户程序可用的控制操作  没有对应的Win32 API 

IRP_MJ_QUERY_INFORMATION: 得到文件的长度  GetFileLength       

IRP_MJ_SET_INFORMATION: 设置文件的长度  SetFileLength 

      IRP_MJ_FLUSH_BUFFERS: 写输出缓冲区或丢弃输入缓冲区  FlushFileBuffers  FlushConsoleInputBuffer  PureComm 

      IRP_MJ_SHUTDOWN: 系统关闭  InitialSystemShutdown   
--------------------- 
原文:https://blog.csdn.net/njowenyang/article/details/41440841 
 

你可能感兴趣的:(WDF)