Bearbeta WMI-IRP:er i en DispatchSystemControl-rutin

En drivrutin som hanterar WMI-IRP:er i sin DispatchSystemControl-rutin måste endast hantera en sådan IRP om enhetsobjektpekaren på Parameters.WMI.ProviderId matchar pekaren som drivrutinen skickade i sitt anrop till IoWMIRegistrationControl. Annars måste drivrutinen vidarebefordra IRP till nästa lägre drivrutin.

Om drivrutinen hanterar begäran måste den:

Kontrollera GUID på Parameters.WMI.DataPath för att avgöra om det representerar ett datablock som stöds av drivrutinen och, om inte, låt IRP misslyckas med STATUS_WMI_GUID_NOT_FOUND.

En förare bör kontrollera indata WNODE_XXX-strukturen på Parameters.WMI.Buffer för instansnamnet vid hantering av någon av följande begäranden:

IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD Drivrutinen bör söka efter instansnamnet på följande sätt:

  • Om WNODE_FLAG_STATIC_INSTANCE_NAMES anges i WnodeHeader.Flags använder du InstanceIndex som ett index i drivrutinslistan över statiska instansnamn för blocket.

  • Om WNODE_FLAG_STATIC_INSTANCE_NAMES är tydligt i WnodeHeader.Flags använder du OffsetInstanceName som förskjutning till instansnamnsträngen i indata WNODE_XXX-strukturen . OffsetInstanceName är förskjutningen i byte från början av strukturen till en USHORT som anger längden på instansnamnsträngen i byte (inte tecken), inklusive NUL-avslutaren om den finns, följt av själva strängen i Unicode.

Om drivrutinen inte kan hitta den instans som anges av InstanceIndex eller OffsetInstanceName måste den avvisa IRP:n med STATUS_WMI_INSTANCE_NOT_FOUND.

För en IRP_MN_EXECUTE_METHOD begäran kontrollerar du MethodID i indata WNODE_METHOD_ITEM och, om metoden inte är giltig för datablocket, misslyckas IRP med STATUS_WMI_ITEMID_NOT_FOUND.

Om begäran genererar utdata bör en drivrutin kontrollera buffertens storlek på Parameters.WMI.BufferSize när någon av följande begäranden hanteras:

IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD Om bufferten är för liten för att ta emot utdata, men minst sizeof(WNODE_TOO_SMALL), ska drivrutinen slutföra IRP och skriva en WNODE_TOO_SMALL struktur till bufferten på Parameters.WMI.Buffer. Om bufferten är mindre än sizeof(WNODE_TOO_SMALL) misslyckas drivrutinen IRP med en NTSTATUS-kod på STATUS_BUFFER_TOO_SMALL.

Om begäran genererar utdata och buffertstorleken är tillräcklig skriver du följande utdata till bufferten på Parameters.WMI.Buffer:

  • För en IRP_MN_QUERY_ALL_DATA begäran skriver drivrutinen en WNODE_ALL_DATA struktur som innehåller data för alla instanser av det angivna datablocket.
  • För en IRP_MN_QUERY_SINGLE_INSTANCE begäran skriver drivrutinen en WNODE_SINGLE_INSTANCE struktur som innehåller data för den angivna instansen av ett datablock.
  • För en IRP_MN_EXECUTE_METHOD om metoden genererar utdata skriver drivrutinen metodutdata i drivrutinsbestämt format efter indata WNODE_METHOD_ITEM i bufferten (skriver över indata, om några).

Ange Irp-IoStatus.Information> till antalet byte som skrivits till bufferten på Parameters.WMI.Buffer och Irp-IoStatus.Status> till STATUS_SUCCESS.

Anropa IoCompleteRequest för att slutföra IRP.

Mer information finns i WMI WNODE_XXX-strukturer.