Enviando eventos WMI
Um driver pode usar eventos WMI para notificar aplicativos de eventos no modo de usuário sem exigir que os aplicativos pesquisem ou enviem IRPs. Um driver deve usar eventos WMI para notificar os clientes WMI de condições excepcionais, não como uma alternativa ao log de erros. Um driver deve dar suporte a quaisquer blocos de eventos padrão definidos para seu tipo de dispositivo em Wmicore.mof e pode definir e registrar blocos de eventos personalizados adicionais para dar suporte a notificações específicas do dispositivo.
Um bloco de eventos é simplesmente um bloco de dados que deriva da classe base abstrata WMIEvent. Um bloco de eventos pode conter qualquer um dos mesmos dados que um bloco de dados ou pode estar vazio, ou seja, um bloco de eventos não precisa conter nenhum item de dados definido pelo driver. Se um bloco de eventos contiver dados, o tamanho total do WNODE_XXX mais os dados não deverá exceder o limite definido pelo Registro de 1 quilobyte. Em geral, eventos menores resultam em melhor desempenho do sistema e notificação mais oportuna. Para obter informações sobre como definir blocos, consulte Sintaxe MOF para blocos de eventos e dados WMI ecriação de blocos de eventos e dados WMI.
Um driver indica suporte para um evento registrando o bloco de eventos correspondente com WMIREG_FLAG_EVENT_ONLY_GUID definido na estrutura WMIREGGUID do bloco. Para obter informações sobre como registrar blocos, consulte Registrando-se como um provedor de dados WMI.
Quando um usuário cliente WMI solicita a notificação de um evento, o WMI envia uma solicitação IRP_MN_ENABLE_EVENTS para o driver, o que alerta o driver para começar a monitorar a condição de gatilho determinada pelo driver do evento. Em seguida, quando a condição de gatilho ocorre, o driver envia o evento para o WMI, que o entrega a todos os consumidores de dados que se registraram para o evento.
Um driver envia um evento para o WMI de uma das seguintes maneiras:
Chame a rotina da biblioteca WMI do modo kernel WmiFireEvent. Um driver pode chamar WmiFireEvent para enviar apenas eventos que não usam nomes de instância dinâmica e que baseam nomes de instância estática em uma única cadeia de caracteres de nome base ou na ID da instância do dispositivo de um PDO. Além disso, o evento deve ser uma única instância, ou seja, um driver não pode chamar WmiFireEvent para enviar um evento que consiste em um único item ou várias instâncias. Para obter mais informações, consulte Enviando um evento com WmiFireEvent.
Chame a rotina do modo kernel IoWMIWriteEvent com um ponteiro para uma estrutura WNODE_XXX alocada e inicializada pelo driver que contém os dados do evento. Para obter mais informações, consulte Enviando um evento com IoWMIWriteEvent.