Жизненный цикл объекта

В этом разделе описывается жизненный цикл объекта, то есть, как диспетчер объектов ссылается на объекты и отслеживает их. В этом разделе также описывается, как сделать объекты временными или постоянными.

Число ссылок на объекты

Диспетчер объектов поддерживает количество ссылок на объект. При создании объекта диспетчер объектов устанавливает для счетчика ссылок объекта значение 1. Как только этот счетчик упадет до нуля, объект освобождается.

Драйверы должны гарантировать, что диспетчер объектов имеет точное число ссылок на все объекты, которыми они управляют. Объект, который освобождается преждевременно, может привести к аварийному завершению работы системы. Объект, число ссылок которого ошибочно велико, никогда не будет освобожден.

На объекты можно ссылаться с помощью дескриптора или указателя. Помимо количества ссылок, диспетчер объектов поддерживает количество открытых дескрипторов объекта. Каждая подпрограмма, открывающая дескриптор, увеличивает количество ссылок на объекты и число дескрипторов объектов на один. Каждый вызов такой подпрограммы должен сопоставляться с соответствующим вызовом ZwClose. Дополнительные сведения см. в разделе Дескрипторы объектов.

В режиме ядра на объекты можно ссылаться с помощью указателя на объект . Подпрограммы, возвращающие указатели на объекты, такие как IoGetAttachedDeviceReference, увеличивают число ссылок на один. После завершения работы драйвера с помощью указателя он должен вызвать ObDereferenceObject , чтобы уменьшить количество ссылок на один.

Следующие подпрограммы увеличивают число ссылок объекта на один:

ExCreateCallback

IoGetAttachedDeviceReference

IoGetDeviceObjectPointer

IoWMIOpenBlock

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

Каждый вызов любой из предыдущих подпрограмм должен сопоставляться с соответствующим вызовом ObDereferenceObject.

Предоставляются подпрограммы ObReferenceObject и ObReferenceObjectByPointer , чтобы драйверы могли увеличить число ссылок известного указателя объекта на один. ObReferenceObject просто увеличивает число ссылок. ObReferenceObjectByPointer выполняет проверка доступа перед увеличением числа ссылок.

Подпрограмма ObReferenceObjectByHandle получает дескриптор объекта и предоставляет указатель на базовый объект. Это также увеличивает количество ссылок на один.

Временные и постоянные объекты

Большинство объектов являются временными; они существуют до тех пор, пока они используются, а затем освобождаются диспетчером объектов. Можно создавать постоянные объекты. Если объект является постоянным, диспетчер объектов сам содержит ссылку на объект . Таким образом, количество ссылок остается больше нуля, и объект не освобождается, когда он больше не используется.

Доступ к временному объекту можно получить только по имени, если его число дескрипторов не равно нулю. После уменьшения числа дескрипторов до нуля имя объекта удаляется из пространства имен диспетчера объектов. К таким объектам по-прежнему можно обращаться с помощью указателя, если их число ссылок остается больше нуля. Постоянные объекты можно получить по имени, если они существуют.

Объект можно сделать постоянным во время его создания, указав атрибут OBJ_PERMANENT в структуре OBJECT_ATTRIBUTES для объекта. Дополнительные сведения см. в разделе InitializeObjectAttributes.

Чтобы сделать постоянный объект временным, используйте подпрограмму ZwMakeTemporaryObject . Эта подпрограмма приводит к автоматическому удалению объекта, когда он больше не используется. (Если объект не имеет открытых дескрипторов, имя объекта немедленно удаляется из пространства имен диспетчера объектов. Сам объект остается до тех пор, пока число ссылок не упадет до нуля.)