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

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

我可以使用DPC,APC或IRP来做到这一点。我知道不应该/不能将驱动程序空间工作与用户空间不同。我想要的是在特定的硬件事件发生时在用户空间中进行一些独立的活动。

感谢

回答:

从驱动器创建用户模式线程是非常糟糕的做法,你不能老是从内核模式到用户模式简单的传输控制。您必须在用户应用程序中创建工作线程并在此线程中等待事件。有两种主要的等待方法。 1)你可以等一些事件,巫婆你在ioctl发布到驱动程序。在某些时刻,驱动程序将事件设置为可警告和线程去处理事件。这是主要的和简单的方法

2)您可以发表IOCTL同步和驱动程序挂起这个IRP - >线程块中DeviceIoControl调用。事件发生时,驱动程序完成这些irp和线程唤醒并进行处理。

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

你必须进入安全IRQL(< DISPATCH_IRQL)第一:中断 - > DPC推到队列 - >工作线程,因为比如你不能老是在高IRQL信号事件。

阅读本 http://www.osronline.com/article.cfm?id=108

和Walter Oney的书

回答:

你并不需要排队一个工作项或做任何事发布活动下来太花哨。调度程序可在DISPATCH_LEVEL中调用,因此DPC足以向任何人发送信号。

只需使用一个正常的反向的调用:

1)应用程序中降下的IOCTL(如果超过一个线程必须发出信号,它必须使用FILE_FLAG_OVERLAPPED和异步I/O)。

2)驾驶员将所得IRP成驱动程序管理的队列设定解除例程之后等标记未决IRP和返回STATUS_PENDING。

3)中断到达...从ISR排队一个DPC(或者如果这是USB或一些其他的堆栈,你可能已经在DISPATCH_LEVEL)。

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

对于步骤2和步骤4使用KMDF。有很多东西可以用排队irps搞砸,所以最好使用经过良好测试的代码。

以上是 通过windows内核驱动程序调度用户空间线程 的全部内容, 来源链接: utcz.com/qa/261989.html

回到顶部