Compartilhar via


Ciclo de vida de um objeto

Este tópico descreve o "ciclo de vida" de um objeto, ou seja, como os objetos são referenciados e acompanhados pelo gerenciador de objetos. Este tópico também descreve como tornar objetos temporários ou permanentes.

Contagem de referências de objeto

O gerenciador de objetos mantém uma contagem do número de referências a um objeto. Quando um objeto é criado, o gerenciador de objetos define a contagem de referência do objeto como um. Depois que esse contador cair para zero, o objeto será liberado.

Os drivers devem garantir que o gerenciador de objetos tenha uma contagem de referência precisa para todos os objetos que eles manipulam. Um objeto liberado prematuramente pode fazer com que o sistema falhe. Um objeto cuja contagem de referência é erroneamente alta nunca será liberado.

Os objetos podem ser referenciados por alça ou ponteiro. Além da contagem de referência, o gerenciador de objetos mantém uma contagem do número de handles abertos para um objeto. Cada rotina que abre um identificador aumenta a contagem de referência de objeto e a contagem de identificadores de objeto em um. Cada chamada a essa rotina deve ser correspondida com uma chamada correspondente ao ZwClose. Para obter mais informações, consulte Object Handles.

No modo kernel, os objetos podem ser referenciados por um ponteiro que aponta para o objeto. Rotinas que retornam ponteiros para objetos, como IoGetAttachedDeviceReference, aumentam a contagem de referência em um. Depois que o driver terminar de usar o ponteiro, ele deverá chamar ObDereferenceObject para diminuir a contagem de referência em um.

Todas as rotinas a seguir aumentam a contagem de referência de um objeto em um:

ExCreateCallback

IoGetAttachedDeviceReference

IoGetDeviceObjectPointer

IoWMIOpenBlock

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

Cada chamada feita a qualquer uma das rotinas anteriores deve ser correspondida com uma chamada correspondente a ObDereferenceObject.

As rotinas ObReferenceObject e ObReferenceObjectByPointer são fornecidas para que os drivers possam aumentar em uma unidade a contagem de referência de um ponteiro de objeto conhecido. ObReferenceObject simplesmente aumenta a contagem de referência. ObReferenceObjectByPointer faz uma verificação de acesso antes de aumentar a contagem de referências.

A rotina ObReferenceObjectByHandle recebe um identificador de objeto e fornece um ponteiro para o objeto subjacente. Também aumenta em um a contagem de referências.

Objetos temporários e permanentes

A maioria dos objetos é temporária; eles existem desde que estejam em uso e, em seguida, são liberados pelo gerenciador de objetos. Objetos podem ser criados que são permanentes. Se um objeto for permanente, o próprio gerenciador de objetos manterá uma referência ao objeto. Portanto, sua contagem de referência permanece maior que zero e o objeto não é liberado quando não está mais em uso.

Um objeto temporário pode ser acessado pelo nome apenas desde que sua contagem de identificadores não seja zero. Depois que a contagem de handles diminuir para zero, o nome do objeto será removido do namespace do gerenciador de objetos. Esses objetos ainda podem ser acessados por ponteiro, desde que sua contagem de referência permaneça maior que zero. Objetos permanentes podem ser acessados pelo nome desde que existam.

Um objeto pode se tornar permanente no momento de sua criação especificando o atributo OBJ_PERMANENT na estrutura OBJECT_ATTRIBUTES do objeto. Para obter mais informações, consulte InitializeObjectAttributes.

Para tornar um objeto permanente temporário, use a rotina ZwMakeTemporaryObject . Essa rotina faz com que um objeto seja excluído automaticamente depois que ele não estiver mais em uso. (Se o objeto não tiver identificadores abertos, o nome do objeto será imediatamente removido do namespace do gerenciador de objetos. O objeto em si permanece até que a contagem de referência cai para zero.)