Compartilhar 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â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:

  1. 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.

  2. 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.

  3. Converte um ponteiro para o WNODE_XXX em um PWNODE_EVENT_ITEM.

  4. 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.