1

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

我可以使用 DPC、APC 或 IRP 来执行此操作吗?我确实知道不应该/不能将驱动程序空间工作与用户空间不同。我想要的是在特定硬件事件发生时在用户空间中做一些独立的活动。

谢谢

4

2 回答 2

1

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

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

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

您必须先转到安全 irql (< DISPATCH_IRQL):中断 -> DPC 推入队列 -> 工作线程,因为例如您无法在高 irql 上发出事件信号。

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

和沃尔特·奥尼的书

于 2012-05-02T21:18:25.777 回答
0

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

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

1) App 发送一个 IOCTL(如果多个线程必须发出信号,它必须使用 FILE_FLAG_OVERLAPPED 和异步 I/O)。

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

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

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

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

于 2012-05-06T17:01:02.027 回答