Compartir a través de


Definición de un objeto de devolución de llamada

Un controlador puede crear un objeto de devolución de llamada, a través del cual otros controladores pueden solicitar la notificación de las condiciones definidas por el controlador de creación. En la ilustración siguiente se muestran los pasos necesarios para definir un objeto de devolución de llamada.

diagrama que ilustra la definición de un objeto de devolución de llamada.

Antes de crear el objeto, el controlador llama a InitializeObjectAttributes para establecer sus atributos. Un objeto de devolución de llamada debe tener un nombre, que no puede coincidir con el nombre de una devolución de llamada definida por el sistema; puede tener cualquier otro atributo que considere adecuado su creador, normalmente OBJ_CASE_INSENSITIVE. A continuación, el controlador llama a ExCreateCallback, pasando un puntero a los atributos inicializados y una ubicación en la que recibir un identificador para el objeto de devolución de llamada. También pasa dos valores booleanos, lo que indica si el sistema debe crear el objeto de devolución de llamada si dicho objeto con nombre aún no existe y si el objeto debe permitir más de una rutina de devolución de llamada registrada.

El controlador define las condiciones para las que llamará a las rutinas de devolución de llamada registradas. Las condiciones tienen la forma de dos argumentos, cada uno que apunta a un parámetro definido por el controlador que crea la devolución de llamada. Debe documentar estas condiciones, junto con el nombre del objeto de devolución de llamada y el IRQL en el que solicita la notificación, para los clientes del controlador.

Cuando se produce la condición de devolución de llamada, el controlador llama a ExNotifyCallback, pasando su identificador al objeto de devolución de llamada y los dos argumentos. A continuación, el sistema llama a todas las rutinas de devolución de llamada registradas para el objeto de devolución de llamada, en el orden en que se registraron, pasando los dos argumentos y un puntero al contexto proporcionado cuando se registró la rutina. El controlador debe llamar a ExNotifyCallback en IRQL <= DISPATCH_LEVEL; el sistema llama a las rutinas de devolución de llamada en el mismo IRQL en el que el controlador realizó esta llamada.

Una vez completadas todas las operaciones con el objeto de devolución de llamada, el controlador que creó la devolución de llamada debe llamar a ObDereferenceObject para disminuir su recuento de referencias y asegurarse de que se elimina el objeto.