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 der niedrigsten Ebene, der seine Geräteobjekte für gepufferte E/A einrichtet, erfüllt eine Leseanforderung, indem daten zurückgegeben werden, die von seinem Gerät in einen gesperrten Systemraumpuffer bei Irp-AssociatedIrp.SystemBuffer> übertragen werden. Sie erfüllt eine Schreibanforderung, indem Daten aus demselben Puffer an das Gerät übertragen werden.
Folglich führt die DispatchReadWrite-Routine eines solchen Gerätetreibers in der Regel die folgenden Aktionen beim Empfang einer Übertragungsanforderung durch:
Ruft IoGetCurrentIrpStackLocation auf und bestimmt die Richtung der Übertragungsanforderung.
Überprüft die Gültigkeit der Parameter für die Anforderung.
Bei einer Leseanforderung überprüft die Routine in der Regel den IoStackLocation-Parameters.Read.Length-Wert> des Treibers, um festzustellen, ob der Puffer groß genug ist, um vom Gerät übertragene Daten zu empfangen.
Beispielsweise verarbeitet der Systemtastaturklassentreiber Leseanforderungen, die nur aus dem Win32-Benutzereingabethread stammen. Dieser Treiber definiert eine Struktur, KEYBOARD_INPUT_DATA, in der Tastaturanschläge vom Gerät gespeichert werden sollen und zu einem bestimmten Zeitpunkt einige dieser Strukturen in einem internen Ringpuffer enthält, um Leseanforderungen zu erfüllen, sobald sie eingehen.
Bei einer Schreibanforderung überprüft die Routine in der Regel den Wert bei Parameters.Write.Length und überprüft die Daten bei Irp-AssociatedIrp.SystemBuffer> bei Bedarf auf Gültigkeit: d. h., wenn das Gerät nur strukturierte Datenpakete akzeptiert, die Member mit definierten Wertbereichen enthalten.
Wenn Parameter ungültig sind, schließt die DispatchReadWrite-Routine das IRP sofort ab, wie bereits in "Complete IRPs" beschrieben. Andernfalls übergibt die Routine das IRP zur weiteren Verarbeitung durch andere Treiberroutinen, wie unter Übergeben von IRPs an den Treiberstapel beschrieben.
Gerätetreiber auf der niedrigsten Ebene, die gepufferte Ein-/Ausgabe verwenden, müssen in der Regel eine Übertragungsanforderung erfüllen, indem Daten einer Größe gelesen oder geschrieben werden, die vom Anforderer der Übertragung angegeben wurde. Ein solcher Treiber definiert wahrscheinlich eine Struktur für Daten, die von seinem Gerät stammen oder an sein Gerät gesendet werden, und wird wahrscheinlich strukturierte Daten intern zwischenspeichern, wie es der Systemtastatur-Klassentreiber tut.
Treiber, die Daten intern puffern, sollten IRP_MJ_FLUSH_BUFFERS Anforderungen unterstützen und können auch IRP_MJ_SHUTDOWN Anforderungen unterstützen.
Der Treiber der höchsten Ebene in einer Kette ist in der Regel dafür verantwortlich, die Parameter des Eingabe-IRP zu überprüfen, bevor eine Lese-/Schreibanforderung an niedrigere Treiber übergeben wird. Daher können viele Treiber auf niedrigerer Ebene davon ausgehen, dass ihre I/O-Stackpositionen in einem Lese-/Schreib-IRP über gültige Parameter verfügen. Wenn ein Treiber auf der niedrigsten Ebene in einer Kette gerätespezifische Einschränkungen für Datenübertragungen kennt, muss dieser Treiber die Gültigkeit der Parameter an seiner E/A-Stapelposition überprüfen.