Séparation des routines DispatchCreate et DispatchClose
Les routines dispatch d’un pilote pour les requêtes IRP_MJ_CREATE et IRP_MJ_CLOSE peuvent ne faire que terminer l’IRP d’entrée avec STATUS_SUCCESS. Pour plus d’informations, consultez Terminer les IIP.
Les routines dispatch d’un autre pilote pour les demandes de IRP_MJ_CREATE et de IRP_MJ_CLOSE peuvent faire plus de travail, en fonction du pilote de périphérique sous-jacent ou de l’appareil sous-jacent. Considérez les scénarios suivants :
À la réception d’une demande de création, un pilote de classe peut initialiser une file d’attente interne et envoyer une demande de IRP_MJ_INTERNAL_DEVICE_CONTROL au pilote de port correspondant demandant des informations de configuration de périphérique ou un accès exclusif à un port de contrôleur.
La réception de IRP_MJ_CLOSE indique que la dernière référence à l’objet de fichier associé à l’objet d’appareil cible a été supprimée. Cela implique que tous les handles de l’objet fichier ont été fermés et que toutes les demandes d’E/S en suspens ont été terminées ou annulées.
À la réception d’une demande de création, un pilote d’un appareil rarement utilisé peut appeler MmLockPagableCodeSection pour faire en sorte que certaines des routines de pilotes qui traitent d’autres demandes IRP_MJ_XXX . À la réception d’une demande de fermeture réciproque, le pilote peut appeler MmUnlockPagableImageSection pour conserver la mémoire système en faisant en sorte que sa section d’image paginable soit paginée lorsque tous les handles d’objet de fichier pour les objets de périphérique d’un tel pilote sont fermés.
Certains pilotes ne gèrent IRP_MJ_CLOSE demandes que pour la symétrie, car, une fois que leurs objets d’appareil ont été ouverts par un sous-système protégé ou un pilote de niveau supérieur, les objets d’appareil des pilotes de niveau inférieur ne sont pas fermés tant que le système lui-même n’est pas arrêté. Par exemple, les pilotes de clavier et de souris configurent des objets d’appareil représentant des appareils physiques qui doivent être fonctionnels pendant l’exécution du système, de sorte que ces pilotes peuvent avoir des routines DispatchClose minimales pour la symétrie, ou ils peuvent avoir combiné des routines DispatchCreateClose .
Si l’appareil contrôlé par un pilote de niveau inférieur doit être disponible pour que le système continue à fonctionner, la routine DispatchClose du pilote n’est généralement pas appelée. Par exemple, certains des pilotes de disque système n’ont pas de routine DispatchClose , mais ces pilotes ont généralement des routines DispatchFlushBuffers et DispatchShutdown pour effectuer toutes les opérations d’E/S de fichier en cours avant l’arrêt du système.
Bien que vous puissiez implémenter des routines DRIVER_DISPATCH et DispatchClose distinctes, les pilotes ont parfois une seule routine DispatchCreateClose pour gérer à la fois les demandes de création et de fermeture.