Поделиться через


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

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

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 создает объект рабочего элемента и добавляет его в очередь рабочих элементов системы. Впоследствии поток threadpool удаляет объект и вызывает функцию обратного вызова рабочего элемента 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 впоследствии вернулась после обработки рабочего элемента.