Routines de répartition facultatives
Les pilotes peuvent inclure les routines de répartition suivantes :
-
IRP_MJ_CLEANUP indique que le dernier handle d’un objet de fichier associé à l’objet d’appareil cible est en cours de fermeture. Les demandes d’E/S en attente pour l’objet fichier peuvent toujours exister. Les pilotes peuvent implémenter une routine DispatchCleanup pour effectuer un nettoyage qui n’est pas spécifique à un handle de fichier particulier. Les pilotes peuvent également utiliser leur routine DispatchClose dans le même but.
DispatchQueryInformation, DispatchSetInformation
Certains pilotes de niveau supérieur peuvent devoir traiter IRP_MJ_QUERY_INFORMATION et IRP_MJ_SET_INFORMATION IRPs. Ces demandes indiquent qu’une application en mode utilisateur, un composant en mode noyau ou un pilote a demandé des informations sur la longueur de l’objet de fichier (représentant l’objet de périphérique du pilote) pour lequel le demandeur en mode utilisateur dispose d’un handle, ou que le demandeur en mode utilisateur tente de définir une fin de fichier sur cet objet de fichier.
Les pilotes de périphérique série et de classe parallèle gèrent ces requêtes en définissant la longueur ou la position du FILE_STANDARD_INFORMATION ou FILE_POSITION_INFORMATION sur zéro. D’autres pilotes de périphérique de niveau supérieur doivent prendre en charge ces demandes, en particulier si une application en mode utilisateur ou un pilote en mode noyau peut appeler des fonctions runtime C pour manipuler l’objet de fichier. Les pilotes de système de fichiers doivent prendre en charge ces demandes plus entièrement que ces pilotes de périphérique de niveau supérieur.
-
Un pilote qui met en cache des données dans un appareil ou met en mémoire tampon les données en interne dans la mémoire allouée au pilote peut recevoir IRP_MJ_FLUSH_BUFFERS. La réception de cette demande indique que le pilote doit écrire ses données mises en mémoire tampon ou vider les données mises en cache sur l’appareil, ou doit ignorer les données mises en mémoire tampon ou mises en cache qui ont été lues à partir de l’appareil.
Par exemple, les pilotes de classe de clavier et de souris système, qui ont des mémoires tampons en anneau internes pour les données d’entrée de leurs appareils, prennent en charge la demande de vidage. Les pilotes des périphériques de stockage de masse et les pilotes superposés prennent également en charge cette demande.
-
Tout pilote susceptible d’être appelé avant l’arrêt du système doit gérer IRP_MJ_SHUTDOWN. La routine DispatchShutdown doit effectuer le nettoyage déterminé par le pilote avant que le gestionnaire d’alimentation envoie un IRP de set-power pour arrêter le système. Un pilote peut appeler IoRegisterShutdownNotification ou IoRegisterLastChanceShutdownNotification pour s’inscrire à la notification d’arrêt.
Les pilotes pour les périphériques de stockage de masse et les pilotes intermédiaires superposés peuvent s’appuyer sur un pilote de système de fichiers de niveau supérieur pour les envoyer arrêter les IIP lorsque le système est sur le point de s’arrêter. Autrement dit, le FSD est chargé de s’assurer que toutes les données de fichier mis en cache sont écrites sur les périphériques, d’appeler les pilotes sous-jacents pour vider les données de leurs caches ou mémoires tampons d’appareil (le cas échéant), et ainsi de suite avant l’arrêt du système.
Le pilote d’un appareil de stockage de masse qui met en cache des données en interne doit fournir des routines DispatchShutdown et DispatchFlushBuffers . Si un pilote de stockage de masse met en mémoire tampon les données mais que son appareil n’a pas de cache interne, il doit également fournir des routines DispatchShutdown et DispatchFlushBuffers .
Tout pilote intermédiaire en couche au-dessus d’un pilote qui gère les requêtes IRP_MJ_FLUSH_BUFFERS et IRP_MJ_SHUTDOWN fournit également des routines DispatchShutdown et DispatchFlushBuffers .