Freigeben über


Methoden für den Zugriff auf Datenpuffer

Eine der hauptverantwortlichen Verantwortlichkeiten von Treiberstapeln besteht darin, Daten zwischen Anwendungen im Benutzermodus und den Geräten eines Systems zu übertragen. Das Betriebssystem bietet die folgenden drei Methoden für den Zugriff auf Datenpuffer:

Gepufferte E/A
Das Betriebssystem erstellt einen nicht seitenseitigen Systempuffer, der der Größe des Anwendungspuffers entspricht. Bei Schreibvorgängen kopiert der E/A-Manager Benutzerdaten vor dem Aufrufen des Treiberstapels in den Systempuffer. Bei Lesevorgängen kopiert der E/A-Manager Daten aus dem Systempuffer in den Puffer der Anwendung, nachdem der Treiberstapel den angeforderten Vorgang abgeschlossen hat.

Weitere Informationen finden Sie unter Verwenden von gepufferten E/A-Vorgängen.

Direkte E/A
Das Betriebssystem sperrt den Puffer der Anwendung im Arbeitsspeicher. Anschließend wird eine Speicherdeskriptorliste (MDL) erstellt, die die gesperrten Speicherseiten identifiziert und die MDL an den Treiberstapel übergibt. Treiber greifen über die MDL auf die gesperrten Seiten zu.

Weitere Informationen finden Sie unter Verwenden von Direct I/O.

Weder gepuffert noch direktes E/A
Das Betriebssystem übergibt die virtuelle Startadresse und Größe des Anwendungspuffers an den Treiberstapel. Auf den Puffer kann nur von Treibern zugegriffen werden, die im Threadkontext der Anwendung ausgeführt werden.

Weitere Informationen finden Sie unter Weder gepufferte noch direkte E/A verwenden.

Für IRP_MJ_READ - und IRP_MJ_WRITE Anforderungen geben Treiber die E/A-Methode mithilfe von Flags in jeder DEVICE_OBJECT Struktur an. Weitere Informationen finden Sie unter Initialisieren eines Device-Objekts.

Für IRP_MJ_DEVICE_CONTROL - und IRP_MJ_INTERNAL_DEVICE_CONTROL-Anforderungen wird die E/A-Methode durch den TransferType-Wert bestimmt, der in jedem IOCTL-Wert enthalten ist. Weitere Informationen finden Sie unter Definieren von E/A-Steuerelementcodes.

Alle Treiber in einem Treiberstapel müssen für jede Anforderung die gleiche Pufferzugriffsmethode verwenden, mit Ausnahme des Treibers der höchsten Ebene (die die "keine" Methode verwenden kann, unabhängig von der Methode, die von niedrigeren Treibern verwendet wird).