我想使用ioctl的倒模型。我的意思是我想安排一些工作项,当驱动程序检测到特定活动时,该工作项是用户空间线程。例如。 1.我在内核模式驱动程序中注册了一个特定中断的回调 2.每当我收到中断时,我想安排一些用户使用ioctl注册的用户空间线程。
我可以使用DPC,APC或IRP来执行此操作。我知道不应该/不能将驱动程序空间工作与用户空间区分开来。我想要的是在发生特定硬件事件时在用户空间中进行一些独立活动。
由于
答案 0 :(得分:1)
从驱动程序创建用户模式线程实际上是不好的做法,你不能简单地将控制从内核模式转移到用户模式。您必须在用户应用程序中创建工作线程,并在此线程中等待事件。有两种主要的等待方法。 1)你可以等一些事件,你在ioctl发布给司机。在某些时刻,驱动程序将事件设置为警报和线程进入并处理事件。这是一个主要而简单的方法
2)你可以同步发布ioctl并在驱动程序中挂起这个irp - > DeviceIoControl调用中的线程块。当事件发生时,驱动程序完成这些irp和线程唤醒并进行处理。
每当我收到中断时,我想安排一些用户使用ioctl注册的用户空间线程。
首先必须转到安全的irql(< DISPATCH_IRQL):中断 - > DPC推入队列 - >工作线程,因为例如你不能在高irql上发出信号事件。
读这个 http://www.osronline.com/article.cfm?id=108
和Walter Oney的书
答案 1 :(得分:0)
您不需要排队工作项目或做任何过于花哨的事情来发布事件。调度程序可在DISPATCH_LEVEL调用,因此DPC足以发信号通知任何人。
只需使用正常的反向呼叫:
1)App发送一个IOCTL(如果必须发出多个线程的信号,它必须使用FILE_FLAG_OVERLAPPED和异步I / O)。
2)设置取消例程等后,驱动程序将生成的IRP放入驱动程序管理队列中。标记irp pending并返回STATUS_PENDING。
3)中断到达...从你的ISR中排队一个DPC(或者如果这是usb或其他堆栈,你可能已经处于DISPATCH_LEVEL)。
4)从队列中删除请求并调用IoCompleteRequest。
使用KMDF执行第2步和第4步。有很多东西可以搞乱排队,所以最好使用经过充分测试的代码。