IRP_MJ_READ (FS- und Filtertreiber)

Sendebedingungen

Der E/A-Manager oder ein Dateisystemtreiber sendet die IRP_MJ_READ Anforderung. Diese Anforderung kann beispielsweise gesendet werden, wenn eine Benutzermodusanwendung eine Win32-Funktion wie ReadFile aufgerufen hat oder wenn eine Kernelmoduskomponente ZwReadFile aufgerufen hat.

Vorgang: Dateisystemtreiber

Der Dateisystemtreiber sollte das Dateiobjekt extrahieren und decodieren, um die Parameter und den Nebenfunktionscode zu bestimmen.

Bei MDL-Leseanforderungen (Memory Descriptor List) sollte das Dateisystem den Nebenfunktionscode überprüfen, um zu ermitteln, welcher Vorgang angefordert wird. Im Folgenden sind die gültigen Nebenfunktionscodes aufgeführt, die nur für zwischengespeicherte Datei-E/A-Vorgänge verwendet werden können:

  • IRP_MN_COMPLETE
  • IRP_MN_COMPLETE_MDL
  • IRP_MN_COMPLETE_MDL_DPC
  • IRP_MN_COMPRESSED
  • IRP_MN_DPC
  • IRP_MN_MDL
  • IRP_MN_MDL_DPC
  • IRP_MN_NORMAL

Weitere Informationen zur Behandlung dieses IRP finden Sie in den CDFS- und FASTFAT-Beispielen, die im Windows Driver Kit (WDK) enthalten sind.

Vorgang: Legacy-Dateisystemfiltertreiber

Der Filtertreiber sollte alle erforderlichen Verarbeitungen ausführen und je nach Art des Filters eine der folgenden Aktionen ausführen:

  • Schließen Sie die IRP ab oder schlagen Sie fehl, oder
  • Übergeben Sie den IRP an den nächstniedrigen Treiber auf dem Stapel.

Parameter

Ein Dateisystem oder Filtertreiber ruft IoGetCurrentIrpStackLocation für den angegebenen IRP auf, um einen Zeiger auf den eigenen Stapelspeicherort im IRP abzurufen. In den folgenden Parametern zeigt Irp auf den IRP und IrpSp auf den IO_STACK_LOCATION. Der Treiber kann die Informationen verwenden, die in den folgenden Elementen des IRP- und des IRP-Stapelspeicherorts festgelegt sind, um eine Leseanforderung zu verarbeiten:

  • DeviceObject ist ein Zeiger auf das Zielgerätobjekt.

  • Irp->AssociatedIrp.SystemBuffer verweist auf einen vom System bereitgestellten Puffer, der als Zwischensystempuffer verwendet werden soll, wenn das DO_BUFFERED_IO-Flag in DeviceObject-Flags> festgelegt ist. Andernfalls ist dieses Element auf NULL festgelegt.

  • Irp->IoStatus verweist auf eine IO_STATUS_BLOCK-Struktur, die die endgültige Vervollständigung status und Informationen zum angeforderten Vorgang empfängt. Weitere Informationen finden Sie in der Beschreibung des IoStatusBlock-Parameters zu ZwReadFile.

  • Irp->MdlAddress ist die Adresse einer Speicherdeskriptorliste (Memory Descriptor List, MDL), die die Seiten beschreibt, die die zu lesenden Daten enthalten.

  • *Irp->UserBuffer verweist auf einen vom Aufrufer bereitgestellten Ausgabepuffer, der die aus der Datei gelesenen Daten empfängt.

  • IrpSp->FileObject zeigt auf das Dateiobjekt, das DeviceObject zugeordnet ist. Wenn das FO_SYNCHRONOUS_IO-Flag in IrpSp-FileObject-Flags>> festgelegt ist, wurde das Dateiobjekt für synchrone E/A-Vorgänge geöffnet.

    Der Parameter IrpSp-FileObject> enthält einen Zeiger auf das Feld RelatedFileObject, das ebenfalls eine FILE_OBJECT-Struktur ist. Das Feld RelatedFileObject der FILE_OBJECT-Struktur ist während der Verarbeitung von IRP_MJ_READ ungültig und sollte nicht verwendet werden.

  • IrpSp->MajorFunction ist auf IRP_MJ_READ festgelegt.

  • IrpSp->MinorFunction gibt den angeforderten Vorgang an und enthält einen der folgenden Werte:

  • IRP_MN_COMPLETE

  • IRP_MN_COMPLETE_MDL

  • IRP_MN_COMPLETE_MDL_DPC

  • IRP_MN_COMPRESSED

  • IRP_MN_DPC

  • IRP_MN_MDL

  • IRP_MN_MDL_DPC

  • IRP_MN_NORMAL

  • IrpSp->Parameters.Read.ByteOffset ist eine LARGE_INTEGER Variable, die den Anfangsbyteoffset in der Datei der zu lesenden Daten angibt.

  • IrpSp->Parameters.Read.Keyist der Schlüsselwert, der einer Bytebereichssperre für die Zieldatei zugeordnet ist.

  • IrpSp->Parameters.Read.Length ist die Länge der zu lesenden Daten in Bytes. Wenn der Lesevorgang erfolgreich ist, wird die Anzahl der gelesenen Bytes im Element Information der IO_STATUS_BLOCK Struktur zurückgegeben, auf die von Irp-IoStatus> verwiesen wird.

Hinweise

Dateisysteme runden Schreib- und Lesevorgänge am Ende der Datei auf ein Vielfaches der Sektorgröße des zugrunde liegenden Dateispeichergeräts ab. Wenn Filter Vorlese- oder Vorschreibvorgänge verarbeiten, müssen diese Filter, die Puffer zuweisen und austauschen, die Größe eines zugeordneten Puffers auf ein Vielfaches der Sektorgröße des zugeordneten Geräts aufrunden. Wenn dies nicht der Fall ist, überschreitet die Länge der vom zugrunde liegenden Dateisystem übertragenen Daten die zugewiesene Länge des Puffers. Weitere Informationen zum Austauschen von Puffern finden Sie unter swapBuffers Minifilter Sample.

Weitere Informationen

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ (WDK-Kernelreferenz)

IRP_MJ_WRITE

ZwReadFile