首页 文章

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

提问于
浏览
0

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

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

谢谢

2 回答

  • 1

    从驱动程序创建用户模式线程实际上是不好的做法,你不能简单地将控制从内核模式转移到用户模式 . 您必须在用户应用程序中创建工作线程,并在此线程中等待事件 . 有两种主要的等待方法 . 1)你可以等一些事件,你在ioctl发布给司机 . 在某些时刻,驱动程序将事件设置为警报和线程进入并处理事件 . 这是一种主要而简单的方法

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

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

    你必须首先去安全irql(<DISPATCH_IRQL):中断 - > DPC推入队列 - >工作线程,因为例如你可以在高irql上发出信号事件 .

    读这个http://www.osronline.com/article.cfm?id=108

    和Walter Oney的书

  • 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步 . 有许多东西你可以搞砸排队irps,所以最好使用经过良好测试的代码 .

相关问题