Freigeben über


DispatchReadWrite mit gepufferten E/A-Vorgängen

Jeder Gerätetreiber der niedrigsten Ebene, der seine Geräteobjekte für gepufferte E/A-Vorgänge einrichtet, erfüllt eine Leseanforderung, indem daten, die von seinem Gerät übertragen wurden, in einen gesperrten Systemspeicherpuffer bei Irp-AssociatedIrp.SystemBuffer> zurückgegeben werden. Es erfüllt eine Schreibanforderung, indem Daten aus demselben Puffer auf das Gerät übertragen werden.

Folglich führt die DispatchReadWrite-Routine eines solchen Gerätetreibers in der Regel folgendes aus, wenn eine Übertragungsanforderung empfangen wird:

  1. Ruft IoGetCurrentIrpStackLocation auf und bestimmt die Richtung der Übertragungsanforderung.

  2. Überprüft die Gültigkeit der Parameter für die Anforderung.

    • Bei einer Leseanforderung überprüft die Routine normalerweise den IoStackLocation-Parameters.Read.Length-Wert> des Treibers, um zu ermitteln, ob der Puffer groß genug ist, um vom Gerät übertragene Daten zu empfangen.

      Beispielsweise verarbeitet der Systemtastataturklassentreiber Leseanforderungen, die nur aus dem Win32-Benutzereingabethread stammen. Dieser Treiber definiert eine Struktur, KEYBOARD_INPUT_DATA, in der Tastenanschläge vom Gerät gespeichert werden sollen, und hält zu jedem zeitpunkt eine bestimmte Anzahl dieser Strukturen in einem internen Ringpuffer bereit, um Leseanforderungen zu erfüllen, sobald sie eintreffen.

    • Bei einer Schreibanforderung überprüft die Routine in der Regel den Wert unter Parameters.Write.Length und überprüft die Daten bei Irp-AssociatedIrp.SystemBuffer> bei Bedarf auf Ihre Gültigkeit: Das heißt, wenn das Gerät nur strukturierte Datenpakete akzeptiert, die Member mit definierten Wertbereichen enthalten.

  3. Wenn Parameter ungültig sind, schließt die DispatchReadWrite-Routine die IRP sofort ab, wie bereits unter Abschließen von IRPs beschrieben. Andernfalls übergibt die Routine den IRP zur weiteren Verarbeitung durch andere Treiberroutinen, wie unter Übergeben von IRPs im Treiberstapel beschrieben.

Gerätetreiber der niedrigsten Ebene, die gepufferte E/A verwenden, müssen in der Regel eine Übertragungsanforderung erfüllen, indem sie Daten einer Größe lesen oder schreiben, die vom Absender der Anforderung angegeben wird. Ein solcher Treiber definiert wahrscheinlich eine Struktur für Daten, die von seinem Gerät ein- oder gesendet werden, und wird wahrscheinlich strukturierte Daten intern puffern, wie es der Systemtastataturklassentreiber 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 für die Überprüfung der Parameter der Eingabe-IRP verantwortlich, bevor eine Lese-/Schreibanforderung an niedrigere Treiber übergeben wird. Daher können viele Treiber auf niedrigerer Ebene davon ausgehen, dass ihre E/A-Stapelspeicherorte in einem Lese-/Schreib-IRP über gültige Parameter verfügen. Wenn ein Treiber der niedrigsten Ebene in einer Kette gerätespezifische Einschränkungen für Datenübertragungen kennt, muss dieser Treiber die Gültigkeit der Parameter an seinem E/A-Stapelspeicherort überprüfen.