Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Jeder Gerätetreiber auf niedrigerer Ebene, der seine Geräteobjekte für direkte E/A einrichtet, erfüllt eine Leseanforderung, indem Daten zurückgegeben werden, die vom Gerät an den physischen Systemspeicher übertragen werden, der von der MDL bei Irp-MdlAddress> beschrieben wird. Sie erfüllt eine Schreibanforderung, indem Daten aus dem physischen Systemspeicher an das Gerät übertragen werden.
Treiber auf niedrigerer Ebene müssen Lese-/Schreibanforderungen asynchron verarbeiten. Daher muss jede DispatchReadWrite-Routine eines Treibers auf niedrigerer Ebene die IRP_MJ_READ- und IRP_MJ_WRITE-IRPs mit gültigen Parametern an andere Treiberroutinen weitergeben, wie im Abschnitt Übergeben von IRPs im Treiberstapel beschrieben.
Für IRPs mit Lese-/Schreibzugriff, die an Treiber niedrigerer Ebene gesendet werden, wurde der von der MDL bei Irp-MdlAddress> beschriebene physische Speicher bereits auf die richtigen Zugriffsrechte für die Durchführung der angeforderten Übertragung überprüft und wurde bereits vom Treiber der höchsten Ebene in der Kette oder vom E/A-Manager gesperrt. Jeder Treiber auf mittlerer oder niedrigster Ebene, der seine Geräteobjekte für direkte E/A einrichtet, sollte mmProbeAndLockPages nicht aufrufen, da dies bereits geschehen ist. Ein Treiber der niedrigsten Ebene ruft MmGetSystemAddressForMdlSafe auf. (Treiber für Windows 98 rufen stattdessen MmGetSystemAddressForMdl auf. Treiber für Windows Me, Windows 2000 und höhere Versionen von Windows sollten MmGetSystemAddressForMdlSafe verwenden.)
Die DispatchReadWrite-Routine eines Gerätetreibers auf mittlerer oder niedrigster Ebene sollte die Parameter an der I/O-Stapelposition für Lese-/Schreib-IRPs überprüfen, falls sie einem höherstufigen Treiber nicht trauen kann, dass nur IRPs mit gültigen Parametern übergeben werden. Wenn die DispatchReadWrite-Routine einen Parameterfehler findet, sollte der IRP mit einem entsprechenden Fehler-STATUS_XXX-Wert abgeschlossen werden, wie bereits in IRPs abschließen beschrieben. Wenn Parameter gültig sind, muss die DispatchReadWrite-Routine eines Zwischentreibers die Anforderung zur weiteren Verarbeitung gemäß den Richtlinien in DispatchReadWrite in Higher-Level Drivers übergeben.
Die DispatchReadWrite-Routine eines Gerätetreibers auf der niedrigsten Ebene muss IoMarkIrpPending mit der Übertragungsanforderung aufrufen, das IRP zur weiteren Verarbeitung durch andere Treiberroutinen übergeben und STATUS_PENDING zurückgeben, wie unter Übergeben von IRPs nach unten im Treiberstapel beschrieben.
Beachten Sie, dass die DispatchReadWrite-Routine eines Gerätetreibers die Reihenfolge steuern kann, in der IRPs für einen schnelleren E/A-Durchsatz in die Warteschlange gestellt werden, indem IoStartPacket mit einem treiberbestimmten Schlüsselwert aufgerufen wird. Eine weitere Routine des Treibers dekettet das IRP später, bestimmt, ob die angeforderte Länge in Teilübertragungsvorgänge aufgeteilt werden muss, und programmiert das Gerät für die Datenübertragung.
Im Allgemeinen sollte ein Gerätetreiber, der große Übertragungsanforderungen entsprechend den Einschränkungen seines Geräts aufteilen muss, diese Vorgänge erst vor dem Einrichten des Geräts für eine bestimmte Übertragungsanforderung verschieben. Eine solche DispatchReadWrite-Routine eines Gerätetreibers sollte die I/O-Stapelposition eingehender IRPs nicht auf gerätespezifische Übertragungseinschränkungen überprüfen oder versuchen, Teilübertragungsbereiche zu berechnen, wenn der Treiber diese Prüfungen erst vor dem StartIo-Programm (oder anderen Treiberroutine) für einen Übertragungsvorgang verschieben kann.