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