使用WDF开发驱动程序
使用WDF开发驱动程序
- Windows驱动程序框架(WDF)驱动程序由基于框架的驱动程序所使用的Windows驱动程序框架对象定义的DriverEntry 例程和一组事件回调函数组成。
创建WDF驱动程序时,执行操作:
-
使用框架驱动程序对象来表示驱动程序
驱动程序的DriverEntry 例程必须调用WdfDriverCreate以创建表示驱动程序的框架驱动程序对象。
WdfDriverCreate方法还会注册驱动程序的EvtDriverDeviceadd回调函数即插即用,该函数(PnP)管理器报告驱动程序支持的设备是否存在。 -
使用框架设备对象支持驱动程序中的PnP和电源管理
所有驱动程序都必须调用WdfDeviceCreate,以便为驱动程序支持的设备创建框架对象。
设备可以是插入到计算机中的一片硬件,也可以是仅限软件的设备。
框架设备对象支持PnP和电源管理操作,驱动程序可以注册事件回调函数,以便在设备进入或离开其工作状态时通知驱动程序。 -
使用框架队列对象和框架请求对象来支持驱动程序的i/o操作
从应用程序或其他驱动程序接收读取、写入或设备i/o控制请求的所有驱动程序都必须调用WdfIoQueueCreate,以创建表示i/o列队的框架列队对象。
驱动程序会为每个i/o队列注册一个或多个请求处理程序。
当i/o管理器向驱动程序发送i/o请求时,框架将为请求创建一个框架请求对象,将该请求对象放置在i/o队列中,并调用驱动程序的一个请求处理程序来通知驱动程序请求可用。
该驱动程序将获取i/o请求,并可以重新排队、完成、取消或转发该请求。 -
使用框架中断对象来处理设备中断
处理设备中断的驱动程序必须调用WdfInterruptCreate,以便为每个中断创建框架中断对象并注册回调函数。
这些回调函数启用和禁用中断,并充当中断服务例程(ISR),并为中断(DPC)延迟过程调用。 -
KMDF驱动程序可以使用框架的DMA启用码对象和DMA事务对象来处理设备(DMA)操作的直接内存访问
如果KMDF驱动程序的设备支持DMA操作,驱动程序应调用WdfDmaEnablerCreate来创建DMA启用程序对象,并使用WdfDmaTransactionCreate创建一个或多个DMA事务对象。
DMA transaction 对象定义于计划设备硬件执行DMA操作的EvtProgramDma回调函数。 -
使用框架的i/o目标对象将i/o请求发送到其他程序
若要将i/o请求传递到其他驱动程序(通常是驱动程序堆栈)中的下一个较低驱动程序,则驱动程序将请求发送到i/o目标对象。
-
KMDF驱动程序可以使用框架的wmi提供程序对象和wmi实例对象来支持(WMI)功能Windows Management Instrumentation
大多数KMDF驱动程序应支持WMI,并应调用WdfWmiInstanceCreate来注册发送或接收WMI数据的回调函数。
-
使用框架的同步功能
所有驱动程序都必须了解多处理器同步问题,并应使用框架提供的同步技术。
WDF体系结构
WDF为驱动程序提供了基于对象的接口,框架定义的对象接口包含:
-
对象方法
方法是驱动程序可以调用以对象执行操作或获取或设置对象属性的函数。
方法名为WdfObjectAction,其中对象描述对象,操作指示函数的作用。
例:WdfDeviceCreate创建设备对象。 -
对象事件回调函数
事件回调函数是驱动程序提供的函数。每个事件回调函数都与某个对象上可能发生的特定事件关联。当发生关联的事件时,框架将调用事件回调函数。
例:驱动程序将注册EvtDeviceD0Entry事件回调,以便在设备进入工作状态时收到通知。 -
对象属性
属性是存储在对象中的值,并且驱动程序可以获取并设置(即,更改)。在许多情况下,属性直接映射到相应的WDM对象中的字段。
不能失败的属性命名为WDF对象获取值和WDF对象集值,并且可能失败的属性被命名为WDF对象检索值和对象赋值。
对象描述对象,值标志函数设置或返回的数据。
例:WDfDeviceGetDriver返回与设备对象相关联的驱动程序对象的句柄。 -
对象句柄
基于框架的驱动程序绝不会直接访问框架对象。相反,驱动程序将接收对象句柄,该句柄可传递给对象的方法。
框架定义了基于框架的驱动程序使用的多种对象类型
- 框架驱动程序对象表示每个驱动程序。
- 框架设备对象表示驱动程序支持的每个设备。
- 框架队列对象代表接收设备i/o请求的i/o队列。
- Framework 请求对象表示每个i/o队列接收的i/o请求数。