Bestimmen der Puffermethode für einen E/A-Vorgang

Dateisysteme sind wie Gerätetreiber für die Übertragung von Daten zwischen Anwendungen im Benutzermodus und den Geräten eines Systems verantwortlich. Das Betriebssystem stellt die folgenden drei Methoden für den Zugriff auf Datenpuffer bereit:

  • In gepufferten E/A-Vorgängen ordnet der E/A-Manager einen Systempuffer für den Vorgang aus einem nicht ausseitigen Pool zu. Der E/A-Manager kopiert Daten aus diesem Systempuffer in den Benutzerpuffer der Anwendung und umgekehrt im Kontext des Threads, der den E/A-Vorgang initiiert hat.

  • In direkten E/A-Vorgängen testet und sperrt der E/A-Manager den Benutzerpuffer. Anschließend wird eine Speicherdeskriptorliste (Memory Descriptor List, MDL) erstellt, um den gesperrten Puffer zuzuordnen. Der E/A-Manager greift auf den Puffer im Kontext des Threads zu, der den E/A-Vorgang initiiert hat.

  • Weder in gepufferten noch in direkten E/A-Vorgängen ordnet der E/A-Manager keinen Systempuffer zu und sperrt oder ordnet den Benutzerpuffer nicht zu. Stattdessen wird einfach die ursprüngliche virtuelle Adresse des Puffers an den Dateisystemstapel übergeben. Treiber sind dafür verantwortlich, sicherzustellen, dass sie im Kontext des initiierenden Threads ausgeführt werden und dass die Pufferadressen gültig sind.

    Minifiltertreiber müssen jede Adresse im Benutzerbereich überprüfen, bevor Sie versuchen, sie zu verwenden. Der E/A-Manager und der Filter-Manager überprüfen solche Adressen nicht und überprüfen keine Zeiger, die in Puffer eingebettet sind, die an Minifiltertreiber übergeben werden.

Alle Standardmäßigen Microsoft-Dateisysteme verwenden weder gepufferte noch direkte E/A-Vorgänge für die meisten E/A-Verarbeitungen.

Weitere Informationen zu Puffermethoden finden Sie unter Methoden für den Zugriff auf Datenpuffer.

Bei IRP-basierten E/A-Vorgängen ist die verwendete Puffermethode vorgangsspezifisch und wird durch die folgenden Faktoren bestimmt:

  • Der Typ des E/A-Vorgangs, der ausgeführt wird

  • Der Wert des Flags-Elements der DEVICE_OBJECT-Struktur für das Dateisystemvolume

  • Bei I/O-Steuerungs- (IOCTL) und Dateisystemsteuerungsvorgängen (FSCTL) der Wert des TransferType-Parameters , der an das CTL_CODE Makro übergeben wurde, als die IOCTL oder FSCTL definiert wurde

Schnelle E/A-Vorgänge mit Puffern verwenden immer weder gepufferte noch direkte E/A-Vorgänge.

Dateisystemrückrufvorgänge verfügen nicht über Puffer.

Dieser Abschnitt umfasst Folgendes:

Vorgänge, die IRP-Based oder schnelle E/A-Vorgänge sein können

IRP-basierte E/A-Vorgänge, die Geräteobjektflags gehorchen

IRP-basierte E/A-Vorgänge, die immer gepufferte E/A verwenden

IRP-basierte E/A-Vorgänge, die immer weder gepufferte noch direkte E/A verwenden

IRP-basierte IOCTL- und FSCTL-Vorgänge

IRP-basierte E/A-Vorgänge ohne Puffer