使用工作项

警告

UMDF 2 是 UMDF 的最新版本,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 不会向 UMDF 1 添加任何新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。

存档的 UMDF 1 示例可在 Windows 11 版本 22H2 - 2022 年 5 月驱动程序示例更新中找到。

有关详细信息,请参阅使用 UMDF 入门

工作项是驱动程序在 OnWorkItem 事件回调函数中执行的任务。 这些函数以异步方式运行。

如果 OnInterruptIsr 必须执行其他处理而不延迟中断服务请求的执行 (ISR) ,则 UMDF 驱动程序通常使用工作项,因为中断行可能由多个设备共享。

通常,驱动程序的 OnInterruptIsr 回调函数会创建一个工作项对象,并将其添加到系统的工作项队列。 随后,线程池线程取消对对象排队并调用工作项的 OnWorkItem 回调函数。

设置工作项

若要设置工作项,驱动程序必须:

  1. 创建工作项。

    驱动程序调用 IWDFDevice3::CreateWorkItem 来创建工作项对象,并标识将处理工作项的 OnWorkItem 回调函数。

  2. 存储有关工作项的信息。

    通常,驱动程序使用工作项对象的上下文内存来存储 有关 OnWorkItem 回调函数应执行的任务的信息。 调用 OnWorkItem 回调函数时,它可以通过访问此上下文内存来检索信息。 有关如何分配和访问上下文内存的信息,请参阅IWDFObject::AssignContext

  3. 将工作项添加到系统的工作项队列。

    驱动程序调用 IWDFWorkItem::Enqueue,这将驱动程序的工作项添加到工作项队列。

当驱动程序调用 IWDFDevice3::CreateWorkItem 时,它可以选择提供父对象 (例如设备对象或队列对象) 。 当系统删除该对象时,它还会删除与该对象关联的任何现有工作项。

使用 WorkItem 回调函数

将工作项添加到工作项队列后,它将保留在队列中,直到系统工作线程可用。 系统工作线程从队列中删除工作项,然后调用驱动程序的 OnWorkItem 回调函数,将工作项对象作为输入传递。

通常,OnWorkItem 回调函数执行以下步骤:

  1. 通过访问工作项对象的上下文内存,获取驱动程序提供的有关工作项的信息。
  2. 执行指定的任务。 如有必要,回调函数可以调用 IWDFWorkItem::GetParentObject 来确定工作项的父对象。
  3. 如果驱动程序将重新排队工作项,则表示工作项的句柄现在可供重复使用。

一些驱动程序可能需要调用 IWDFWorkItem::Flush 才能从工作项队列中刷新其工作项。 如果驱动程序调用 Flush 方法,则在工作线程从工作项队列中删除指定工作项并调用驱动程序的 OnWorkItem 回调函数,并且 OnWorkItem 回调函数随后在处理工作项后返回之前,该方法不会返回。