通过 Windows 驱动程序框架编写驱动程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
队列 (WDFQUEUE)
队列 (WDFQUEUE)
…
对象上下文
驱动程序工作流
I/O 请求处理 驱动程序初始化 硬件准备 硬件交互 即插即用/电源交互 驱动程序 清理
硬件准备事件
获取硬件资源、 进行一些静态配置 (PrepareHardware)
进入通电状态 (D0Entry)
实现中断 (InterruptEnable)
WDF 管理对象的分配和释放 维持父/子层次结构 如,当客户端完成 WDF 请求时,它会自动删除
设备 (WDFDEVICE) 设备 (WDFDEVICE) … 驱动程序 (WDFDRIVER)
WdfRequestCompleteWithInformation( Request, STATUS_INVALID_DEVICE_REQUEST, (ULONG_PTR) 0 );
对象是 WDF 的基础
框架中的一切都由对象表示(驱动程序、设备、队列等) 对象具有方法、事件和属性 对象通过 WdfDeviceGetDriver 等方法中的句柄访问
WDFOBJECT
方法 事件 属性 在对象上运行的 WDF 函数 可以从中注册回调 可通过 get/set 方法访问的单个值
自动对象生命期管理
原始 UMDF v1 基于 C++ COM
崩溃的驱动程序仅影响托管进程,而不影响整个系统 重启策略可以恢复已崩溃的 UMDF 驱动程序
WDF 可在整个通用平台上使用
驱动程序工作流
I/O 请求处理 驱动程序初始化 硬件准备 硬件交互 即插即用/电源交互 驱动程序 清理
驱动程序工作流
I/O 请求处理 驱动程序初始化 硬件准备 硬件交互 即插即用/电源交互 驱动程序 清理
…
按需扩展
获取硬件资源、 进行一些静态配置 (PrepareHardware)
•
• •
EvtIoResume
EvtDMAEnablerFill EvtDeviceSelfManagedIoInit EvtDeviceDisarmWakeFromSx EventChildListScanForChildren EvtDeviceRemoveAddedResources …
议程
IO 处理 硬件交互 即插即用和电源交互
WDF 究竟是什么?
概括了底层操作系统内部的复杂情况 实现了代码少于 20 行的驱动程序
在不同的设备类上保持一致 如 GPIO、UART、I2C、NFC、传感器驱动程序
内置框架活动日志记录 驱动程序分析专用工具
支持用户模式和内核模式
跨大多数设备类的 1000 个驱动程序
进入通电状态 (D0Entry)
Leabharlann Baidu
intCsr = &devExt->Regs->Int_Csr
实现中断 (InterruptEnable)
regUlong = READ_REGISTER_ULONG( intCsr ); WRITE_REGISTER_ULONG( intCsr, regUlong ); } return STATUS_SUCCESS;
…
准备硬件
获取硬件资源、 进行一些静态配置 (PrepareHardware)
NTSTATUS OnPrepareHardware( WDFDEVICE Device, WDFCMRESLIST ResourcesRaw, WDFCMRESLIST ResourcesTranslated ) { int ResourceCount = WdfCmResourceListGetCount( ResourcesTranslated ); for (i=0; i < ResourceCount; i++) { descriptor = WdfCmResourceListGetDescriptor( ResourcesTranslated, i); switch(descriptor->Type) { case CmResourceTypePort: […] case CmResourceTypeMemory: […] case CmResourceTypeInterrupt: […] default: break; }
进入通电状态 (D0Entry)
• •
实现中断 (InterruptEnable)
•
…
驱动程序工作流
进入通电状态 (D0Entry)
实现中断 (InterruptEnable)
…
}
pAccDevice->m_PoweredOn = true; return STATUS_SUCCESS;
实现中断
获取硬件资源、 进行一些静态配置 (PrepareHardware)
NTSTATUS OnInterruptEnable( IN WDFINTERRUPT Interrupt, IN WDFDEVICE Device){ PDEVICE_EXTENSION devExt; ULONG regUlong; PULONG intCsr; devExt = GetDeviceContext( WdfInterruptGetDevice(Interrupt) );
进入通电状态 (D0Entry)
实现中断 (InterruptEnable)
…
}
} return STATUS_SUCCESS;
设备通电
获取硬件资源、 进行一些静态配置 (PrepareHardware)
NTSTATUS OnD0Entry( IN WDFDEVICE Device, IN WDF_POWER_DEVICE_STATE RecentPowerState ){ PADXL345AccDevice pAccDevice = nullptr pAccDevice = GetContext(Device); WdfWaitLockAcquire(pAccDevice->m_WaitLock); I2CSensorWriteRegister( pAccDevice->m_I2CIoTarget, MY_REGISTER, MY_VALUE, sizeof(MY_VALUE) ); WdfWaitLockRelease(pAccDevice->m_WaitLock);