Chamando WmiSystemControl para lidar com IRPs WMI
As rotinas da biblioteca WMI simplificam o tratamento de solicitações WMI porque, em vez de processar cada solicitação, um driver chama WmiSystemControl. Na chamada WmiSystemControl , o driver passa uma estrutura de WMILIB_CONTEXT inicializada que contém pontos de entrada para as rotinas de retorno de chamada da biblioteca WMI do driver (rotinas DpWmiXxx ) e informações sobre os blocos de dados e os blocos de eventos do driver.
Como a biblioteca WMI não fornece nenhum mecanismo para passar nomes de instância dinâmica ou uma lista de nomes de instância estática, um driver pode usar a biblioteca WMI para lidar com solicitações que envolvem apenas blocos de dados com nomes de instância estática com base em um PDO ou uma única cadeia de caracteres de nome base. Para obter mais informações sobre nomes de instância estáticos e dinâmicos, consulte Definindo nomes de instância WMI. Nada impede que um driver use a biblioteca WMI para lidar com solicitações para esses blocos e solicitações de processamento para outros blocos em sua rotina DispatchSystemControl . Para obter mais informações, consulte Processando IRPs WMI em uma rotina DispatchSystemControl.
Para lidar com IRPs WMI chamando WmiSystemControl, um driver deve implementar determinadas rotinas de retorno de chamada DpWmiXxxx necessárias e pode implementar rotinas de retorno de chamada DpWmiXxx adicionais opcionais:
DpWmiQueryReginfo —(Obrigatório) Fornece informações sobre os dados e os blocos de eventos que estão sendo registrados pelo driver. A WMI chama a rotina DpWmiQueryReginfo de um driver para processar uma solicitação de IRP_MN_REGINFO ou IRP_MN_REGINFO_EX . Para obter mais informações, consulte Usando a biblioteca WMI para registrar blocos.
DpWmiQueryDataBlock —(Obrigatório) Retorna uma única instância ou todas as instâncias de um bloco de dados. A WMI chama a rotina DpWmiQueryDataBlock de um driver para processar uma solicitação de IRP_MN_QUERY_SINGLE_INSTANCE ou IRP_MN_QUERY_ALL_DATA .
DpWmiSetDataBlock —(Opcional) Altera todos os itens de dados em uma única instância de um bloco de dados. A WMI chama a rotina DpWmiSetDataBlock de um driver para processar uma solicitação de IRP_MN_CHANGE_SINGLE_INSTANCE .
DpWmiSetDataItem—(Opcional) Altera um único item de dados em uma instância de um bloco de dados. A WMI chama a rotina DpWmiSetDataItem de um driver para processar uma solicitação de IRP_MN_CHANGE_SINGLE_ITEM .
DpWmiFunctionControl —(Opcional) Habilita e desabilita a notificação de eventos e a coleta de dados para blocos registrados como caros de coletar. A WMI chama a rotina DpWmiFunctionControl de um driver para processar uma solicitação de IRP_MN_ENABLE_COLLECTION, IRP_MN_DISABLE_COLLECTION, IRP_MN_ENABLE_EVENTS ou IRP_MN_DISABLE_EVENTS .
DpWmiExecuteMethod—(Opcional) Executa um método associado a um bloco de dados. A WMI chama a rotina DpWmiExecuteMethod de um driver para processar uma solicitação de IRP_MN_EXECUTE_METHOD .
As rotinas DpWmiXxx de um driver podem ter todos os nomes escolhidos pelo gravador de driver.
Antes de chamar WmiSystemControl, o driver deve inicializar uma estrutura WMILIB_CONTEXT com pontos de entrada para suas rotinas DpWmiXxx e informações sobre seus blocos de dados e blocos de eventos.
Quando o driver recebe uma solicitação WMI:
O driver chama WmiSystemControl com um ponteiro para sua estrutura de WMILIB_CONTEXT inicializada, um ponteiro para seu objeto de dispositivo e um ponteiro para o IRP.
O WMI valida os parâmetros IRP e chama a rotina DpWmiXxxx do driver que processa a solicitação. Se o driver não definir nenhum ponto de entrada em seu WMILIB_CONTEXT para uma rotina DpWmiXxxx opcional, o WMI concluirá o IRP com valores padrão e status.
Em sua rotina DpWmiXxx , o driver processa a solicitação e grava qualquer saída no buffer fornecido pelo chamador. Por exemplo, a rotina DpWmiQueryDataBlock de um driver gravaria as instâncias solicitadas do bloco especificado no buffer.
Em todas as rotinas DpWmiXxx, exceto DpWmiQueryReginfo, o driver chama WmiCompleteRequest para concluir a solicitação ou retorna STATUS_PENDING para adiar a conclusão, como para qualquer IRP.
O WMI executa qualquer pós-processamento necessário, empacota qualquer saída em uma estrutura WNODE_XXX apropriada e passa a saída e status para o consumidor de dados.