Skicka WMI-händelser

En drivrutin kan använda WMI-händelser för att meddela program i användarläge om händelser utan att programmen behöver avsöka eller skicka IP-adresser. En drivrutin bör använda WMI-händelser för att meddela WMI-klienter om exceptionella villkor, inte som ett alternativ till felloggning. En drivrutin bör ha stöd för alla standardhändelseblock som definierats för dess enhetstyp i Wmicore.mof och kan definiera och registrera ytterligare anpassade händelseblock för att stödja enhetsspecifika meddelanden.

Ett händelseblock är helt enkelt ett datablock som härleds från den abstrakta basklassen WMIEvent. Ett händelseblock kan innehålla någon av samma data som ett datablock, eller så kan det vara tomt, dvs. ett händelseblock behöver inte innehålla några drivrutinsdefinierade dataobjekt. Om ett händelseblock innehåller data bör den totala storleken på WNODE_XXX plus data inte överskrida den registerdefinierade gränsen på 1 kilobyte. I allmänhet resulterar mindre händelser i bättre systemprestanda och snabbare aviseringar. Information om hur du definierar block finns i MOF-syntax för WMI-data och händelseblock och Designa WMI-data och händelseblock.

En drivrutin anger stöd för en händelse genom att registrera motsvarande händelseblock där WMIREG_FLAG_EVENT_ONLY_GUID är satt i blockets WMIREGGUID-struktur. Information om hur du registrerar block finns i Registrera som en WMI-dataprovider.

När en WMI-klientanvändare begär meddelande om en händelse skickar WMI en IRP_MN_ENABLE_EVENTS begäran till drivrutinen, som aviserar drivrutinen att börja övervaka händelsens drivrutinsbestämmde utlösarvillkor. När utlösarvillkoret inträffar skickar drivrutinen sedan händelsen till WMI, som levererar den till alla datakonsumenter som har registrerat sig för händelsen.

En drivrutin skickar en händelse till WMI på något av följande sätt:

  • Anropa WMI-biblioteksrutinen wmiFireEvent i kernelläge. En drivrutin kan anropa WmiFireEvent för att endast skicka händelser som inte använder dynamiska instansnamn och som baserar statiska instansnamn på en enda basnamnsträng eller enhetsinstans-ID för en PDO. Dessutom måste händelsen vara en enda instans, det vill säga att en drivrutin inte kan anropa WmiFireEvent för att skicka en händelse som består av ett enskilt objekt eller flera instanser. Mer information finns i Skicka en händelse med WmiFireEvent.

  • Anropa kernellägesrutinen IoWMIWriteEvent med en pekare till en drivrutinsallokerad och initierad WNODE_XXX-struktur som innehåller händelsens data. Mer information finns i Skicka en händelse med IoWMIWriteEvent.