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