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

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

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

Менеджер объектов отслеживает количество ссылок на объект. При создании объекта диспетчер объектов устанавливает счетчик ссылок объекта на единицу. После того как этот счетчик падает до нуля, объект освобождается.

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

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

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

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

ExCreateCallback

IoGetAttachedDeviceReference

IoGetDeviceObjectPointer

IoWMIOpenBlock

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

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

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

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

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

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

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

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

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