Libération des objets Device et Controller
Avant de supprimer un objet de périphérique ou de contrôleur, un pilote doit libérer ses références à des ressources externes, telles que des pointeurs vers des objets d’autres pilotes ou des objets d’interruption, qu’il a stockés dans l’extension de périphérique ou de contrôleur correspondante. Il peut ensuite appeler IoDeleteDevice pour chaque objet d’appareil créé par le pilote. Un pilote non-WDM qui a précédemment appelé IoCreateController doit également appeler IoDeleteController.
Tout objet défini par le noyau pour lequel le pilote fournit un stockage dans une extension de périphérique est automatiquement libéré lorsque la routine Unload appelle IoDeleteDevice avec l’objet d’appareil correspondant. En général, tout objet que la routine DriverEntry ou Reinitialize a configuré en appelant KeInitializeXxx peut être libéré par un appel à IoDeleteDevice si le pilote a fourni du stockage pour cet objet dans son extension de périphérique. Par exemple, si un pilote a une routine CustomTimerDpc et a fourni un stockage pour les objets DPC et minuteur nécessaires dans son extension d’appareil, l’appel à IoDeleteDevice libère ces ressources système.
De même, tout objet défini par le noyau pour lequel le pilote fournit du stockage dans une extension de contrôleur est automatiquement libéré lorsque la routine Unload appelle IoDeleteController avec l’objet contrôleur correspondant.
Si la routine DriverEntry ou Reinitialize appelée IoGetConfigurationInformation pour incrémenter le nombre pour un type particulier d’appareil, la routine Deload doit également appeler IoGetConfigurationInformation et décrémenter le nombre de ses appareils dans la structure globale des informations de configuration du gestionnaire d’E/S, car elle supprime les objets d’appareil correspondants.
Avant de retourner le contrôle, une routine de déchargement est également chargée de libérer toutes les autres ressources allouées au pilote qui n’ont pas encore été libérées par d’autres routines de pilotes.