Share via


IRP_MN_REGINFO

Treiber, die WMI unter Microsoft Windows 98 und Microsoft Windows 2000 unterstützen, müssen diese IRP verarbeiten. (Treiber, die auch Windows XP unterstützen, müssen auch die IRP_MN_REGINFO_EX IRP verarbeiten.) Ein Treiber kann WMI-IRPs verarbeiten, indem er WmiSystemControl aufruft oder den IRP selbst verarbeitet, wie unter Behandeln von WMI-Anforderungen beschrieben.

Hauptcode

IRP_MJ_SYSTEM_CONTROL

Sendebedingungen

Unter Windows 98 und Windows 2000 sendet WMI diese IRP, um die Registrierungsinformationen eines Treibers abzufragen oder zu aktualisieren, nachdem der Treiber IoWMIRegistrationControl aufgerufen hat. Unter Windows XP und höher sendet WMI stattdessen die IRP_MN_REGINFO_EX Anforderung.

WMI sendet diesen IRP unter IRQL = PASSIVE_LEVEL im Kontext eines Systemthreads.

Eingabeparameter

Parameters.WMI.ProviderId verweist auf das Geräteobjekt des Treibers, das auf die Anforderung reagieren soll. Dieser Zeiger befindet sich am E/A-Stapelspeicherort des Treibers im IRP.

Parameters.WMI.DataPath ist auf WMIREGISTER festgelegt, um Registrierungsinformationen abzufragen, oder WMIUPDATE , um sie zu aktualisieren.

