通过-Windows-驱动程序框架编写驱动程序课件_第1页
通过-Windows-驱动程序框架编写驱动程序课件_第2页
通过-Windows-驱动程序框架编写驱动程序课件_第3页
通过-Windows-驱动程序框架编写驱动程序课件_第4页
通过-Windows-驱动程序框架编写驱动程序课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

通过Windows驱动程序框架编写驱动程序通过Windows驱动程序框架,可轻松编写高质量的驱动程序。议程使用WDF的优点WDF核心技术概念IO处理硬件交互即插即用和电源交互WDF开源什么是WDF,为什么使用它?WDF究竟是什么?使编写驱动程序变得轻松的库和工具概括了底层操作系统内部的复杂情况实现了代码少于20行的驱动程序对于不同设备类是可扩展的在不同的设备类上保持一致如GPIO、UART、I2C、NFC、传感器驱动程序轻松的驱动程序调试内置框架活动日志记录驱动程序分析专用工具支持用户模式和内核模式内核模式驱动程序框架(KMDF)跨大多数设备类的1000个驱动程序用户模式驱动程序框架(UMDF)原始UMDFv1基于C++COMUMDFv2与内核模式使用的驱动程序模型和语法相同支持USB外设、传感器、NFC、智能卡、HID(包括触控)…崩溃的驱动程序仅影响托管进程,而不影响整个系统重启策略可以恢复已崩溃的UMDF驱动程序WDF可在整个通用平台上使用在整套Windows设备上都受支持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)……对象上下文每个WDF对象都有一个上下文空间上下文是一个由框架分配和销毁的任意大小的结构由驱动程序用来存储特定于对象的数据例如,具有多个设备对象的驱动程序可使用上下文数据进行区分驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理设备可操作即插即用/电源交互硬件准备事件获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)准备硬件NTSTATUSOnPrepareHardware(

WDFDEVICE

Device,

WDFCMRESLIST

ResourcesRaw,

WDFCMRESLIST

ResourcesTranslated){

intResourceCount=WdfCmResourceListGetCount(

ResourcesTranslated);

for(i=0;i<ResourceCount;i++){descriptor=WdfCmResourceListGetDescriptor( ResourcesTranslated,i);

switch(descriptor->Type){

case

CmResourceTypePort:[…]

case

CmResourceTypeMemory:[…]

case

CmResourceTypeInterrupt:[…]

default:break;}}return

STATUS_SUCCESS;}获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)设备通电NTSTATUSOnD0Entry(

IN

WDFDEVICE

Device,

IN

WDF_POWER_DEVICE_STATE

RecentPowerState

){

PADXL345AccDevicepAccDevice=nullptr

pAccDevice

=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;

return

STATUS_SUCCESS;}获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)实现中断NTSTATUS

OnInterruptEnable(

INWDFINTERRUPT

Interrupt,

INWDFDEVICE

Device){

PDEVICE_EXTENSION

devExt;

ULONG

regUlong;

PULONG

intCsr;

devExt=GetDeviceContext(

WdfInterruptGetDevice(Interrupt));

intCsr

=&devExt->Regs->Int_Csr

regUlong

=READ_REGISTER_ULONG(intCsr);

WRITE_REGISTER_ULONG(intCsr,regUlong

);

return

STATUS_SUCCESS;}获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)按需扩展EvtIoResumeEvtDMAEnablerFillEvtDeviceSelfManagedIoInitEvtDeviceDisarmWakeFromSxEventChildListScanForChildrenEvtDeviceRemoveAddedResources

…获取硬件资源、进行一些静态配置(PrepareHardware)实现中断(InterruptEnable)…进入通电状态(D0Entry)驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理设备可操作即插即用/电源交互通过框架进行I/O传递I/O调度

程序队列选择执行级别和同步范围驱动程序的OnReadIRP电源管理WDFREQUESTWDFREQUEST队列选择队列类型 有序:一次传递一个请求并行:请求到达时即传递给驱动程序手动:驱动程序按其自身速度从WDFQUEUE检索请求I/O调度

程序队列选择执行级别和同步范围驱动程序的OnReadI/O电源管理I/O调度程序并行有序手动IRPWDFREQUESTWDFREQUESTWDFREQUEST读取写入IOCTL执行级别和同步范围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目标和远程I/O目标对比默认I/O目标驱动程序堆栈中较低的下一个设备对象WDFIOTARGETioTarget

=

WdfDeviceGetIoTarget(Device);远程I/O目标远程目标表示一个由某个其他驱动程序创建的设备对象WdfIoTargetCreate(Device,WDF_OBJECT_ATTRIBUTES,&IoTarget);将请求发送到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/O

WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings);

WdfDeviceAssignSxWakeSettings(device,&wakeSettings);系统进入睡眠设备电源已中断驱动程序可以要求WDF在系统睡眠时自动中断设备电源设备可以唤醒系统驱动程序可以将其设备设置为在输入时唤醒系统驱动程序工作流驱动程序初始化硬件准备I/O请求处理硬件交互驱动程序清理设备可操作即插即用/电源交互WDF开源GitHub上的WDF!在

GitHub

提供包括KMDF和UMDFv2在MIT许可证下发布包含私有符号通过Microsoft的符号服务器发布允许通过框架源代码进行调试可以在repowiki中找到指令开源范围演示驱动程序崩溃使用WDF编写更好的驱动程序使驱动程序更简单的摘要仅实现其需要自定义的事件回调的驱动程序提供功能强大的实用工具对象,管理对象生命期功能强大的调试工具自动化框架日志记录(WPP记录器)Windows调试器(WinDbg)的自定义扩展Win

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论