Uso de un objeto de devolución de llamada de Driver-Defined
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 notificación debe conocer el nombre del objeto de devolución de llamada y debe comprender la semántica 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, una ubicación en la que recibir un identificador a la devolución de llamada y FALSE para el parámetro Create , lo que indica 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 prototipo siguiente:
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 autor de la llamada debe asignar desde un grupo no paginado si se puede llamar a la rutina en DISPATCH_LEVEL. Los dos argumentos se definen mediante el componente que creó la devolución de llamada. Normalmente, los argumentos proporcionan información sobre las condiciones que desencadenaron la devolución de llamada.
Cuando el creador de la devolución de llamada desencadena la notificación, el sistema llama a la rutina registrada, pasando un puntero al contexto y 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 se desencadena la notificación del controlador de creación, que siempre es IRQL <= DISPATCH_LEVEL.
En su rutina de devolución de llamada, un controlador puede realizar las tareas que requiera 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.