IRP_MJ_DEVICE_CONTROL (FS- und Filtertreiber)

Sendebedingungen

Der E/A-Manager, andere Betriebssystemkomponenten und andere Kernelmodustreiber senden IRP_MJ_DEVICE_CONTROL Anforderungen. Normalerweise wird diese IRP im Namen einer Anwendung im Benutzermodus gesendet, die die Win32 DeviceIoControl-Funktion aufgerufen hat, oder im Namen einer Kernelmoduskomponente, die ZwDeviceIoControlFile aufgerufen hat.

Vorgang: Dateisystemtreiber

Der Dateisystemtreiber sollte das Dateiobjekt extrahieren und decodieren, um zu ermitteln, ob die Anforderung für ein Handle ausgegeben wurde, bei dem es sich um ein geöffnetes Volume handelt. Wenn ja, sollte der Dateisystemtreiber den IRP an den Gerätetreiber für das Speichergerät übergeben, auf dem das Volume eingebunden ist. Andernfalls sollte für den Treiber ein Fehler beim IRP auftreten.

Vorgang: Legacy-Dateisystemfiltertreiber

Der Filtertreiber sollte alle erforderlichen Verarbeitungen ausführen und je nach Art des Filters entweder den IRP abschließen oder an den nächstniedrigen Treiber auf dem Stapel übergeben.

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 Gerätesteuerungsanforderung zu verarbeiten.

  • DeviceObject ist ein Zeiger auf das Zielgerätobjekt.

  • Irp->AssociatedIrp.SystemBuffer verweist auf einen vom System bereitgestellten Eingabepuffer, der an den Gerätetreiber für das Zielgerät übergeben werden soll. Wird für METHOD_BUFFERED oder METHOD_DIRECT E/A verwendet. Ob dieser Parameter erforderlich ist, hängt vom spezifischen E/A-Steuerungscode ab.

  • 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 in ZwDeviceIoControlFile.

  • Irp->MdlAddress ist die Adresse einer Speicherdeskriptorliste (Memory Descriptor List, MDL), die einen Ausgabepuffer beschreibt, der an den Gerätetreiber für das Zielgerät übergeben werden soll. Wird für METHOD_DIRECT E/A verwendet. Ob dieser Parameter erforderlich ist, hängt vom spezifischen E/A-Steuerungscode ab.

  • Irp->RequestorMode gibt den Ausführungsmodus des Prozesses an, der den Vorgang angefordert hat, entweder KernelMode oder UserMode.

  • Irp->UserBuffer verweist auf einen vom Aufrufer bereitgestellten Ausgabepuffer, der an den Gerätetreiber für das Zielgerät übergeben werden soll. Wird für METHOD_BUFFERED oder METHOD_NEITHER E/A verwendet. Ob dieser Parameter optional oder erforderlich ist, hängt vom spezifischen E/A-Steuerungscode ab.

  • IrpSp->FileObject zeigt auf das Dateiobjekt, das DeviceObject zugeordnet ist.

    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_DEVICE_CONTROL ungültig und sollte nicht verwendet werden.

  • IrpSp->MajorFunction ist auf IRP_MJ_DEVICE_CONTROL festgelegt.

  • IrpSp->Parameters.DeviceIoControl.InputBufferLength ist die Größe des Puffers in Bytes, auf den Irp-AssociatedIrp.SystemBuffer> verweist.

  • IrpSp->Parameters.DeviceIoControl.IoControlCode ist der IOCTL-Funktionscode, der an den Gerätetreiber für das Zielgerät übergeben werden soll.

    Ausführliche Informationen zu IOCTL-Anforderungen finden Sie unter Verwenden von E/A-Steuerungscodes und "Geräteeingabe- und Ausgabesteuerungscodes" in der Windows SDK-Dokumentation.

  • IrpSp->Parameters.DeviceIoControl.OutputBufferLength ist die Größe des Puffers in Bytes, auf den Irp-UserBuffer> verweist.

  • IrpSp->Parameters.DeviceIoControl.Type3InputBuffer ist der Eingabepuffer für Kernelmodusanforderungen, die METHOD_NEITHER verwenden.

Weitere Informationen

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL (WDK-Kernelreferenz)

Verwenden von E/A-Steuerungscodes

ZwDeviceIoControlFile