Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предупреждение
UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.
Архивные примеры UMDF 1 можно найти в Windows 11, версия 22H2 — обновление драйверов за май 2022 года.
Дополнительные сведения см. в разделе Начало работы сUMDF.
Весь код драйвера, который обращается к буферу данных прерывания, должен быть синхронизирован таким образом, чтобы в одно время только одна подпрограмма обращается к данным.
Можно синхронизировать код прерываний с помощью ручной блокировки прерываний или автоматической сериализации обратного вызова.
Блокировка прерываний вручную
UMDF получает блокировку прерывания перед вызовом OnInterruptIsr, OnInterruptDisableили обратных вызовов OnInterruptEnable.
Если драйверу необходимо синхронизировать любой код с помощью блокировки прерываний, он вызывает IWDFInterrupt::AcquireInterruptLock и IWDFInterrupt::ReleaseInterruptLock. Например, в своей подпрограмме обратного вызова OnInterruptWorkItem драйвер получает и освобождает блокировку прерываний, используя эти методы. Однако при обратных вызовах отправки ввода-вывода (например, OnRead и OnWrite) драйвер сначала вызывает IWDFInterrupt::TryToAcquireInterruptLock, чтобы решить, добавлять ли элемент в очередь или выполнять работу в том же потоке, чтобы избежать потенциальной взаимоблокировки. Пример сценария взаимоблокировки, который может быть вызван вызовом IWDFInterrupt::AcquireInterruptLock из произвольного контекста потока, представлен в разделе «Примечания» к IWDFInterrupt::AcquireInterruptLock.
Если IWDFInterrupt::TryToAcquireInterruptLock возвращает TRUE, драйвер получил блокировку прерываний в том же потоке. В этом случае драйвер выполняет работу, требующую эту блокировку, а затем вызывает ReleaseInterruptLock. Если IWDFInterrupt::TryToAcquireInterruptLock возвращает FALSE, драйвер ставит рабочий элемент в очередь и выполняет работу в его OnWorkItem обратного вызова. В этом случае рабочий элемент не должен использовать автоматическую сериализацию.
Использование автоматической сериализации
Драйвер UMDF может запрашивать автоматическую синхронизацию обратного вызова путем вызова IWDFDeviceInitialize::SetLockingConstraint с параметром LockType, установленным в WdfDeviceLevel.
Затем драйвер задает член AutomaticSerialization в структуре WUDF_INTERRUPT_CONFIG значением TRUE перед вызовом CreateInterrupt.
В результате UMDF сериализует обратные вызовы драйвера OnInterruptWorkItem вместе с очередью ввода-вывода, процедурами отмены запроса и подпрограммами обратного вызова объекта файла. В этом сценарии UMDF использует блокировку обратного вызова вместо блокировки объекта для каждого прерывания.