Enviando um evento com IoWMIWriteEvent
Um driver pode chamar IoWMIWriteEvent para enviar qualquer evento. O evento pode consistir em um único item, uma única instância ou todas as instâncias de um bloco de dados e pode usar nomes de instância dinâmica.
Ao contrário WNODE_ estruturasXXX passadas com solicitações de consulta ou alteração, que são alocadas e parcialmente inicializadas pelo WMI, o driver deve alocar e inicializar todos os membros da estrutura WNODE_XXX que contém um evento.
Um driver deve enviar um evento somente depois que o WMI enviar uma solicitação IRP_MN_ENABLE_EVENTS para habilitar o evento. Em seguida, quando a condição de gatilho do evento ocorre, o driver:
Aloca um buffer do pool nãopagado para conter a estrutura WNODE_XXX necessária para o evento, incluindo espaço para dados variáveis, se houver.
Dependendo do evento, o driver pode alocar um WNODE_SINGLE_ITEM, um WNODE_SINGLE_INSTANCE ou um WNODE_ALL_DATA para o evento. O tamanho do WNODE_XXX mais dados variáveis não deve exceder o limite definido pelo Registro de 1K.
Inicializa todos os membros da estrutura WNODE_XXX , incluindo WnodeHeader.Flags:
O driver define o sinalizador WNODE_FLAG_EVENT_ITEM para indicar que a estrutura é um evento.
O driver define um dos seguintes sinalizadores para indicar o tipo de estrutura WNODE_XXX :
WNODE_FLAG_ALL_DATA
WNODE_FLAG_SINGLE_INSTANCE
WNODE_FLAG_SINGLE_ITEM
O driver define ou limpa os seguintes sinalizadores para indicar se o bloco usa nomes de instância estáticos ou dinâmicos:
WNODE_FLAG_STATIC_INSTANCE_NAMES
WNODE_FLAG_PDO_INSTANCE_NAMES
O driver pode definir sinalizadores adicionais dependendo do evento.
Converte um ponteiro para o WNODE_XXX em um PWNODE_EVENT_ITEM.
Chama IoWMIWriteEvent com o ponteiro .
Se IoWMIWriteEvent for concluído com êxito, o WMI liberará a memória alocada pelo driver para o evento.
Depois que IoWMIWriteEvent retornar, o driver retomará o monitoramento da condição de gatilho do evento e enviará o evento sempre que sua condição de gatilho ocorrer, até que o WMI envie uma solicitação IRP_MN_DISABLE_EVENTS para desabilitar esse evento.
Se o tamanho de um evento exceder o máximo definido pelo Registro de 1K (não recomendado), o driver deverá chamar IoWmiWriteEvent com um WNODE_EVENT_REFERENCE inicializado que especifica o GUID do evento, seu tamanho e seu índice de instância (para nomes de instância estática) ou nome (para nomes de instância dinâmica). O WMI usará as informações no WNODE_EVENT_REFERENCE para consultar o evento.
Um driver pode enviar eventos que não usam nomes de instância dinâmica e que consistem em uma única instância chamando a rotina da biblioteca WMI WmiFireEvent. O driver não precisa alocar e inicializar uma estrutura WNODE_XXX para uma chamada WmiFireEvent . O WMI empacota os dados de evento do driver em um WNODE_SINGLE_INSTANCE e os entrega aos consumidores de dados. Para obter mais informações sobre como enviar eventos com WmiFireEvent, consulte Enviando um evento com WmiFireEvent.