Delen via


WMI WNODE_XXX Structuren

WMI maakt gebruik van een set standaardgegevensstructuren die WNODE_XXX worden genoemd om gegevens door te geven tussen gebruikersmodusgegevensgebruikers en gegevensproviders in kernelmodus, zoals stuurprogramma's. Als een stuurprogramma WMI-aanvragen verwerkt door WmiSystemControlaan te roepen, is het stuurprogramma niet vereist om WNODE_XXX structuren te lezen of schrijven. Anders moet het stuurprogramma de invoer WNODE_XXX- interpreteren op Parameters.WMI.Buffer en/of een uitvoer schrijven WNODE_XXX- naar die locatie.

De volgende tabel bevat WMI IRPs en de bijbehorende WNODE_XXX structuren.

WMI IRP Gerelateerde WNODE_XXX structuur

IRP_MN_CHANGE_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE

IRP_MN_CHANGE_SINGLE_ITEM

WNODE_SINGLE_ITEM

IRP_MN_EXECUTE_METHOD

WNODE_METHOD_ITEM

IRP_MN_QUERY_ALL_DATA

WNODE_ALL_DATA

IRP_MN_QUERY_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE

Twee extra WNODE_XXX structuren, WNODE_EVENT_ITEM en WNODE_EVENT_REFERENCE, worden gebruikt om meldingen van ingeschakelde gebeurtenissen te verzenden. Een stuurprogramma dat gebeurtenisblokken registreert, wordt, als een gebeurtenis is ingeschakeld en de gebeurtenis plaatsvindt, een melding van de gebeurtenis naar WMI verzonden door IoWMIWriteEvent- aan te roepen en een WNODE_EVENT_XXX--structuur door te geven. Zie WMI-gebeurtenissen verzendenvoor informatie over het verzenden van WMI-gebeurtenissen.

Elke WNODE_XXX structuur bestaat uit het volgende:

  • Een ingesloten WNODE_HEADER structuur die informatie bevat die gebruikelijk is voor alle WNODE_XXX inclusief de grootte van de buffer, de GUID die het gegevensblok vertegenwoordigt en vlaggen die aangeven welk type WNODE_XXX structuur is, ongeacht of er statische of dynamische instantienamen worden gebruikt, en andere kenmerken van het blok.

  • De vaste leden van de specifieke WNODE_XXX structuur, zoals verschuivingen naar instantienamen en gegevens.

Een WNODE_XXX- structuur in een IRP-buffer (Parameters.WMI.Buffer) wordt doorgaans gevolgd door variabele gegevens die betrekking hebben op de aanvraag, zoals dynamische exemplaarnamen, statische exemplaarnaamtekenreeksen, invoer voor of uitvoer van een methode of gegevens voor een of meer exemplaren van een gegevensblok. De grootte van de buffer moet daarom groter zijn dan grootte van (WNODE_XXX) door de hoeveelheid betrokken variabele gegevens.

WMI voert geen typecontrole uit op variabele gegevens die door een stuurprogramma worden geleverd. Het stuurprogramma moet uitvoergegevens uitlijnen op een geschikte grens in de uitvoerbuffer, zodat een gegevensgebruiker de gegevens correct kan parseren. Elk exemplaar moet met name beginnen op een grens van 8 bytes en elk van de items moet worden uitgelijnd op een natuurlijke grens volgens het gegevensblokschema dat eerder door het stuurprogramma is geregistreerd. Dynamische exemplaarnamen kunnen worden uitgelijnd op een grens van 2 bytes.

In de volgende afbeelding ziet u een blokdiagram van een IRP-buffer met een WNODE_SINGLE_INSTANCE structuur die een stuurprogramma kan retourneren als reactie op een IRP_MN_QUERY_SINGLE_INSTANCE aanvraag.

diagram dat een irp-buffer illustreert die een wnode-single-instance bevat.

