通过windows内核驱动程序调度用户空间线程

通过windows内核驱动程序调度用户空间线程,windows,kernel,driver,device-driver,Windows,Kernel,Driver,Device Driver,我想使用ioctl的反向模型。我的意思是,当驱动程序检测到特定的活动时,我想安排一些工作项,这是一个用户空间线程。例如。 1.我在内核模式驱动程序中为特定中断注册回调。 2.每当我得到一个中断,我想安排一些用户使用ioctl注册的用户空间线程 我可以使用DPC、APC或IRP来执行此操作。我知道不应该/不能将驾驶员空间工作与用户空间区分开来。我想要的是在发生特定硬件事件时在用户空间中执行一些独立的活动 谢谢,从驱动程序创建用户模式线程是非常糟糕的做法,您不能简单地将控制权从内核模式转移到用户模式

我想使用ioctl的反向模型。我的意思是,当驱动程序检测到特定的活动时,我想安排一些工作项,这是一个用户空间线程。例如。 1.我在内核模式驱动程序中为特定中断注册回调。
2.每当我得到一个中断,我想安排一些用户使用ioctl注册的用户空间线程

我可以使用DPC、APC或IRP来执行此操作。我知道不应该/不能将驾驶员空间工作与用户空间区分开来。我想要的是在发生特定硬件事件时在用户空间中执行一些独立的活动


谢谢,从驱动程序创建用户模式线程是非常糟糕的做法,您不能简单地将控制权从内核模式转移到用户模式。您必须在用户应用程序中创建工作线程,并在此线程中等待事件。等待的方法主要有两种。 1) 您可以等待某个事件,即您在ioctl中发布到驱动程序的事件。在某个时刻,驱动程序将事件设置为可报警,线程转到并处理事件。这是一个主要而简单的方法

2) 您可以同步发布ioctl,并在驱动程序pend中,在DeviceIoControl调用中使用此irp->线程块。当事件发生时,驱动程序完成这些irp和线程唤醒并进行处理

每当我得到一个中断,我想安排一些用户使用ioctl注册的用户空间线程

您必须首先转到安全irql(DPC push into queue->worker thread,因为例如,您不能在高irql上发出事件信号

读这个


Walter Oney book

您不需要将工作项排队,也不需要做任何太花哨的事情来记录事件。调度程序可以在DISPATCH_级别调用,因此DPC足以向任何人发送信号

只需使用正常的反向呼叫:

1) 应用程序发送一个IOCTL(如果必须发送多个线程的信号,则必须使用文件\u标志\u重叠和异步I/O)

2) 在设置取消例程等后,驱动程序将生成的IRP放入驱动程序管理的队列。标记IRP挂起并返回状态_pending

3) 中断到达。。。将ISR中的DPC排队(或者如果这是usb或其他堆栈,则您可能已经处于调度级别)

4) 从队列中删除请求并调用IoCompleteRequest


在步骤2和4中使用KMDF。排队IRP可能会搞糟很多事情,因此最好使用经过良好测试的代码。

我不打算创建新的用户空间线程。不过,第一种方法听起来很有趣。我可以再详细说明一下吗?事实上这篇文章解释了这一点。谢谢