Ciclo de vida de un objeto

En este tema se describe el "ciclo de vida" de un objeto, es decir, cómo se hace referencia a los objetos y se realiza un seguimiento por parte del administrador de objetos. En este tema también se describe cómo hacer que los objetos sean temporales o permanentes.

Recuento de referencias de objetos

El administrador de objetos mantiene un recuento del número de referencias a un objeto . Cuando se crea un objeto, el administrador de objetos establece el recuento de referencias del objeto en uno. Una vez que ese contador cae a cero, el objeto se libera.

Los controladores deben asegurarse de que el administrador de objetos tiene un recuento de referencias preciso para los objetos que manipulan. Un objeto que se libera prematuramente puede hacer que el sistema se bloquee. Un objeto cuyo recuento de referencias es erróneamente alto nunca se liberará.

Se puede hacer referencia a los objetos mediante identificador o por puntero. Además del recuento de referencias, el administrador de objetos mantiene un recuento del número de identificadores abiertos en un objeto. Cada rutina que abre un identificador aumenta tanto el recuento de referencias de objetos como el recuento de identificadores de objeto en uno. Cada llamada a esta rutina debe coincidir con una llamada correspondiente a ZwClose. Para obtener más información, vea Identificadores de objeto.

Dentro del modo kernel, un puntero al objeto puede hacer referencia a los objetos . Las rutinas que devuelven punteros a objetos, como IoGetAttachedDeviceReference, aumentan el recuento de referencias en uno. Una vez que el controlador haya terminado con el puntero, debe llamar a ObDereferenceObject para reducir el recuento de referencias en uno.

Todas las rutinas siguientes aumentan el recuento de referencias de un objeto en uno:

ExCreateCallback

IoGetAttachedDeviceReference

IoGetDeviceObjectPointer

IoWMIOpenBlock

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

Cada llamada que se realiza a cualquiera de las rutinas anteriores debe coincidir con una llamada correspondiente a ObDereferenceObject.

Las rutinas ObReferenceObject y ObReferenceObjectByPointer se proporcionan para que los controladores puedan aumentar el recuento de referencias de un puntero de objeto conocido en uno. ObReferenceObject simplemente aumenta el recuento de referencias. ObReferenceObjectByPointer realiza una comprobación de acceso antes de aumentar el recuento de referencias.

La rutina ObReferenceObjectByHandle recibe un identificador de objeto y proporciona un puntero al objeto subyacente. También aumenta el recuento de referencias en uno.

Objetos temporales y permanentes

La mayoría de los objetos son temporales; existen siempre que estén en uso y, a continuación, los libera el administrador de objetos. Se pueden crear objetos que son permanentes. Si un objeto es permanente, el propio administrador de objetos contiene una referencia al objeto . Por lo tanto, su recuento de referencias sigue siendo mayor que cero y el objeto no se libera cuando ya no está en uso.

Solo se puede tener acceso a un objeto temporal por nombre siempre que su recuento de identificadores sea distinto de cero. Una vez que el recuento de identificadores disminuye en cero, el nombre del objeto se quita del espacio de nombres del administrador de objetos. Todavía se puede acceder a estos objetos por puntero siempre que su recuento de referencias siga siendo mayor que cero. Se puede tener acceso a objetos permanentes por nombre siempre y cuando existan.

Un objeto se puede hacer permanente en el momento de su creación especificando el atributo OBJ_PERMANENT en la estructura OBJECT_ATTRIBUTES para el objeto . Para obtener más información, vea InitializeObjectAttributes.

Para que un objeto permanente sea temporal, use la rutina ZwMakeTemporaryObject . Esta rutina hace que un objeto se elimine automáticamente una vez que ya no esté en uso. (Si el objeto no tiene identificadores abiertos, el nombre del objeto se quita inmediatamente del espacio de nombres del administrador de objetos. El propio objeto permanece hasta que el recuento de referencias cae a cero).