Uso de un objeto de devolución de llamada de System-Defined
El sistema define tres objetos de devolución de llamada para el uso del controlador:
\Callback\SetSystemTime
\Callback\PowerState
\Callback\ProcessorAdd
Los controladores que usan la hora del sistema (por ejemplo, controladores del sistema de archivos) pueden registrarse para el objeto de devolución de llamada \Callback\SetSystemTime . Esta devolución de llamada proporciona una notificación cuando cambia la hora del sistema.
El objeto de devolución de llamada \Callback\PowerState proporciona una notificación cuando se produce una de las siguientes acciones:
El sistema cambia de CA a alimentación dc o viceversa.
La directiva de energía del sistema cambia como resultado de una solicitud de usuario o aplicación.
Una transición a un estado de suspensión o apagado del sistema es inminente. Un controlador puede solicitar una notificación para que pueda bloquear el código en la memoria con anticipación del apagado. Las rutinas de devolución de llamada se notificarán antes de que el administrador de energía envíe el IRP de energía establecida por el sistema.
La devolución de llamada \Callback\ProcessorAdd proporciona una notificación cuando se agrega un nuevo procesador al sistema.
Para usar una devolución de llamada definida por el sistema, un controlador inicializa un bloque de atributos llamando a InitializeObjectAttributes con el nombre de la devolución de llamada y, a continuación, abre el objeto de devolución de llamada (ExCreateCallback), igual que para una devolución de llamada definida por el controlador. El controlador no debe solicitar que se cree el objeto de devolución de llamada.
Con el identificador devuelto por ExCreateCallback, el controlador llama a ExRegisterCallback para registrar una rutina de notificación, pasando un puntero a un contexto arbitrario y un puntero a su rutina. Un controlador puede registrar su rutina de devolución de llamada en cualquier momento. Cuando se produce la condición especificada, el sistema llama a la rutina de devolución de llamada registrada en IRQL<=DISPATCH_LEVEL.
Cuando el controlador ya no requiera notificación, debe llamar a ExUnregisterCallback para eliminar su rutina de devolución de llamada de la lista de devoluciones de llamada registradas y quitar su referencia al objeto de devolución de llamada.