Publication de ressources Driver-Allocated
Les spécificités de la façon dont un pilote utilise le Registre, configure les objets système et les ressources dans ses extensions de périphérique, l’extension de contrôleur ou le pool non paginé alloué au pilote varient d’un pilote à l’autre. Toutefois, toute routine de déchargement doit libérer les ressources qu’un pilote utilise par étapes.
La routine de déchargement d’un pilote doit s’assurer qu’aucune autre routine de pilote n’utilise actuellement ou peut bientôt utiliser une ressource particulière avant de libérer cette ressource.
En général, une routine de déchargement libère toutes les ressources allouées au pilote dans les étapes suivantes :
Si le pilote ne l’a pas encore fait, désactivez les interruptions sur tous les appareils physiques, si possible, puis appelez IoDisconnectInterrupt dès que les interruptions sont désactivées.
Assurez-vous qu’aucune autre routine de pilote ne peut référencer les ressources que la routine de déchargement a l’intention de libérer.
Par exemple, une routine de déchargement doit appeler IoStopTimer si la routine IoTimer du pilote est actuellement activée pour un objet d’appareil particulier. Il doit s’assurer qu’aucun thread n’attend les objets de répartiteur du pilote et que ses objets de minuteur ne sont pas mis en file d’attente pour les appels à ses routines CustomTimerDpc avant de libérer le stockage pour ses objets de répartiteur. Il doit appeler KeRemoveQueueDpc s’il a une routine CustomDpc que l’ISR peut avoir mise en file d’attente, et ainsi de suite.
Si le pilote appelé IoQueueWorkItem, il doit s’assurer que l’élément de travail est terminé. IoQueueWorkItem prend une référence sur l’objet d’appareil associé ; le pilote ne peut pas être déchargé s’il reste de telles références.
Si le pilote appelé PsCreateSystemThread, la routine Deload doit également entraîner l’exécution du thread créé par le pilote afin que le thread lui-même puisse appeler PsTerminateSystemThread avant que le pilote ne soit déchargé. Un pilote ne peut pas libérer un thread système créé par un pilote en appelant ZwClose avec le ThreadHandle retourné par PsCreateSystemThread.
Libérez toutes les ressources spécifiques à l’appareil que le pilote a allouées. Cela peut impliquer d’appeler les routines de support système suivantes :
IoDeleteSymbolicLink si la routine DriverEntry ou Reinitialize appelée IoCreateSymbolicLink ou IoCreateUnprotectedSymbolicLink, et IoDeassignArcName si le pilote a appelé IoAssignArcName.
ExFreePool si DriverEntry ou toute autre routine de pilote appelée ExAllocatePoolWithTag et que le pilote n’a pas encore libéré la mémoire allouée.
MmUnmapIoSpace si la routine DriverEntry ou Reinitialize appelée MmMapIoSpace.
MmFreeNonCachedMemory si la routine DriverEntry ou Reinitialize appelée MmAllocateNonCachedMemory.
MmFreeContiguousMemory si la routine DriverEntry ou Reinitialize appelée MmAllocateContiguousMemory.
FreeCommonBuffer si la routine DriverEntry ou Reinitialize appelée AllocateCommonBuffer.
IoAssignResources ou IoReportResourceUsage si la routine DriverEntry ou Reinitialize a appelé l’une de ces routines de prise en charge ou HalAssignSlotResources pour réclamer des ressources matérielles dans le registre de configuration pour elle-même et/ou pour ses appareils physiques individuellement.
Libérer les objets système et les ressources que la routine DriverEntry ou Reinitialize a configurés dans l’extension d’appareil des objets d’appareil ou dans l’extension contrôleur de l’objet contrôleur (s’il en a créé un). En particulier, le pilote doit effectuer les opérations suivantes avant de tenter de supprimer l’objet d’appareil (IoDeleteDevice) ou l’objet contrôleur (IoDeleteController) :
- Appelez IoDisconnectInterrupt pour libérer le pointeur d’objet d’interruption stocké dans l’extension de périphérique ou de contrôleur correspondante.
- Appelez ObDereferenceObject avec le pointeur vers l’objet de fichier du pilote inférieur suivant s’il a appelé IoGetDeviceObjectPointer et stocké ce pointeur dans une extension de périphérique ou de contrôleur.
- Appelez IoDetachDevice avec le pointeur vers l’objet d’appareil du pilote inférieur s’il a appelé IoAttachDevice ou IoAttachDeviceToDeviceStack et stocké ce pointeur dans une extension d’appareil ou de contrôleur.
Libérez les ressources matérielles revendiquées par la routine DriverEntry ou Reinitialize pour les périphériques physiques du pilote, le cas échéant, dans le Registre sous l’arborescence \Registry\Machine\Hardware\ResourceMap .
Supprimez tous les noms de ses appareils que la routine DriverEntry ou Réinitialize stockée dans le Registre sous \Registry.. \DeviceMap tree, aussi.
Une fois que le pilote a libéré des ressources d’appareil, de système et de matériel, il peut supprimer ses objets d’appareil et de contrôleur, comme décrit dans Libérer des objets d’appareil et de contrôleur.