《通过 Windows 驱动程序框架编写驱动程序课件.pptx》由会员分享,可在线阅读,更多相关《通过 Windows 驱动程序框架编写驱动程序课件.pptx(43页珍藏版)》请在三一办公上搜索。
1、通过 Windows 驱动程序框架编写驱动程序,通过 Windows 驱动程序框架,可轻松编写高质量的驱动程序。,议程,使用 WDF 的优点WDF 核心技术概念IO 处理硬件交互即插即用和电源交互WDF 开源,什么是 WDF,为什么使用它?,WDF 究竟是什么?,使编写驱动程序变得轻松的库和工具概括了底层操作系统内部的复杂情况实现了代码少于 20 行的驱动程序对于不同设备类是可扩展的在不同的设备类上保持一致如 GPIO、UART、I2C、NFC、传感器驱动程序轻松的驱动程序调试内置框架活动日志记录驱动程序分析专用工具,支持用户模式和内核模式,内核模式驱动程序框架(KMDF)跨大多数设备类的 1
2、000 个驱动程序用户模式驱动程序框架(UMDF)原始 UMDF v1 基于 C+COMUMDF v2 与内核模式使用的驱动程序模型和语法相同支持 USB 外设、传感器、NFC、智能卡、HID(包括触控)崩溃的驱动程序仅影响托管进程,而不影响整个系统重启策略可以恢复已崩溃的 UMDF 驱动程序,WDF 可在整个通用平台上使用,在整套 Windows 设备上都受支持,WDF 核心概念,驱动程序工作流,驱动程序初始化,硬件准备,I/O 请求处理,硬件交互,驱动程序清理,设备可操作,即插即用/电源交互,驱动程序工作流,驱动程序初始化,硬件准备,I/O 请求处理,硬件交互,驱动程序清理,设备可操作,即
3、插即用/电源交互,对象是 WDF 的基础,框架中的一切都由对象表示(驱动程序、设备、队列等)对象具有方法、事件和属性对象通过 WdfDeviceGetDriver 等方法中的句柄访问,在对象上运行的 WDF 函数可以从中注册回调可通过 get/set 方法访问的单个值,自动对象生命期管理,WDF 管理对象的分配和释放维持父/子层次结构如,当客户端完成 WDF 请求时,它会自动删除,在需要灵活性的情况下:驱动程序可以选择自行管理对象生命期,WdfRequestCompleteWithInformation(Request,STATUS_INVALID_DEVICE_REQUEST,(ULONG_
4、PTR)0);,驱动程序(WDFDRIVER),设备(WDFDEVICE),设备(WDFDEVICE),队列(WDFQUEUE),队列(WDFQUEUE),对象上下文,每个 WDF 对象都有一个上下文空间,上下文是一个由框架分配和销毁的任意大小的结构由驱动程序用来存储特定于对象的数据例如,具有多个设备对象的驱动程序可使用上下文数据进行区分,驱动程序工作流,驱动程序初始化,硬件准备,I/O 请求处理,硬件交互,驱动程序清理,设备可操作,即插即用/电源交互,硬件准备事件,获取硬件资源、进行一些静态配置(PrepareHardware),实现中断(InterruptEnable),进入通电状态(D0
5、Entry),准备硬件,NTSTATUS OnPrepareHardware(WDFDEVICE Device,WDFCMRESLIST ResourcesRaw,WDFCMRESLIST ResourcesTranslated)int ResourceCount=WdfCmResourceListGetCount(ResourcesTranslated);for(i=0;i Type)case CmResourceTypePort:case CmResourceTypeMemory:case CmResourceTypeInterrupt:default:break;return STATU
6、S_SUCCESS;,获取硬件资源、进行一些静态配置(PrepareHardware),实现中断(InterruptEnable),进入通电状态(D0Entry),设备通电,NTSTATUSOnD0Entry(IN WDFDEVICE Device,IN WDF_POWER_DEVICE_STATE RecentPowerState)PADXL345AccDevice pAccDevice=nullptr pAccDevice=GetContext(Device);WdfWaitLockAcquire(pAccDevice-m_WaitLock);I2CSensorWriteRegister(
7、pAccDevice-m_I2CIoTarget,MY_REGISTER,MY_VALUE,sizeof(MY_VALUE);WdfWaitLockRelease(pAccDevice-m_WaitLock);pAccDevice-m_PoweredOn=true;return STATUS_SUCCESS;,获取硬件资源、进行一些静态配置(PrepareHardware),实现中断(InterruptEnable),进入通电状态(D0Entry),实现中断,NTSTATUS OnInterruptEnable(IN WDFINTERRUPT Interrupt,IN WDFDEVICE De
8、vice)PDEVICE_EXTENSION devExt;ULONG regUlong;PULONG intCsr;devExt=GetDeviceContext(WdfInterruptGetDevice(Interrupt);intCsr=,获取硬件资源、进行一些静态配置(PrepareHardware),实现中断(InterruptEnable),进入通电状态(D0Entry),按需扩展,EvtIoResumeEvtDMAEnablerFillEvtDeviceSelfManagedIoInitEvtDeviceDisarmWakeFromSxEventChildListScanFor
9、ChildrenEvtDeviceRemoveAddedResources,获取硬件资源、进行一些静态配置(PrepareHardware),实现中断(InterruptEnable),进入通电状态(D0Entry),驱动程序工作流,驱动程序初始化,硬件准备,I/O 请求处理,硬件交互,驱动程序清理,设备可操作,即插即用/电源交互,通过框架进行 I/O 传递,I/O 调度程序,队列选择,执行级别和同步范围,驱动程序的 OnRead,IRP,电源管理,WDFREQUEST,WDFREQUEST,队列选择,队列类型有序:一次传递一个请求并行:请求到达时即传递给驱动程序手动:驱动程序按其自身速度从
10、WDFQUEUE 检索请求,I/O 调度程序,并行,有序,手动,IRP,WDFREQUEST,WDFREQUEST,WDFREQUEST,读取,写入,IOCTL,执行级别和同步范围,IRQL:中断请求级别(PASSIVE_LEVEL、DISPATCH_LEVEL)执行级别:事件回调在调用时所在的 IRQL同步范围:通过管理锁强制使回调执行序列化的机制,设备范围:同步设备队列和文件对象的回调 队列范围:同步队列的回调无:无同步,电源管理,电源管理的队列WDF 队列可由“电源管理”仅当给设备供电时才传递请求帮助驱动程序避免在设备断电时接触硬件队列事件EvtIoStop:在电源中断时调用了已传递给驱
11、动程序的所有请求EvtIoResume:在通电时调用了所有发送中的请求,请求取消,可以取消已排队的请求必须将“发送中”的请求创建为可取消的请求 在以下情况下,应将请求创建为可取消的请求:I/O 将花费大量时间完成对硬件的 I/O 操作是可中止的,WdfRequestMarkCancelable(Request,OnRequestCancel);,驱动程序工作流,驱动程序初始化,硬件准备,I/O 请求处理,硬件交互,驱动程序清理,设备可操作,即插即用/电源交互,使用 I/O 目标与硬件交互,驱动程序无法总是能够完成请求需要堆栈中其他驱动程序的协助驱动程序到驱动程序I/O 目标可以是堆栈中的下一个
12、驱动程序可以是堆栈之外的外部驱动程序I/O 目标作为转换器I/O 目标充当框架和目标设备对象之间的转换器,默认 I/O 目标和远程 I/O 目标对比,默认 I/O 目标驱动程序堆栈中较低的下一个设备对象WDFIOTARGET ioTarget=WdfDeviceGetIoTarget(Device);远程 I/O 目标远程目标表示一个由某个其他驱动程序创建的设备对象WdfIoTargetCreate(Device,WDF_OBJECT_ATTRIBUTES,将请求发送到 I/O 目标,以同步方式或以异步方式Sync-WdfIoTargetSendReadSynchronouslyAsync-W
13、dfIoTargetFormatRequestForRead 后跟 WdfRequestSend 超时驱动程序可以将请求配置为在超时后取消为了避免驱动程序挂起,建议使用此方法,WdfIoTargetSendIoctlSynchronously(ioTarget,NULL,IOCTL_ACPI_ASYNC_EVAL_METHOD,驱动程序工作流,驱动程序初始化,硬件准备,I/O 请求处理,硬件交互,驱动程序清理,设备可操作,即插即用/电源交互,即插即用和电源交互,即插即用应用场景:设备电源已拔出。驱动程序已手动禁用。电源应用场景:系统挂起。设备长时间空闲。用户按下鼠标按钮来唤醒系统。,选择加入行
14、为模型,驱动程序仅提供必要的事件回调硬件状态不稳定的设备(电源开/关)D0Entry、D0Exit、具有唤醒信号的设备ArmWakeFrom、DisarmWakeFrom、合理的默认实现如果事件不含为其注册的驱动程序回调,则该事件由 WDF 处理,设备电源已拔出/禁用,队列已自动停止WDF 停止电源管理的队列和顶层驱动程序最终不会发送对不存在的设备的请求发送中的请求已得到通知框架为已传递的请求调用 OnIoStop 回调 驱动程序可以正常停止 I/O,WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(,系统进入睡眠,设备电源已中断驱动程序可以要求 WDF 在
15、系统睡眠时自动中断设备电源设备可以唤醒系统 驱动程序可以将其设备设置为在输入时唤醒系统,驱动程序工作流,驱动程序初始化,硬件准备,I/O 请求处理,硬件交互,驱动程序清理,设备可操作,即插即用/电源交互,WDF 开源,GitHub 上的 WDF!,在 GitHub 提供包括 KMDF 和 UMDF v2在 MIT 许可证下发布,包含私有符号,通过 Microsoft 的符号服务器发布允许通过框架源代码进行调试可以在 repo wiki 中找到指令,开源范围,演示,驱动程序崩溃,使用 WDF 编写更好的驱动程序,使驱动程序更简单的摘要仅实现其需要自定义的事件回调的驱动程序提供功能强大的实用工具对象,管理对象生命期功能强大的调试工具自动化框架日志记录(WPP 记录器)Windows 调试器(WinDbg)的自定义扩展 Windows 性能分析器(WPA)的新增加载项,延伸阅读和文档,WDF 书籍/MSDN 文档以 Windows 驱动程序为基础开发驱动程序,由 Orwick 和 Smith 编写 内核模式驱动程序框架设计指南用户模式驱动程序框架设计指南 选择驱动程序模型 驱动程序示例一个基本的“Toaster”示例(UMDF2)回显驱动程序示例,显示队列和 IOCTL(KMDF)USB FX2 函数驱动程序(UMDF2),