IRP_MN_REGINFO_EX
WMI sendet diese IRP, um die Registrierungsinformationen eines Treibers abzufragen oder zu aktualisieren, nachdem der Treiber IoWMIRegistrationControl aufgerufen hat. 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 WmiSystemControl aufruft , um eine IRP_MN_REGINFO_EX-Anforderung zu verarbeiten, ruft WMI wiederum die DpWmiQueryReginfo-Routine dieses Treibers auf.
Unter Microsoft Windows XP und höheren Betriebssystemen müssen Treiber, die WMI unterstützen, diese IRP verarbeiten. Treiber, die Microsoft Windows 98 und Windows 2000 unterstützen, müssen auch IRP_MN_REGINFO verarbeiten.
Hauptcode
Sendebedingungen
Unter Windows XP und höher sendet WMI diese IRP, um die Registrierungsinformationen eines Treibers abzufragen oder zu aktualisieren, nachdem der Treiber IoWMIRegistrationControl aufgerufen hat. Unter Windows 98 und Windows 2000 sendet WMI stattdessen die IRP_MN_REGINFO 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 von Datenblöcken und Ereignisblöcken ist, die vom Treiber registriert werden, sowie speicherplatz für statische instance Namen, falls vorhanden.
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. Treiber müssen ObReferenceObject für das physische Geräteobjekt aufrufen, das in Pdo übergeben wurde. Das System ruft automatisch ObDereferenceObject auf, um das Objekt zu deferieren. der Fahrer darf dies nicht tun. (Treiber, die WmiSystemControl zum Verarbeiten von IRPs verwenden, müssen obReferenceObject nicht aufrufen. WMI tut dies automatisch, bevor die DpWmiQueryReginfo-Routine des Treibers aufgerufen wird.)
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
Wenn ein Treiber eine IRP_MN_REGINFO_EX 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_EX-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) |