Écriture d’une routine de réinitialisation

Tout pilote qui doit s’initialiser par étapes peut contenir une routine de réinitialisation . Une routine de réinitialisation est appelée une fois que la routine DriverEntry a retourné le contrôle et que d’autres pilotes se sont initialisés. En règle générale, la routine Reinitialize effectue des tâches qui doivent être effectuées après le démarrage d’un autre pilote.

Par exemple, le pilote de classe de clavier du système, kbdclass, prend en charge les ports PnP et clavier hérités. Si un système inclut un ou plusieurs ports hérités que le gestionnaire PnP ne peut pas détecter, le pilote de classe clavier doit néanmoins créer un objet d’appareil pour chaque port et se superposer sur des pilotes de niveau inférieur pour le port. Par conséquent, le pilote de classe a une routine Reinitialize à appeler après que ses routines DriverEntry et AddDevice ont été appelées et que d’autres pilotes ont été chargés. La routine Reinitialize détecte le port, crée un objet d’appareil pour celui-ci et couche le pilote sur d’autres pilotes de niveau inférieur pour l’appareil.

La routine DriverEntry d’un pilote appelle IoRegisterDriverReinitialization pour mettre en file d’attente une routine De réinitialisation pour l’exécution . La routine Reinitialize peut également appeler IoRegisterDriverReinitialization elle-même, ce qui entraîne la mise en file d’attente de la routine. L’un des paramètres à réinitialiser indique le nombre de fois où il a été appelé.

L’appel à IoRegisterDriverReinitialization peut inclure un pointeur vers des données de contexte définies par le pilote, que le système fournit en entrée pour Réinitialiser. Si la routine Reinitialize utilise le Registre, les données de contexte doivent inclure le pointeur RegistryPath qui a été passé à la routine DriverEntry , car ce pointeur n’est pas un paramètre d’entrée de la routine Reinitialize .

La routine De réinitialisation n’est pas appelée si DriverEntry ne retourne pas STATUS_SUCCESS.

En règle générale, un pilote avec une routine de réinitialisation est un pilote de niveau supérieur qui contrôle à la fois pnP et les appareils hérités. En plus de créer des objets d’appareil pour les appareils détectés par le gestionnaire PnP (et pour lesquels le gestionnaire PnP appelle la routine AddDevice du pilote), le pilote doit également créer des objets d’appareil pour les appareils hérités que le gestionnaire PnP n’énumère pas. La routine De réinitialisation crée ces objets d’appareil et couche le pilote sur le pilote inférieur suivant pour l’appareil sous-jacent.

Si un pilote a une routine Réinitialiser , il s’initialise selon les mêmes étapes de base décrites dans Écriture d’une routine DriverEntry, et il a également les mêmes exigences de base que sa routine DriverEntry .