Invio di eventi WMI
Un driver può usare gli eventi WMI per notificare alle applicazioni in modalità utente gli eventi senza richiedere alle applicazioni di eseguire il polling o inviare i provider di integrazione. Un driver deve usare eventi WMI per notificare ai client WMI condizioni eccezionali, non come alternativa alla registrazione degli errori. Un driver deve supportare qualsiasi blocco di eventi standard definito per il tipo di dispositivo in Wmicore.mof e potrebbe definire e registrare blocchi di eventi personalizzati aggiuntivi per supportare le notifiche specifiche del dispositivo.
Un blocco di eventi è semplicemente un blocco di dati che deriva dalla classe di base astratta WMIEvent. Un blocco di eventi può contenere uno qualsiasi degli stessi dati di un blocco di dati o può essere vuoto, ovvero un blocco di eventi non deve contenere elementi di dati definiti dal driver. Se un blocco di eventi contiene dati, le dimensioni totali del WNODE_XXX più i dati non devono superare il limite definito dal Registro di sistema di 1 kilobyte. In generale, gli eventi più piccoli generano prestazioni del sistema migliori e notifiche più tempestive. Per informazioni sulla definizione dei blocchi, vedere sintassi MOF per i blocchi di dati e eventi WMI e progettazione di blocchi di eventi e dati WMI.
Un driver indica il supporto per un evento registrando il blocco di eventi corrispondente con WMIREG_FLAG_EVENT_ONLY_GUID impostato nella struttura WMIREGGUID del blocco. Per informazioni sulla registrazione dei blocchi, vedere Registrazione come provider di dati WMI.
Quando un utente client WMI richiede la notifica di un evento, WMI invia una richiesta di IRP_MN_ENABLE_EVENTS al driver, che avvisa il driver di iniziare a monitorare la condizione di trigger determinata dal driver dell'evento. Quindi, quando si verifica la condizione del trigger, il driver invia l'evento a WMI, che lo recapita a tutti i consumer di dati registrati per l'evento.
Un driver invia un evento a WMI in uno dei modi seguenti:
Chiamare la routine WMI della libreria WMI in modalità kernel WmiFireEvent. Un driver può chiamare WmiFireEvent per inviare solo eventi che non usano nomi di istanza dinamica e che basano i nomi di istanza statica su una singola stringa del nome di base o l'ID istanza del dispositivo di un PDO. Inoltre, l'evento deve essere una singola istanza, ovvero un driver non può chiamare WmiFireEvent per inviare un evento costituito da un singolo elemento o più istanze. Per altre informazioni, vedere Invio di un evento con WmiFireEvent.
Chiamare la routine in modalità kernel IoWMIWriteEvent con un puntatore a una struttura WNODE_XXX allocata e inizializzata dal driver che contiene i dati dell'evento. Per altre informazioni, vedere Invio di un evento con IoWMIWriteEvent.