Escribir una rutina de reinicialización
Cualquier controlador que necesite inicializarse en fases puede contener una rutina de reinicialización . Se llama a una rutina de reinicialización después de que la rutina DriverEntry haya devuelto el control y otros controladores se hayan inicializado. Normalmente, la rutina Reinicializar realiza tareas que se deben realizar después de que se inicie otro controlador.
Por ejemplo, el controlador de clase de teclado del sistema, kbdclass, admite puertos de teclado PnP y heredados. Si un sistema incluye uno o varios puertos heredados que el administrador de PnP no puede detectar, el controlador de clase de teclado debe, sin embargo, crear un objeto de dispositivo para cada puerto y capas sobre controladores de nivel inferior para el puerto. Por lo tanto, el controlador de clase tiene una rutina de reinicialización a la que se debe llamar después de llamar a sus rutinas DriverEntry y AddDevice y se han cargado otros controladores. La rutina Reinicializar detecta el puerto, crea un objeto de dispositivo para él y en capas el controlador sobre otros controladores de nivel inferior para el dispositivo.
La rutina DriverEntry de un controlador llama a IoRegisterDriverReinitialization para poner en cola una rutina Reinitialize para su ejecución. La rutina Reinitialize también puede llamar a IoRegisterDriverReinitialization , lo que hace que se vuelva a poner en cola la rutina. Uno de los parámetros para reinicializar indica el número de veces que se ha llamado a .
La llamada a IoRegisterDriverReinitialization puede incluir un puntero a los datos de contexto definidos por el controlador, que el sistema proporciona como entrada para reinicializar. Si la rutina Reinitialize usa el registro, los datos de contexto deben incluir el puntero RegistryPath que se pasó a la rutina DriverEntry porque este puntero no es un parámetro de entrada para la rutina Reinitialize .
No se llamará a la rutina Reinitialize si DriverEntry no devuelve STATUS_SUCCESS.
Normalmente, un controlador con una rutina Reinitialize es un controlador de nivel superior que controla los dispositivos PnP y heredados. Además de crear objetos de dispositivo para los dispositivos que detecta el administrador de PnP (y para los que el administrador de PnP llama a la rutina AddDevice del controlador), el controlador también debe crear objetos de dispositivo para dispositivos heredados que el administrador de PnP no enumera. La rutina Reinicializar crea esos objetos de dispositivo y capas el controlador sobre el controlador siguiente inferior para el dispositivo subyacente.
Si un controlador tiene una rutina de reinicialización, se inicializa en los mismos pasos básicos descritos en Escribir una rutina DriverEntry y también tiene los mismos requisitos básicos que su rutina DriverEntry .