您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 通过 Windows 驱动程序框架编写驱动程序
议程IO处理硬件交互即插即用和电源交互WDF究竟是什么?概括了底层操作系统内部的复杂情况实现了代码少于20行的驱动程序在不同的设备类上保持一致如GPIO、UART、I2C、NFC、传感器驱动程序内置框架活动日志记录驱动程序分析专用工具支持用户模式和内核模式跨大多数设备类的1000个驱动程序原始UMDFv1基于C++COM崩溃的驱动程序仅影响托管进程,而不影响整个系统重启策略可以恢复已崩溃的UMDF驱动程序WDF可在整个通用平台上使用驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理即插即用/电源交互驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理即插即用/电源交互对象是WDF的基础框架中的一切都由对象表示(驱动程序、设备、队列等)对象具有方法、事件和属性对象通过WdfDeviceGetDriver等方法中的句柄访问WDFOBJECT方法属性事件在对象上运行的WDF函数可以从中注册回调可通过get/set方法访问的单个值自动对象生命期管理WDF管理对象的分配和释放维持父/子层次结构如,当客户端完成WDF请求时,它会自动删除WdfRequestCompleteWithInformation(Request,STATUS_INVALID_DEVICE_REQUEST,(ULONG_PTR)0);驱动程序(WDFDRIVER)设备(WDFDEVICE)设备(WDFDEVICE)队列(WDFQUEUE)队列(WDFQUEUE)……对象上下文驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理即插即用/电源交互硬件准备事件获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)准备硬件NTSTATUSOnPrepareHardware(WDFDEVICEDevice,WDFCMRESLISTResourcesRaw,WDFCMRESLISTResourcesTranslated){intResourceCount=WdfCmResourceListGetCount(ResourcesTranslated);for(i=0;iResourceCount;i++){descriptor=WdfCmResourceListGetDescriptor(ResourcesTranslated,i);switch(descriptor-Type){caseCmResourceTypePort:[…]caseCmResourceTypeMemory:[…]caseCmResourceTypeInterrupt:[…]default:break;}}returnSTATUS_SUCCESS;}获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)设备通电NTSTATUSOnD0Entry(INWDFDEVICEDevice,INWDF_POWER_DEVICE_STATERecentPowerState){PADXL345AccDevicepAccDevice=nullptrpAccDevice=GetContext(Device);WdfWaitLockAcquire(pAccDevice-m_WaitLock);I2CSensorWriteRegister(pAccDevice-m_I2CIoTarget,MY_REGISTER,MY_VALUE,sizeof(MY_VALUE));WdfWaitLockRelease(pAccDevice-m_WaitLock);pAccDevice-m_PoweredOn=true;returnSTATUS_SUCCESS;}获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)实现中断NTSTATUSOnInterruptEnable(INWDFINTERRUPTInterrupt,INWDFDEVICEDevice){PDEVICE_EXTENSIONdevExt;ULONGregUlong;PULONGintCsr;devExt=GetDeviceContext(WdfInterruptGetDevice(Interrupt));intCsr=&devExt-Regs-Int_CsrregUlong=READ_REGISTER_ULONG(intCsr);WRITE_REGISTER_ULONG(intCsr,regUlong);returnSTATUS_SUCCESS;}获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)按需扩展•EvtIoResume•EvtDMAEnablerFill•EvtDeviceSelfManagedIoInit•EvtDeviceDisarmWakeFromSx•EventChildListScanForChildren•EvtDeviceRemoveAddedResources…获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理即插即用/电源交互通过框架进行I/O传递I/O调度程序队列选择执行级别和同步范围驱动程序的OnReadIRP电源管理WDFREQUESTWDFREQUEST队列选择有序:一次传递一个请求并行:请求到达时即传递给驱动程序手动:驱动程序按其自身速度从WDFQUEUE检索请求I/O调度程序队列选择执行级别和同步范围驱动程序的OnReadI/O电源管理I/O调度程序并行有序手动IRPWDFREQUESTWDFREQUESTWDFREQUEST写入执行级别和同步范围IRQL:中断请求级别(PASSIVE_LEVEL、DISPATCH_LEVEL)执行级别:事件回调在调用时所在的IRQL同步范围:通过管理锁强制使回调执行序列化的机制I/O调度程序队列选择执行级别和同步范围驱动程序的OnReadI/O电源管理设备范围:同步设备队列和文件对象的回调队列范围:同步队列的回调无:无同步电源管理WDF队列可由“电源管理”仅当给设备供电时才传递请求帮助驱动程序避免在设备断电时接触硬件EvtIoStop:在电源中断时调用了已传递给驱动程序的所有请求EvtIoResume:在通电时调用了所有发送中的请求I/O调度程序队列选择执行级别和同步范围驱动程序的OnReadI/O电源管理请求取消在以下情况下,应将请求创建为可取消的请求:•I/O将花费大量时间完成•对硬件的I/O操作是可中止的WdfRequestMarkCancelable(Request,OnRequestCancel);驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理即插即用/电源交互使用I/O目标与硬件交互需要堆栈中其他驱动程序的协助I/O目标可以是堆栈中的下一个驱动程序可以是堆栈之外的外部驱动程序I/O目标充当框架和目标设备对象之间的转换器默认I/O目标和远程I/O目标对比驱动程序堆栈中较低的下一个设备对象WDFIOTARGETioTarget=WdfDeviceGetIoTarget(Device);远程目标表示一个由某个其他驱动程序创建的设备对象将请求发送到I/O目标Sync-WdfIoTargetSendReadSynchronouslyAsync-WdfIoTargetFormatRequestForRead后跟WdfRequestSend驱动程序可以将请求配置为在超时后取消为了避免驱动程序挂起,建议使用此方法WdfIoTargetSendIoctlSynchronously(ioTarget,NULL,IOCTL_ACPI_ASYNC_EVAL_METHOD,&inputBufDesc,&outputBufDesc,NULL,NULL);驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理即插即用/电源交互即插即用和电源交互设备电源已拔出。驱动程序已手动禁用。系统挂起。设备长时间空闲。用户按下鼠标按钮来唤醒系统。选择加入行为模型硬件状态不稳定的设备(电源开/关)D0Entry、D0Exit、…具有唤醒信号的设备ArmWakeFrom、DisarmWakeFrom、…如果事件不含为其注册的驱动程序回调,则该事件由WDF处理设备电源已拔出/禁用WDF停止电源管理的队列和顶层驱动程序最终不会发送对不存在的设备的请求框架为已传递的请求调用OnIoStop回调驱动程序可以正常停止I/OWDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings);WdfDeviceAssignSxWakeSettings(device,&wakeSettings);系统进入睡眠驱动程序可以要求WDF在系统睡眠时自动中断设备电源驱动程序可以将其设备设置为在输入时唤醒系统驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理即插即用/电源交互GitHub上的WDF!在GitHub提供包括KMDF和UMDFv2在MIT许可证下发布包含私有符号开源范围驱动程序崩溃使用WDF编写更好的驱动程序仅实现其需要自定义的事件回调的驱动程序提供功能强大的实用工具对象,管理对象生命期自动化框架日志记录(WPP记录器)Windows调试器(WinDbg)的自定义扩展Windows性能分析器(WPA)的新增加载项延伸阅读和文档以Windows驱动程序为基础开发驱动程序,由Orwick和Smith编写内核模式驱动程序框架设计指南用户模式驱动程序框架设计指南选择驱动程序模型一个基本的“Toaster”示例(UMDF2)回显驱动程序示例,显示队列和IOCTL(KMDF)USBFX2函数驱动程序(UMDF2)3号大宴会厅8号楼12:30硬件生命周期简介13:40Windows驱动程序开发工具15:00Windows驱动程序开发简介16:10通过WDF编写驱动程序第二天10:30实验1:驱动程序开发入门11:30午餐午餐12:30访问GPIO、I2C和UART设备实验3:驱动程序测试和调试13:40驱动程序测试和调试实验2:SharksCove上的传感器驱动程序15:00通过HardwareLabKit进行测试实验2:SharksCove上的传感器驱动程序16:10驱动程序签名、分发、维护简介实验4:通过HardwareLabKit进行测试17:20实验4:通过HardwareLabKit进行测试第三天09:00实验1:驱动程序开发入门10:10实验3:驱动程序测试和调试
本文标题:通过 Windows 驱动程序框架编写驱动程序
链接地址:https://www.777doc.com/doc-3297866 .html