对这个例子的一些想法
现在回头在看 Hardware Event Sample 这个例子,它到底有哪些方面值得我们学习?我觉得就是驱动中对一些竞争条件的处理。换个说法讲,如果当我们的驱动面对这样的执行环境时,我们会考虑到这些竞争条件吗?我觉得考虑不到,那为什么考虑不到?说明我们对驱动所处的运行环境的理解还是不够,说白了就是对内核的学习,理解不够。相比较,假如这是一个应用程序,我们是绝对可以考虑的这些竞争条件的。
下面是对这个例子中竞争条件处理的一个总结。
CustomTimerDPC 和 EventCancelRoutine 之间的可能竞争关系
- CustomTimerDPC 先获取 SpinLock,但在尚未调用 IoCompleteRequest 完成IRP之前,IRP 被 Cancel,于是 EventCancelRoutine 开始运行并阻塞于 SpinLock
- 在定时器触发之前,IRP 被 Cancel,于是 EventCancelRoutine 先获取 SpinLock,但在 EventCancelRoutine 取消定时器之前,定时器触发,于是 CustomTimerDPC 运行并阻塞于SpinLock
- CustomTimer 和 EventCancelRoutine 各自运行期间,对方都没有运行。
EventCleanup 与 CustomTimerDPC 和 EventCancelRoutine 之间的可能竞争关系
- EventCleanup 先获取 SpinLock,但在取消定时器之前,定时器触发,于是 CustomTimerDPC 开始运行并阻塞于 SpinLock
- EventCl