Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предупреждение
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 использует схему подсчета ссылок для управления временем существования объектов обратного вызова и объектов платформы.
Управление ссылками на объекты обратного вызова Driver-Supplied
В большинстве случаев драйверу не нужно хранить ссылку на объект обратного вызова. Если методы интерфейса объекта обратного вызова вызываются только платформой и объектами, время существования которых зависит от объекта обратного вызова и парного объекта обратного вызова, драйвер не должен хранить ссылку. Другими словами, драйвер или платформа могут безопасно вызывать методы интерфейсов объектов, которые выше в иерархии объектов.
Управление ссылками на объекты Framework
В UMDF общие принципы существования COM и модель времени существования WDF определяют время существования объектов платформы. Драйвер должен соответствовать критериям для обеих моделей, чтобы объекты платформы освобождались от памяти в соответствующее время.
Управление жизненным циклом COM
В COM вызывающий объект обычно сохраняет ссылку на объект во время использования объекта, а вызывающий объект освобождает ссылку, когда он больше не требует объекта. Однако драйвер UMDF не должен содержать ссылку на объект платформы. На самом деле драйвер может освободить ссылку на объект платформы сразу после того, как драйвер создает объект платформы.
Например, примеры UMDF освобождают объект устройства после вызова IWDFDriver::CreateDevice. Хотя ссылка выпущена рано, объект устройства продолжает существовать, пока устройство не будет удалено, так как дерево объектов WDF сохраняет ссылку на него.
Так как UMDF отслеживает все объекты платформы в дереве объектов, драйвер не должен содержать ссылку на объекты платформы.
Однако если драйвер сохраняет ссылку на объект платформы, драйвер должен освободить ссылку, когда он больше не нуждается в объекте. Циклическая ссылка остается на месте, пока драйвер не выпустит свою ссылку. Чтобы избежать циклических ссылок, драйвер обычно не должен содержать явную ссылку на объект платформы.
Если драйвер должен содержать ссылку на объект платформы, объект обратного вызова драйвера также должен реализовать интерфейс IObjectCleanup . Когда драйвер вызывает IWDFObject::DeleteWdfObject на объекте каркаса, объект каркаса вызывает соответствующий метод объекта обратного вызова IObjectCleanup::OnCleanup. Реализация IObjectCleanup::OnCleanup должна освободить ссылку на объект фреймворка, чтобы фреймворк мог полностью завершить работу объекта фреймворка.
Управление жизненным циклом WDF
Если вы создаете объект типа, который позволяет переопределить родительский элемент по умолчанию, следует выбрать родительский объект со временем существования, соответствующего времени существования объекта. Дополнительные сведения о родительских объектах по умолчанию и о том, может ли драйвер переопределить родительский объект по умолчанию, см. в таблице в объектах Framework.
При сопоставлении времени существования объектов платформа удаляет объект при удалении родительского объекта. Если сроки жизни объектов не совпадают, и вы хотите, чтобы объект был удалён до удаления родительского объекта по умолчанию, вы можете явно удалить объект, вызвав DeleteWdfObject, когда объект больше не нужен.
Например, если создать объект запроса, а затем вызвать IWDFDriver::CreateWdfMemory для создания объекта памяти для этого запроса, можно указать объект запроса в качестве родительского объекта новой памяти. Так как WDF удаляет дочерние объекты при удалении родительского объекта, драйверу не нужно вызывать DeleteWdfObject для удаления объекта памяти.
Однако если нет родительского элемента, время существования которого тесно соответствует времени существования объекта, и если требуется удалить объект перед удалением родительского элемента по умолчанию, необходимо использовать явное удаление. Например, драйвер может создать несколько объектов запроса, которые используются в течение короткого времени. В этом случае драйвер может сохранить память, явно удалив запросы, когда они больше не нужны.
Аналогичным образом, если вы создаете объект, который не позволяет переопределить родительский объект по умолчанию и если требуется удалить объект перед удалением родительского элемента по умолчанию, драйвер должен явно удалить объект.