Freigeben über


DispatchReadWrite mit direkter E/A

Jeder Gerätetreiber auf niedrigerer Ebene, der seine Geräteobjekte für direkte E/A-Vorgänge einrichtet, erfüllt eine Leseanforderung, indem er Daten zurückgibt, die von seinem Gerät an den physischen Arbeitsspeicher des Systems übertragen wurden, was von der MDL unter Irp-MdlAddress> beschrieben wird. Es erfüllt eine Schreibanforderung, indem Daten aus dem physischen Systemspeicher auf das Gerät übertragen werden.

Treiber auf niedrigerer Ebene müssen Lese-/Schreibanforderungen asynchron verarbeiten. Daher muss die DispatchReadWrite-Routine jedes Treibers auf niedrigerer Ebene IRP_MJ_READ und IRP_MJ_WRITE IRPs mit gültigen Parametern an andere Treiberroutinen übergeben, wie unter Übergeben von IRPs im Treiberstapel beschrieben.

Für Lese-/Schreib-IRPs, die an Treiber auf niedrigerer Ebene gesendet werden, wurde der von der MDL bei Irp-MdlAddress> beschriebene ausgelagerte physische Speicher bereits auf die richtigen Zugriffsrechte für die angeforderte Übertragung untersucht und 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-Vorgänge 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 in seinem E/A-Stapelspeicherort von Lese-/Schreib-IRPs überprüfen, wenn es einem Treiber auf höherer Ebene nicht vertrauen kann, nur IRPs mit gültigen Parametern zu übergeben. Wenn die DispatchReadWrite-Routine einen Parameterfehler findet, sollte sie den IRP mit einem entsprechenden Fehler STATUS_XXX-Wert abschließen, wie bereits unter Abschließen von IRPs beschrieben. Wenn Parameter gültig sind, muss die DispatchReadWrite-Routine eines Zwischentreibers die Anforderung zur weiteren Verarbeitung übergeben, gemäß den Richtlinien in DispatchReadWrite in Higher-Level Drivers.

Die DispatchReadWrite-Routine eines Gerätetreibers der niedrigsten Ebene muss IoMarkIrpPending mit der Übertragungsanforderung aufrufen, den IRP zur weiteren Verarbeitung durch andere Treiberroutinen übergeben und STATUS_PENDING zurückgeben, wie unter Übergeben von IRPs 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 vom Treiber bestimmten Schlüsselwert aufgerufen wird. Eine andere Routine im Treiber dequeniert den IRP später, bestimmt, ob die angeforderte Länge in Teilweiseübertragungsvorgänge aufgeteilt werden muss, und programmiert das Gerät, um Daten zu übertragen.

Im Allgemeinen sollte ein Gerätetreiber, der große Übertragungsanforderungen aufteilen muss, um die Einschränkungen seines Geräts zu erfüllen, diese Vorgänge bis kurz vor der Einrichtung des Geräts für eine bestimmte Übertragungsanforderung verschieben. Die DispatchReadWrite-Routine eines solchen Gerätetreibers sollte nicht den E/A-Stapelspeicherort eingehender IRPs auf gerätespezifische Übertragungseinschränkungen überprüfen und auch nicht versuchen, teilübertragungsbereiche zu berechnen, wenn der Treiber diese Überprüfungen bis kurz vor dem Programm "StartIo " (oder einer anderen Treiberroutine) für einen Übertragungsvorgang verschieben kann.