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


Указание режима синхронизации обратного вызова

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

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

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

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

Драйвер может указать, как его функции обратного вызова вызываются платформой. Драйвер указывает режим синхронизации (или блокировки) для устройства перед вызовом метода IWDFDriver::CreateDevice для создания объекта устройства . Чтобы указать режим синхронизации, драйвер должен вызвать метод IWDFDeviceInitialize::SetLockingConstraint . Драйвер получает указатель на интерфейс IWDFDeviceInitialize при вызове метода IDriverEntry::OnDeviceAdd для добавления устройства в систему.

Драйвер может указать одно из следующих значений из типа перечисления WDF_CALLBACK_CONSTRAINT в параметре LockTypeобъекта IWDFDeviceInitialize::SetLockingConstraint , чтобы определить режим блокировки. Указанный тип ограничения (или блокировки) зависит от того, насколько параллелизм может использовать аппаратное устройство и как может обработать драйвер.

Значение Значение

Нет (0)

Указывает, что функции обратного вызова в драйвере не синхронизированы.

WdfDeviceLevel (1)

Указывает, что все функции обратного вызова очереди в драйвере синхронизированы.

Примечание Если драйвер не вызывает IWDFDeviceInitialize::SetLockingConstraint для указания значения, платформа устанавливает для этого свойства значение по умолчанию WdfDeviceLevel.

Ограничения применяются только к функциям обратного вызова очереди, но не к функциям обратного вызова Plug and Play (PnP) и управления питанием. Функции обратного вызова очереди включают следующее:

Функции обратного вызова завершения запроса (IRequestCallbackRequestCompletion::OnCompletion) не являются функциями обратного вызова очереди. Поэтому они не синхронизируются.