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:

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:

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

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

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

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

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