Parameters.WMI.BufferSize gibt die maximale Größe des nicht auslagerten Puffers bei Parameters.WMI.Buffer an. Die Größe muss größer oder gleich der Summe von (sizeof(WMIREGINFO) + (GuidCount * sizeof(WMIREGGUID)) sein, wobei GuidCount die Anzahl der vom Treiber registrierten Daten- und Ereignisblöcke und ggf. Speicherplatz für statische instance Namen ist.

Ausgabeparameter

Wenn der Treiber WMI IRPs verarbeitet, indem er WmiSystemControl aufruft, ruft WMI Registrierungsinformationen für die Datenblöcke eines Treibers ab, indem er seine DpWmiQueryReginfo-Routine aufruft.

Andernfalls füllt der Treiber eine WMIREGINFO-Struktur unter Parameters.WMI.Buffer wie folgt aus:

  • Legt BufferSize auf die Größe der WMIREGINFO-Struktur in Byte und zugeordneten Registrierungsdaten fest.

  • Wenn der Treiber WMI-Anforderungen im Namen eines anderen Treibers verarbeitet, legt NextWmiRegInfo auf den Offset in Bytes vom Anfang dieses WMIREGINFO-Elements bis zum Anfang einer anderen WMIREGINFO-Struktur fest, die Registrierungsinformationen des anderen Treibers enthält.

  • Legt RegistryPath auf den Registrierungspfad fest, der an die DriverEntry-Routine des Treibers übergeben wurde.

  • Wenn Parameters.WMI.Datapath auf WMIREGISTER festgelegt ist, legt MofResourceName auf den Offset vom Anfang dieser WMIREGINFO auf eine gezählte Unicode-Zeichenfolge fest, die den Namen der MOF-Ressource des Treibers in der Imagedatei enthält.

  • Legt GuidCount auf die Anzahl der zu registrierenden oder zu aktualisierenden Daten- und Ereignisblöcke fest.

  • Schreibt ein Array von WMIREGGUID-Strukturen , eines für jeden Daten- oder Ereignisblock, der vom Treiber verfügbar gemacht wird, bei WmiRegGuid.

Der Treiber füllt jede WMIREGGUID-Struktur wie folgt aus:

  • Legt GUID auf die GUID fest, die den Block identifiziert.

  • Legt Flags fest, um Informationen zu instance Namen und anderen Merkmalen des Blocks bereitzustellen. Wenn beispielsweise ein Block mit statischen instance Namen registriert wird, legt der Treiber Flags mit dem entsprechenden WMIREG_FLAG_INSTANCE_XXX-Flag fest.

Wenn der Block mit statischen instance Namen registriert wird, hat der Treiber Folgendes:

  • Legt InstanceCount auf die Anzahl von Instanzen fest.

  • Legt eines der folgenden Member auf einen Offset in Bytes auf statische instance Namensdaten für den Block fest:

    • Wenn der Treiber Flags mit WMIREG_FLAG_INSTANCE_LIST festlegt, legt er InstanceNameList auf einen Offset auf eine Liste statischer instance Namenszeichenfolgen fest. WMI gibt Instanzen in nachfolgenden Anforderungen durch Index in dieser Liste an.
    • Wenn der Treiber Flags mit WMIREG_FLAG_INSTANCE_BASENAME festlegt, legt er BaseNameOffset auf einen Offset auf eine Basisnamenzeichenfolge fest. WMI verwendet diese Zeichenfolge, um statische instance Namen für den Block zu generieren.
    • Wenn der Treiber Flags mit WMIREG_FLAG_INSTANCE_PDO festlegt, legt er Pdo auf einen Offset auf einen Zeiger auf die PDO fest, die an die AddDevice-Routine des Treibers übergeben wird. WMI verwendet das Gerät instance Pfad des PDO, um statische instance Namen für den Block zu generieren.
  • Schreibt die instance Namenszeichenfolgen, die Basisnamenzeichenfolge oder einen Zeiger auf den PDO an dem Offset, der durch InstanceNameList, BaseName bzw. Pdo angegeben ist.

Wenn der Treiber die WMI-Registrierung im Namen eines anderen Treibers verarbeitet (z. B. eine Miniklasse oder einen Miniporttreiber), füllt er eine andere WMIREGINFO-Struktur mit den Registrierungsinformationen des anderen Fahrers aus und schreibt sie unter NextWmiRegInfo in der vorherigen Struktur.

Wenn der Puffer bei Parameters.WMI.Buffer zu klein ist, um alle Daten zu empfangen, schreibt ein Treiber die erforderliche Größe in Bytes als ULONG in Parameters.WMI.Buffer , schlägt den IRP aus und gibt STATUS_BUFFER_TOO_SMALL zurück.

E/A-Statusblock

Wenn der Treiber die IRP durch Aufrufen von WmiSystemControl verarbeitet, legt WMI Irp-IoStatus.Status> und Irp-IoStatus.Information im E/A-status-Block> fest.

Andernfalls legt der Treiber Irp-IoStatus.Status> auf STATUS_SUCCESS oder auf einen entsprechenden Fehler status wie den folgenden fest:

STATUS_BUFFER_TOO_SMALL

Bei Erfolg legt ein Treiber Irp-IoStatus.Information> auf die Anzahl der Bytes fest, die unter Parameters.WMI.Buffer in den Puffer geschrieben werden.

Vorgang

Ein Treiber kann WMI-IRPs verarbeiten, indem er WmiSystemControl aufruft oder den IRP selbst verarbeitet, wie unter Behandeln von WMI-Anforderungen beschrieben.

Wenn ein Treiber WMI IRPs verarbeitet, indem er WmiSystemControl aufruft, ruft diese Routine die DpWmiQueryReginfo-Routine des Treibers auf.

Wenn ein Treiber eine IRP_MN_REGINFO Anforderung selbst verarbeitet, sollte er dies nur tun, wenn Parameters.WMI.ProviderId auf dasselbe Geräteobjekt wie der Zeiger verweist, den der Treiber an IoWMIRegistrationControl übergeben hat. Andernfalls muss der Treiber die Anforderung an den nächstniedrigen Treiber weiterleiten.

Vor der Verarbeitung der Anforderung muss der Treiber Parameters.WMI.DataPath überprüfen, um zu ermitteln, ob WMI Registrierungsinformationen (WMIREGISTER) abfragen oder ein Update (WMIUPDATE) anfordern.

WMI sendet diesen IRP mit WMIREGISTER, nachdem ein Treiber IoWMIRegistrationControl mit WMIREG_ACTION_REGISTER oder WMIREG_ACTION_REREGISTER aufgerufen hat. Daraufhin sollte ein Treiber den Puffer unter Parameters.WMI.Buffer wie folgt ausfüllen:

  • Eine WMIREGINFO-Struktur , die den Registrierungspfad des Treibers, den Namen seiner MOF-Ressource und die Anzahl der zu registrierenden Blöcke angibt.

  • EineWMIREGGUID-Struktur für jeden zu registrierenden Block. Wenn ein Block mit statischen instance Namen registriert werden soll, legt der Treiber das entsprechende WMIREG_FLAG_INSTANCE_XXX-Flag in der WMIREGGUID-Struktur für diesen Block fest.

  • Alle Zeichenfolgen, die WMI benötigt, um statische instance Namen zu generieren.

WMI sendet diesen IRP mit WMIUPDATE , nachdem ein Treiber IoWmiRegistrationControl mit WMIREG_ACTION_UPDATE_GUIDS aufgerufen hat. Daraufhin sollte ein Treiber den Puffer unter Parameters.WMI.Buffer wie folgt mit einer WMIREGINFO-Struktur füllen:

  • Um einen Block zu entfernen, legt der Treiber WMIREG_FLAG_REMOVE_GUID in seiner WMIREGGUID-Struktur fest.

  • Um einen Block hinzuzufügen oder zu aktualisieren (z. B. zum Ändern seiner statischen instance namen), löscht der Treiber WMIREG_FLAG_REMOVE_GUID und stellt neue oder aktualisierte Registrierungswerte für den Block bereit.

  • Um einen neuen oder vorhandenen Block mit statischen instance Namen zu registrieren, legt der Treiber die entsprechende WMIREG_FLAG_INSTANCE_XXX fest und stellt alle Zeichenfolgen bereit, die WMI benötigt, um statische instance Namen zu generieren.

Ein Treiber kann dieselben WMIREGINFO-Strukturen verwenden, um Blöcke zu entfernen, hinzuzufügen oder zu aktualisieren, wie er ursprünglich verwendet wurde, um alle Blöcke zu registrieren, wobei nur die Flags und Daten für die zu aktualisierenden Blöcke geändert werden. Wenn eine WMIREGGUID in einer solchen WMIREGINFO-Struktur genau mit der WMIREGGUID übereinstimmt, die vom Treiber bei der erstmaligen Registrierung dieses Blocks übergeben wurde, überspringt WMI die Verarbeitung, die an der Aktualisierung des Blocks beteiligt ist.

WMI sendet keine IRP_MN_REGINFO-Anforderung , nachdem ein Treiber IoWMIRegistrationControl mit WMIREG_ACTION_DEREGISTER aufgerufen hat, da WMI keine weiteren Informationen vom Treiber benötigt. Ein Treiber hebt die Registrierung seiner Blöcke in der Regel als Reaktion auf eine IRP_MN_REMOVE_DEVICE Anforderung auf.

Anforderungen

Header

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

Weitere Informationen

DpWmiQueryReginfo

IoWMIRegistrationControl

WMILIB_CONTEXT

WMIREGGUID

WMIREGINFO

WmiSystemControl

IRP_MN_REGINFO_EX