Freigeben über


IRP_MN_READ_CONFIG

Bustreiber für Busse mit Konfigurationsraum müssen diese Anforderung für ihre untergeordneten Geräte (untergeordnete PDOs) verarbeiten. Filter- und Funktionstreiber verarbeiten diese Anforderung nicht.

Wert

0x0F

Hauptcode

IRP_MJ_PNP

Sendebedingungen

Ein Treiber oder eine andere Systemkomponente sendet diesen IRP, um den Konfigurationsraum des übergeordneten Bus eines Geräts zu lesen.

Ein Treiber oder eine andere Systemkomponente sendet diesen IRP an IRQL < DISPATCH_LEVEL in einem beliebigen Threadkontext.

Eingabeparameter

Das Parameters.ReadWriteConfig-Element der IO_STACK_LOCATION-Struktur ist selbst eine Struktur, die die folgenden Informationen enthält:

ULONG WhichSpace;
PVOID Buffer;
ULONG Offset;
ULONG Length

Die Member der -Struktur können von verschiedenen Bustreibern unterschiedlich interpretiert werden, aber die Member werden in der Regel wie folgt definiert:

WhichSpace
Gibt an, auf welchen Arbeitsspeicherbereich zugegriffen werden soll. Dieser Parameter kann folgende Werte haben:

Wert Bus Bedeutung

PCI_WHICHSPACE_CONFIG

PCI

PCI-Konfigurationsbereich.

PCI_WHICHSPACE_ROM

PCI

Schreibgeschützter Arbeitsspeicher.

PCCARD_COMMON_MEMORY

PCCARD_COMMON_MEMORY_INDIRECT

PCMCIA

Haupt-PCCARD-Speicher.

PCCARD_ATTRIBUTE_MEMORY

PCCARD_ATTRIBUTE_MEMORY_INDIRECT

PCMCIA

PCMCIA-Attributbereich (Konfiguration).

PCCARD_PCI_CONFIGURATION_SPACE

PCMCIA

PCI-Konfigurationsbereich.

Die PCI_XXX-Werte werden in Wdm.h definiert. Die PCCARD_XXX-Werte werden in Ntddpcm.h definiert.

Puffer
Verweist auf einen Puffer, in dem die angeforderten Informationen zurückgegeben werden sollen. Die Komponente, die das IRP sendet, ordnet diese Struktur aus dem ausgelagerten Speicher zu. Das Format des Puffers ist busspezifisch.

Offset
Gibt einen Offset in den Konfigurationsbereich an.

Länge
Gibt die Anzahl der zu lesenden Bytes an.

Ausgabeparameter

Bei Erfolg füllt ein Bustreiber den Puffer unter Parameters.ReadWriteConfig.Buffer mit den angeforderten Daten.

E/A-Statusblock

Ein Bustreiber legt Irp-IoStatus.Status> auf STATUS_SUCCESS oder auf einen geeigneten Fehler status fest, z. B. STATUS_INVALID_PARAMETER_n, STATUS_NO_SUCH_DEVICE oder STATUS_DEVICE_NOT_READY.

Bei Erfolg legt ein Bustreiber Irp-IoStatus.Information> auf die Anzahl der zurückgegebenen Bytes fest.

Wenn ein Bustreiber diese Anforderung nicht sofort ausführen kann, kann er den IRP als ausstehend markieren, STATUS_PENDING zurückgeben und die IRP zu einem späteren Zeitpunkt abschließen.

Vorgang

Ein Bustreiber verarbeitet diese IRP für seine untergeordneten Geräte (untergeordnete PDOs).

Funktions- und Filtertreiber verarbeiten diese IRP nicht; sie übergeben sie an den nächstniedrigen Treiber ohne Änderungen an Irp-IoStatus>. Status und sie legen keine IoCompletion-Routine fest.

Ein Bustreiber, der diese Anforderung verarbeitet, sollte den WhichSpace-Parameter überprüfen, um sicherzustellen, dass er einen Wert enthält, den der Treiber unterstützt.

Unter Plug & Play finden Sie die allgemeinen Regeln für die Behandlung Plug & Play untergeordneten IRPs.

Senden dieses IRP

In der Regel sendet ein Funktionstreiber diesen IRP an den obersten Treiber im Gerätestapel, an den er angefügt ist, und der IRP wird vom übergeordneten Bustreiber verarbeitet.

Informationen zum Senden von IRPs finden Sie unter Behandeln von IRPs . Die folgenden Schritte gelten speziell für dieses IRP:

  • Ordnen Sie einen Puffer aus einem ausgelagerten Pool zu, und initialisieren Sie ihn auf Nullen.

  • Legen Sie die Werte am nächsten E/A-Stapelspeicherort des IRP fest: Legen Sie MajorFunction auf IRP_MJ_PNP fest, legen Sie MinorFunction auf IRP_MN_READ_CONFIG fest, und legen Sie die entsprechenden Werte in Parameters.ReadWriteConfig fest.

  • Initialisieren Sie IoStatus.Status , um STATUS_NOT_SUPPORTED.

  • Aufheben der Zuordnung des IRP und des Puffers, wenn sie nicht mehr benötigt werden.

Treiber müssen diesen IRP von IRQL < DISPATCH_LEVEL senden.

Ein Treiber kann über eine Busschnittstellenroutine unter DISPATCH_LEVEL auf den Konfigurationsraum eines Busses zugreifen, wenn der übergeordnete Bustreiber eine solche Schnittstelle unterstützt. Um eine Busschnittstelle abzurufen, sendet ein Treiber eine IRP_MN_QUERY_INTERFACE Anforderung an den Gerätestapel, an den der Treiber angefügt ist. Der Treiber ruft dann die entsprechende Routine auf, die in der Schnittstelle zurückgegeben wird.

Um beispielsweise den Konfigurationsbereich aus DISPATCH_LEVEL zu lesen, kann ein Treiber IRP_MN_QUERY_INTERFACE während der Treiberinitialisierung aufrufen, um die BUS_INTERFACE_STANDARD Schnittstelle vom übergeordneten Bustreiber abzurufen. Der Treiber sendet die Abfrage-IRP von IRQL PASSIVE_LEVEL. Später ruft der Treiber aus code at IRQL DISPATCH_LEVEL die entsprechende Routine auf, die in der Schnittstelle zurückgegeben wird, z. B. die Interface.GetBusData-Routine .

Anforderungen

Header

Wdm.h (einschließen Wdm.h, Ntddk.h oder Ntifs.h)

Weitere Informationen

IRP_MN_QUERY_INTERFACE

IRP_MN_WRITE_CONFIG