Ciclo de vida de objetos de marco

El "ciclo de vida" de un objeto de marco abarca el tiempo desde el momento en que se crea un objeto hasta cuando se elimina. El recuento de referencias de un objeto controla cuándo se eliminará.

Creación de un objeto Framework

La mayoría de los objetos de marco se crean mediante la llamada de un controlador al método de creación del objeto. Por ejemplo, cada controlador de marco debe llamar a WdfDriverCreate para crear un objeto de controlador de marco.

El marco crea otros objetos de marco. Por ejemplo, cuando una aplicación de usuario abre un dispositivo para operaciones de lectura o escritura, el marco crea un objeto de archivo de marco y lo pasa a la función de devolución de llamada EvtDeviceFileCreate del controlador.

Algunos objetos de marco se pueden crear mediante el marco o un controlador. Por ejemplo, cuando el administrador de E/S entrega una solicitud de E/S a un controlador, el marco crea un objeto de solicitud de marco y lo entrega al controlador, normalmente llamando a uno de los controladores de solicitudes del controlador. Un controlador también puede crear objetos de solicitud de marco y entregarlos a otros controladores.

Uso de recuentos de referencia

El marco mantiene un recuento de referencias para cada objeto. Cuando se crea un objeto, el marco establece su recuento de referencias en uno. Si el recuento de referencias se convierte en cero, el marco elimina el objeto .

Los controladores pueden modificar el recuento de referencias de un objeto llamando a WdfObjectReference para incrementar el recuento de referencias o WdfObjectDereference para disminuir el recuento de referencias. (Un controlador puede llamar a WdfObjectDereference solo si anteriormente se ha llamado a WdfObjectReference).

En la mayoría de los casos, los controladores no tienen que incrementar o disminuir el recuento de referencias de un objeto. El marco incrementa el recuento antes de pasar el identificador del objeto al controlador y disminuye el recuento cuando el controlador ya no necesita el objeto.

Los controladores llaman a WdfObjectReference para asegurarse de que un objeto no se eliminará (por el marco o por un subproceso de controlador) antes de que el controlador haya terminado de usarlo. Para obtener una situación de ejemplo en la que un controlador debe llamar a WdfObjectReference y WdfObjectDereference, vea Synchronizing Cancellation of Sent Requests.

Eliminación de un objeto framework

Los objetos se eliminan porque un controlador llama a WdfObjectDelete o porque el marco llama a una rutina de eliminación interna, pero un objeto solo se elimina si su recuento de referencias es cero. Una vez que el controlador o el marco de trabajo han intentado eliminar un objeto, el identificador del objeto permanece válido hasta que el recuento de referencias se convierte en cero. Un controlador no puede eliminar un objeto simplemente llamando a WdfObjectDereference para disminuir el recuento de referencias del objeto en cero; el controlador también debe llamar a WdfObjectDelete.

Si un objeto de marco es el objeto secundario de un elemento primario y el elemento primario se está eliminando, el marco intenta eliminar el objeto secundario antes de eliminar el elemento primario. La eliminación de objetos comienza desde el objeto más alejado del elemento primario y funciona en la jerarquía de objetos hacia la raíz.

Los controladores pueden registrar las dos funciones de devolución de llamada siguientes a las que llama el marco cuando el controlador o el marco están eliminando un objeto:

  • Función de devolución de llamada EvtCleanupCallback , a la que llama el marco para que el controlador pueda llamar a WdfObjectDereference si anteriormente había llamado A WdfObjectReference para el objeto que se está eliminando.

  • Función de devolución de llamada EvtDestroyCallback , que el marco llama después de que el recuento de referencias del objeto se haya reducido a cero.

Una de estas funciones de devolución de llamada debe desasignar todos los recursos específicos del objeto asignados al crear el objeto.

El marco siempre controla la eliminación de algunos objetos de marco y los controladores no deben intentar eliminar estos objetos. Para obtener una lista de objetos de marco que los controladores no pueden eliminar, vea WdfObjectDelete.