Condividi tramite


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 di dati e può usare nomi di istanza dinamica.

A differenza delle strutture WNODE_XXX passate con richieste di query o di modifica, 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. Quindi, quando si verifica la condizione di attivazione dell'evento, il driver:

  1. Alloca un buffer da un pool non a paginazione per contenere la struttura WNODE_XXX necessaria per l'evento, incluso lo spazio per dati variabili, se presenti.

    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 del WNODE_XXX più i dati delle variabili non devono superare il limite definito dal Registro di sistema di 1K.

  2. Inizializza tutti i membri della struttura WNODE_XXX , incluso 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 utilizza 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 a 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 la restituzione di IoWMIWriteEvent , 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 non invia una richiesta di IRP_MN_DISABLE_EVENTS per disabilitare l'evento.

Se le dimensioni di un evento superano il valore 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 dinamica). WMI utilizzerà le informazioni nel WNODE_EVENT_REFERENCE per effettuare una query sull'evento.

Un driver può inviare eventi che non usano nomi di istanza dinamici e 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 crea un pacchetto contenente i dati dell'evento del driver in un WNODE_SINGLE_INSTANCE e lo distribuisce ai consumatori di dati. Per altre informazioni sull'invio di eventi con WmiFireEvent, vedere Invio di un evento con WmiFireEvent.