Partilhar via


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âmicos.

Ao contrário das estruturas WNODE_XXX 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 ativar o evento. Em seguida, quando a condição de gatilho do evento ocorrer, o driver:

  1. Aloca um buffer do pool não paginado para conter a estrutura WNODE_XXX necessária para o evento, incluindo espaço para dados variáveis, se houver.

    Dependendo do evento, o motorista pode alocar um WNODE_SINGLE_ITEM, um WNODE_SINGLE_INSTANCE ou um WNODE_ALL_DATA para o evento. O tamanho dos dados WNODE_XXX mais variáveis não deve exceder o limite definido pelo Registro de 1K.

  2. Inicializa todos os membros da estrutura WNODE_XXX , incluindo WnodeHeader.Flags:

    • O driver configura 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_NOMES_DE_INSTÂNCIA_DO_PDO

    • O motorista pode definir sinalizadores adicionais, dependendo do evento.

  3. Lança um ponteiro para o WNODE_XXX para um PWNODE_EVENT_ITEM.

  4. Chama IoWMIWriteEvent com o ponteiro.

    Quando IoWMIWriteEvent for concluído com êxito, o WMI libertará a memória alocada pelo driver para o evento.

Depois que IoWMIWriteEvent retorna, o driver continua a monitorizar a condição de disparo do evento e envia o evento cada vez que a condição de disparo ocorre, até que o WMI envie uma solicitação IRP_MN_DISABLE_EVENTS para desativar 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 especifique 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 um evento que não usa nomes de instância dinâmicos e que consiste 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 eventos 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.