Использование рабочих элементов

Предупреждение

UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.

Архивные примеры UMDF 1 можно найти в Windows 11 версии 22H2 — обновление примеров драйверов за май 2022 г.

Дополнительные сведения см. в разделе начало работы с помощью UMDF.

Рабочий элемент — это задача, которую драйвер выполняет в функции обратного вызова события OnWorkItem . Эти функции выполняются асинхронно.

Драйверы UMDF обычно используют рабочие элементы, если OnInterruptIsr должен выполнять дополнительную обработку без задержки выполнения запроса на обслуживание прерываний (ISR), так как строка прерывания может совместно использоваться несколькими устройствами.

Как правило, функция обратного вызова 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 впоследствии возвращается после обработки рабочего элемента.