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 rastreados 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 identificador ou por ponteiro. Além da contagem de referência, o gerenciador de objetos mantém uma contagem do número de identificadores abertos em 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 para ZwClose. Para obter mais informações, consulte Identificadores de objeto.

No modo kernel, os objetos podem ser referenciados por um ponteiro 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 a contagem de referência de um ponteiro de objeto conhecido em um. ObReferenceObject simplesmente aumenta a contagem de referências. ObReferenceObjectByPointer faz um marcar de acesso antes de aumentar a contagem de referência.

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

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 conterá 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 só pode ser acessado pelo nome, desde que sua contagem de identificadores não seja zero. Depois que a contagem de identificadores 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 ser tornado 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 caia para zero.)