学习windows驱动(对象同步)
2015-10-27 17:40
330 查看
对象是一种会被争抢的共享资源,因此就要为它设置同步机制。框架对象内部包含了同步锁机制。
可以通过WdfObjectAcquireLock 和WdfObjectReleaseLock实现手动同步。简单方面的做法是采用自动同步机制。
采用自动同步,先是确定同步范围,有两种可选同步范围:
设备同步(WdfSynchronizationScopeDevice)、队列同步(WdfSynckronizationScopeQueue)。
当选择设备同步时,设备上的队列和文件对象,同时只能有一个对象的一个事件回调被执行;当选择队列同步,在同一时刻,每个队列只有一个事件回调被执行。如果不选同步范围,就是不同步(WdfSynchronizationScopeNone),这种情况下,同一时刻可以有任意个事件回调被执行。
自动同步的原理是:
设备同步,所有下属队列或文件对象的事件回调执行前,必须申请设备对象同步锁;队列同步,队列中事件执行前,必须申请此队列对象的同步锁。如果不选同步范围,就不必申请同步锁。
采用自动同步,其次是设定运行级别,运行级别决定事件回调最高可在哪个中断级别(IRQL)上执行。可选的值有PASSIVE_LEVEL(WdfExecutionLevelPassive)和更高级别DISPATCH_LEVEL(WdfExecutionLevelDispatch)。通过WdfExecutionLevelDispatch设置子设备从父设备继承这个属性,这个属性对应结构体WDF_OBJECT_ATTRIBUTES的ExecutionLevel变量。
对于设备对象的PNP/Power事件回调,驱动总是实施同步调用。
可以通过WdfObjectAcquireLock 和WdfObjectReleaseLock实现手动同步。简单方面的做法是采用自动同步机制。
采用自动同步,先是确定同步范围,有两种可选同步范围:
设备同步(WdfSynchronizationScopeDevice)、队列同步(WdfSynckronizationScopeQueue)。
当选择设备同步时,设备上的队列和文件对象,同时只能有一个对象的一个事件回调被执行;当选择队列同步,在同一时刻,每个队列只有一个事件回调被执行。如果不选同步范围,就是不同步(WdfSynchronizationScopeNone),这种情况下,同一时刻可以有任意个事件回调被执行。
自动同步的原理是:
设备同步,所有下属队列或文件对象的事件回调执行前,必须申请设备对象同步锁;队列同步,队列中事件执行前,必须申请此队列对象的同步锁。如果不选同步范围,就不必申请同步锁。
采用自动同步,其次是设定运行级别,运行级别决定事件回调最高可在哪个中断级别(IRQL)上执行。可选的值有PASSIVE_LEVEL(WdfExecutionLevelPassive)和更高级别DISPATCH_LEVEL(WdfExecutionLevelDispatch)。通过WdfExecutionLevelDispatch设置子设备从父设备继承这个属性,这个属性对应结构体WDF_OBJECT_ATTRIBUTES的ExecutionLevel变量。
对于设备对象的PNP/Power事件回调,驱动总是实施同步调用。
相关文章推荐
- nutch1.4 在windows下面提示 java.io.IOException: CreateProcess error=2, ϵͳÕҲ»µ½ָ¶
- VS使用WEB DEPLOY发布
- LoadRunner接口测试
- 大道至简第一章。原因:之前第一章发表成文章了,无法显示在主页
- 记录
- 主从数据库架构配置
- 易优家:重新定义食品包装安全
- 卷积神经网络中卷积概念的理解
- cocos2dx 3.x 支持自定义的渲染命令
- 如何在Xamarin中引用原生的AndroidClassLibrary所产生出来的Jar档
- github笔记
- DVFS Governor Interactive-choose_freq()函数解析
- Android应用安全现状与解决方案(学习资料)
- hdoj--1754--I Hate It(线段树)
- tomcat catalina.out文件过大处理
- EhCache 分布式缓存/缓存集群
- ios滑動返回的問題。
- 一次求多个整数的质因数
- js点击button按钮跳转到另一个新页面
- 海明码及其纠错原理