Жизненный цикл объекта Платформы
Жизненный цикл объекта платформы охватывает время от момента создания объекта до момента его удаления. Количество ссылок объекта определяет, когда он будет удален.
Создание объекта Платформы
Большинство объектов платформы создаются путем вызова драйвера метода создания объекта. Например, каждый драйвер платформы должен вызывать WdfDriverCreate , чтобы создать объект драйвера платформы.
Платформа создает другие объекты платформы. Например, когда пользовательское приложение открывает устройство для операций чтения или записи, платформа создает объект файла платформы и передает его в функцию обратного вызова EvtDeviceFileCreate драйвера.
Несколько объектов платформы могут быть созданы платформой или драйвером. Например, когда диспетчер ввода-вывода доставляет драйверу запрос ввода-вывода, платформа создает объект запроса платформы и доставляет его драйверу, обычно путем вызова одного из обработчиков запросов драйвера. Драйвер также может создавать объекты запросов платформы и доставлять их другим драйверам.
Использование счетчиков ссылок
Платформа поддерживает количество ссылок для каждого объекта. При создании объекта платформа устанавливает для его количества ссылок значение 1. Если количество ссылок становится нулевым, платформа удаляет объект .
Драйверы могут изменять число ссылок объекта, вызывая метод WdfObjectReference для увеличения числа ссылок или WdfObjectDereference для уменьшения числа ссылок. (Драйвер может вызывать WdfObjectDereference , только если он ранее вызывал WdfObjectReference.)
В большинстве случаев драйверам не нужно увеличивать или уменьшать количество ссылок объекта. Платформа увеличивает счетчик перед тем, как передает дескриптор объекта драйверу, и уменьшает его, когда драйвер больше не нуждается в объекте.
Драйверы вызывают WdfObjectReference , чтобы гарантировать, что объект не будет удален (платформой или потоком драйвера) до того, как драйвер завершит его использование. Пример ситуации, в которой драйвер должен вызывать WdfObjectReference и WdfObjectDereference, см. в разделе Синхронизация отмены отправленных запросов.
Удаление объекта Framework
Объекты удаляются либо потому, что драйвер вызывает WdfObjectDelete , либо потому, что платформа вызывает внутреннюю процедуру удаления, но объект удаляется только в том случае, если его число ссылок равно нулю. После того как драйвер или платформа попытаются удалить объект, дескриптор объекта остается действительным до тех пор, пока число ссылок не станет равным нулю. Драйвер не может удалить объект, просто вызвав WdfObjectDereference для уменьшения числа ссылок на объект до нуля. Драйвер также должен вызвать WdfObjectDelete.
Если объект платформы является дочерним объектом родительского объекта, а родительский объект удаляется, платформа пытается удалить дочерний объект перед удалением родительского объекта. Удаление объекта начинается с самого удаленного от родительского объекта и выполняется вверх по иерархии объектов к корню.
Драйверы могут зарегистрировать следующие две функции обратного вызова, которые платформа вызывает при удалении объекта драйвером или платформой:
Функция обратного вызова EvtCleanupCallback , которую платформа вызывает, чтобы драйвер смог вызвать WdfObjectDereference , если он ранее вызывал WdfObjectReference для удаляемого объекта.
Функция обратного вызова EvtDestroyCallback , которую платформа вызывает после уменьшения количества ссылок объекта до нуля.
Одна из этих функций обратного вызова должна освободить все ресурсы, относящиеся к конкретному объекту, которые драйвер выделил при создании объекта.
Платформа всегда обрабатывает удаление некоторых объектов платформы, и драйверы не должны пытаться удалить эти объекты. Список объектов платформы, которые драйверы не могут удалить, см. в разделе WdfObjectDelete.