Optionale Versandroutinen
Treiber können die folgenden Dispatchroutinen enthalten:
-
IRP_MJ_CLEANUP gibt an, dass das letzte Handle für ein Dateiobjekt, das dem Zielgerätobjekt zugeordnet ist, geschlossen wird. Möglicherweise sind noch ausstehende E/A-Anforderungen für das Dateiobjekt vorhanden. Treiber können eine DispatchCleanup-Routine implementieren, um eine Bereinigung durchzuführen, die nicht für ein bestimmtes Dateihandle spezifisch ist. Treiber können auch ihre DispatchClose-Routine für denselben Zweck verwenden.
DispatchQueryInformation, DispatchSetInformation
Einige Treiber der höchsten Ebene müssen möglicherweise IRP_MJ_QUERY_INFORMATION und IRP_MJ_SET_INFORMATION IRPs verarbeiten. Solche Anforderungen weisen darauf hin, dass eine Anwendung im Benutzermodus, eine Kernelmoduskomponente oder ein Treiber Informationen über die Länge des Dateiobjekts angefordert hat (das das Geräteobjekt des Treibers darstellt), für das der Benutzermodus-Anforderer über ein Handle verfügt, oder dass der Benutzermodus-Anforderer versucht, ein Dateiende für dieses Dateiobjekt festzulegen.
Parallele Klassen- und serielle Gerätetreiber verarbeiten diese Anforderungen, indem sie die FILE_STANDARD_INFORMATION oder FILE_POSITION_INFORMATION Länge oder Position auf 0 festlegen. Andere Gerätetreiber der höchsten Ebene sollten diese Anforderungen unterstützen, insbesondere, wenn eine Benutzermodusanwendung oder ein Kernelmodustreiber C-Laufzeitfunktionen aufruft, um das Dateiobjekt zu bearbeiten. Dateisystemtreiber müssen diese Anforderungen vollständiger unterstützen als diese Gerätetreiber der höchsten Ebene.
-
Ein Treiber, der Daten auf einem Gerät zwischenspeichert oder Daten intern im vom Treiber zugewiesenen Speicher puffert, kann IRP_MJ_FLUSH_BUFFERS empfangen. Der Empfang dieser Anforderung gibt an, dass der Treiber seine gepufferten Daten schreiben oder die zwischengespeicherten Daten auf das Gerät leeren oder gepufferte oder zwischengespeicherte Daten verwerfen sollte, die vom Gerät gelesen wurden.
Beispielsweise unterstützen die Treiber der Systemtastatatur- und Mausklasse, die über interne Ringpuffer für Eingabedaten von ihren Geräten verfügen, die Flush-Anforderung. Treiber von Massenspeichergeräten und Treibern, die über ihnen liegen, unterstützen diese Anforderung ebenfalls.
-
Jeder Treiber, der wahrscheinlich aufgerufen wird, bevor das System heruntergefahren wird, muss IRP_MJ_SHUTDOWN verarbeiten. Die DispatchShutdown-Routine sollte die vom Treiber festgelegte Bereinigung durchführen, bevor der Energiemanager eine Systemsatz-IRP sendet, um das System herunterzufahren. Ein Treiber kann IoRegisterShutdownNotification oder IoRegisterLastChanceShutdownNotification aufrufen, um sich für die Benachrichtigung zum Herunterfahren zu registrieren.
Treiber für Massenspeichergeräte und Zwischentreiber, die über sie verteilt sind, können sich auf einen Dateisystemtreiber der höchsten Ebene verlassen, um ihnen herunterfahrende IRPs zu senden, wenn das System heruntergefahren wird. Das heißt, der FSD ist dafür verantwortlich, sicherzustellen, dass alle zwischengespeicherten Dateidaten auf Peripheriegeräte geschrieben werden, indem zugrunde liegende Treiber aufgerufen werden, um Daten aus ihren Gerätecaches oder Puffern (falls vorhanden) zu löschen usw., bevor das System heruntergefahren wird.
Der Treiber eines Massenspeichergeräts, das Daten intern zwischenspeichert, muss DispatchShutdown - und DispatchFlushBuffers-Routinen bereitstellen. Wenn ein Massenspeichertreiber Daten im Arbeitsspeicher puffert, sein Gerät jedoch über keinen internen Cache verfügt, muss er auch DispatchShutdown - und DispatchFlushBuffers-Routinen bereitstellen.
Jeder Zwischentreiber, der über einem Treiber liegt, der IRP_MJ_FLUSH_BUFFERS - und IRP_MJ_SHUTDOWN-Anforderungen verarbeitet, stellt auch DispatchShutdown - und DispatchFlushBuffers-Routinen bereit.