Invio di un evento con IoWMIWriteEvent

Un driver può chiamare IoWMIWriteEvent per inviare qualsiasi evento. L'evento può essere costituito da un singolo elemento, da una singola istanza o da tutte le istanze di un blocco dati e può usare nomi di istanza dinamici.

A differenza delle strutture WNODE_XXX passate con richieste di query o modifiche, allocate e parzialmente inizializzate da WMI, il driver deve allocare e inizializzare tutti i membri della struttura WNODE_XXX che contiene un evento.

Un driver deve inviare un evento solo dopo che WMI ha inviato una richiesta di IRP_MN_ENABLE_EVENTS per abilitare l'evento. Quando si verifica quindi la condizione del trigger dell'evento, il driver:

  1. Alloca un buffer da un pool non di pagina per contenere la struttura WNODE_XXX necessaria per l'evento, incluso lo spazio per i dati delle variabili, se presente.

    A seconda dell'evento, il driver potrebbe allocare un WNODE_SINGLE_ITEM, un WNODE_SINGLE_INSTANCE o un WNODE_ALL_DATA per l'evento. Le dimensioni dei dati della variabile WNODE_XXX più non devono superare il limite definito dal Registro di sistema di 1K.

  2. Inizializza tutti i membri della struttura WNODE_XXX , inclusi WnodeHeader.Flags:

    • Il driver imposta il flag WNODE_FLAG_EVENT_ITEM per indicare che la struttura è un evento.

    • Il driver imposta uno dei flag seguenti per indicare il tipo di struttura WNODE_XXX:

      WNODE_FLAG_ALL_DATA

      WNODE_FLAG_SINGLE_INSTANCE

      WNODE_FLAG_SINGLE_ITEM

    • Il driver imposta o cancella i flag seguenti per indicare se il blocco usa nomi di istanza statici o dinamici:

      WNODE_FLAG_STATIC_INSTANCE_NAMES

      WNODE_FLAG_PDO_INSTANCE_NAMES

    • Il driver potrebbe impostare flag aggiuntivi a seconda dell'evento.

  3. Esegue il cast di un puntatore al WNODE_XXX in un PWNODE_EVENT_ITEM.

  4. Chiama IoWMIWriteEvent con il puntatore .

    Se IoWMIWriteEvent viene completato correttamente, WMI rilascia la memoria allocata dal driver per l'evento.

Dopo che IoWMIWriteEvent restituisce, il driver riprende il monitoraggio della condizione di trigger dell'evento e invia l'evento ogni volta che si verifica la condizione del trigger, finché WMI invia una richiesta di IRP_MN_DISABLE_EVENTS per disabilitare tale evento.

Se le dimensioni di un evento superano il massimo definito dal Registro di sistema di 1K (non consigliato) il driver deve chiamare IoWmiWriteEvent con un WNODE_EVENT_REFERENCE inizializzato che specifica il GUID dell'evento, le relative dimensioni e il relativo indice di istanza (per i nomi di istanza statici) o il nome (per i nomi di istanza dinamici). WMI userà le informazioni nella WNODE_EVENT_REFERENCE per eseguire query per l'evento.

Un driver può inviare eventi che non usano nomi di istanza dinamici e che sono costituiti da una singola istanza chiamando la routine wmiFireEvent della libreria WMI. Il driver non deve allocare e inizializzare una struttura WNODE_XXX per una chiamata WmiFireEvent . WMI inserisce i dati dell'evento del driver in un WNODE_SINGLE_INSTANCE e lo distribuisce ai consumer di dati. Per altre informazioni sull'invio di eventi con WmiFireEvent, vedere Invio di un evento con WmiFireEvent.