Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para usar un objeto de devolución de llamada definido por otro controlador, un controlador abre el objeto y, a continuación, registra una rutina a la que se llamará cuando se desencadene la devolución de llamada, como se muestra en la ilustración siguiente. El controlador que solicita la notificación debe conocer el nombre del objeto de devolución de llamada y entender el significado de los argumentos pasados a la rutina de devolución de llamada.

Para poder abrir el objeto, el controlador debe llamar a InitializeObjectAttributes para crear un bloque de atributos, especificando el nombre del objeto. Una vez que tiene un puntero a un bloque de atributos, llama a ExCreateCallback, pasando el puntero de atributo, un espacio para obtener un identificador para la devolución de llamada y FALSE para el parámetro Create, indicando que requiere un objeto de devolución de llamada existente.
A continuación, el controlador puede llamar a ExRegisterCallback con el identificador devuelto para registrar su rutina de devolución de llamada.
La rutina de devolución de llamada tiene el siguiente prototipo:
typedef VOID (*PCALLBACK_FUNCTION ) (
IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2
);
El parámetro CallbackContext es el puntero de contexto que se va a pasar a la rutina de devolución de llamada cada vez que se llama. Normalmente, este parámetro es un puntero a un bloque de datos de contexto, que el llamador debe asignar desde un grupo no paginado si se puede llamar a la rutina en DISPATCH_LEVEL. Los dos argumentos están definidos por el componente que creó el callback. Normalmente, los argumentos proporcionan información sobre las condiciones que desencadenaron el callback.
Cuando el creador del callback desencadena la notificación, el sistema llama a la rutina registrada, pasando un puntero hacia el contexto junto con los dos argumentos. El componente que creó la devolución de llamada proporciona valores para los argumentos. Se llama a la rutina de devolución de llamada en el mismo IRQL en el que el controlador que crea activó la notificación, que siempre es IRQL <= DISPATCH_LEVEL.
En su rutina de callback, un controlador puede realizar las tareas que sean necesarias para las condiciones actuales.
Cuando el controlador ya no requiere notificación, debe llamar a ExUnregisterCallback para quitar su rutina de la lista de devoluciones de llamada registradas y quitar su referencia al objeto de devolución de llamada.