Beginnend aan de bovenkant van de vorige afbeelding:

  • De WNODE_HEADER structuur aan het begin van de WNODE_SINGLE_INSTANCE bevindt zich in een WnodeHeader lid. WMI vult alle leden van de WNODE_HEADER in voordat de aanvraag wordt verzonden. In de WNODE_HEADER:

    • WnodeHeader.Buffersize geeft de grootte van de WNODE_SINGLE_INSTANCEaan, inclusief gegevens die de vaste leden van de structuur volgen. (De waarde van WnodeHeader.Buffersize is doorgaans kleiner dan Parameters.WMI.Buffersize, wat de grootte aangeeft van de buffer die door WMI is toegewezen om uitvoer van het stuurprogramma te ontvangen.)
    • WnodeHeader.Guid- de GUID bevat waarmee het gegevensblok wordt geïdentificeerd.
    • In dit voorbeeld geeft WnodeHeader.Flags aan dat deze structuur een WNODE_SINGLE_INSTANCE is en dat het gegevensblok statische exemplaarnamen gebruikt.
  • Omdat het gegevensblok gebruikmaakt van namen van statische exemplaren, stelt WMI InstanceIndex in op de index van het exemplaar in de lijst met namen van statische exemplaren die door het stuurprogramma zijn doorgegeven toen het blok werd geregistreerd. OffsetInstanceNames niet wordt gebruikt.

  • WMI stelt DataBlockOffset in om de offset aan te geven van het begin van de buffer tot de eerste byte van instantiegegevens. (Het stuurprogramma mag deze waarde niet wijzigen) Opnieuw omdat het gegevensblok gebruikmaakt van namen van statische exemplaren, geeft deze offset dezelfde locatie aan als VariableData. Als het gegevensblok dynamische exemplaarnamen gebruikte, zouden de exemplaarnamen beginnen bij VariableData- en DataBlockOffset een grotere verschuiving in de buffer zou opgeven.

  • Het stuurprogramma stelt SizeDataBlock in op het aantal bytes aan exemplaargegevens dat wordt geretourneerd.

  • Op VariableData (na exemplaarnaamgegevens, indien aanwezig), schrijft het stuurprogramma exemplaargegevens voor het aangevraagde exemplaar in de uitvoerbuffer.

Een stuurprogramma leest en schrijft WNODE_METHOD_ITEM en WNODE_SINGLE_ITEM structuren op ongeveer dezelfde manier als WNODE_SINGLE_INSTANCE. Deze structuren lijken op elkaar omdat elk de vaste leden OffsetInstanceName, InstanceIndex, DataBlockOffset, SizeDataBlock (of, in het geval van WNODE_SINGLE_ITEM, SizeDataItem) en VariableData. WNODE_METHOD_ITEM bevat een MethodId- en WNODE_SINGLE_ITEM bevat een ItemId- die WNODE_SINGLE_INSTANCE ontbreekt.

WNODE_ALL_DATA verschilt van de voorgaande structuren, omdat deze wordt gebruikt om meerdere exemplaren van een gegevensblok door te geven, mogelijk inclusief dynamische exemplaarnamen en mogelijk verschillende grootten.

In de volgende afbeelding ziet u een blokdiagram van een IRP-buffer met een WNODE_ALL_DATA die een stuurprogramma kan retourneren als reactie op een IRP_MN_QUERY_ALL_DATA aanvraag.

diagram met een irp-buffer met een wnode-all-data.

Beginnend aan de bovenkant van de vorige afbeelding:

  • Zoals beschreven in de vorige afbeelding, bevindt de WNODE_HEADER structuur aan het begin van de WNODE_ALL_DATA zich in een WnodeHeader lid. WnodeHeader.Buffersize en WnodeHeader.Guid respectievelijk de grootte van de WNODE_ALL_DATA en de GUID van het gegevensblok aangeven.

    In dit voorbeeld wordt met WMI WnodeHeader.Flags aangegeven dat deze structuur een WNODE_ALL_DATA is en dat het gegevensblok is geregistreerd met dynamische exemplaarnamen (WMI wist WNODE_FLAG_STATIC_INSTANCE_NAMES en WNODE_FLAG_PDO_INSTANCE_NAMES). Bij uitvoer stelt het stuurprogramma WNODE_FLAG_FIXED_INSTANCE_SIZE in om aan te geven dat alle exemplaren dezelfde grootte hebben.

  • WMI stelt DataBlockOffset in om de offset aan te geven van het begin van de buffer tot de eerste byte van instantiegegevens. (Het stuurprogramma mag deze waarde niet wijzigen). In dit voorbeeld volgen instantiegegevens de namen van de exemplaren op OffsetInstanceNameOffsets.

  • Het stuurprogramma stelt InstanceCount in om aan te geven hoeveel exemplaren worden geretourneerd.

  • WNODE_XXX- voor gegevensblokken die dynamische exemplaarnamen gebruiken, bevatten altijd de tekenreeksen van de instantienaam. Omdat in dit voorbeeld dynamische exemplaarnamen worden gebruikt, geeft OffsetInstanceNameOffsets de offset aan van het begin van de buffer tot een matrix van offsets naar dynamische exemplaarnamen in de buffer.

  • FixedInstanceSize geeft het aantal bytes aan gegevens in elk exemplaar dat door het stuurprogramma wordt geretourneerd. Als exemplaren van dit gegevensblok zouden variëren in grootte, het stuurprogramma zou WNODE_FLAG_FIXED_INSTANCE_SIZE in WnodeHeader.Flags wissen en OffsetInstanceDataAndLength instellen op een matrix van OFFSETINSTANCEDATAANDLENGTH structuren, waarbij elk een offset aangeeft voor de gegevens voor één exemplaar en het aantal bytes in dat exemplaar in plaats van FixedInstanceSizein te stellen.

Zie System Structuresvoor meer informatie over WNODE_XXX structuren.