Llamar a WmiSystemControl para controlar los IRP de WMI

Las rutinas de la biblioteca WMI simplifican el control de las solicitudes WMI porque, en lugar de procesar cada solicitud de este tipo, un controlador llama a WmiSystemControl. En la llamada a WmiSystemControl , el controlador pasa una estructura de WMILIB_CONTEXT inicializada que contiene puntos de entrada a las rutinas de devolución de llamada de la biblioteca WMI del controlador (rutinas dpWmiXxx ) e información sobre los bloques de datos y los bloques de eventos del controlador.

Dado que la biblioteca WMI no proporciona ningún mecanismo para pasar nombres de instancia dinámicos o una lista de nombres de instancia estática, un controlador puede usar la biblioteca WMI para controlar las solicitudes que implican solo bloques de datos con nombres de instancia estáticos basados en un PDO o una sola cadena de nombre base. Para obtener más información sobre los nombres de instancia estáticos y dinámicos, vea Definición de nombres de instancia de WMI. Nada impide que un controlador use la biblioteca WMI para controlar las solicitudes de estos bloques y procesar las solicitudes de otros bloques en su rutina DispatchSystemControl . Para obtener más información, consulte Procesamiento de IRP de WMI en una rutina DispatchSystemControl.

Para controlar los IRP de WMI mediante una llamada a WmiSystemControl, un controlador debe implementar ciertas rutinas de devolución de llamada de DpWmiXxx necesarias y podría implementar rutinas de devolución de llamada opcionales de DpWmiXxx :

Las rutinas dpWmiXxx de un controlador pueden tener cualquier nombre elegido por el escritor de controladores.

Antes de llamar a WmiSystemControl, el controlador debe inicializar una estructura de WMILIB_CONTEXT con puntos de entrada a sus rutinas dpWmiXxx e información sobre sus bloques de datos y bloques de eventos.

Cuando el controlador recibe una solicitud WMI:

  1. El controlador llama a WmiSystemControl con un puntero a su estructura de WMILIB_CONTEXT inicializada, un puntero a su objeto de dispositivo y un puntero al IRP.

  2. WMI valida los parámetros IRP y llama a la rutina DpWmiXxx del controlador que procesa la solicitud. Si el controlador no establece ningún punto de entrada en su WMILIB_CONTEXT para una rutina dpWmiXxx opcional, WMI completa el IRP con los valores predeterminados y el estado.

  3. En su rutina DpWmiXxx , el controlador procesa la solicitud y escribe cualquier salida en el búfer proporcionado por el autor de la llamada. Por ejemplo, la rutina DpWmiQueryDataBlock de un controlador escribiría las instancias solicitadas del bloque especificado en el búfer.

  4. En todas las rutinas dpWmiXxx excepto DpWmiQueryReginfo, el controlador llama a WmiCompleteRequest para completar la solicitud o devuelve STATUS_PENDING para posponer la finalización, como para cualquier IRP.

  5. WMI realiza cualquier posprocesamiento necesario, empaqueta cualquier salida en una estructura WNODE_XXX adecuada y pasa la salida y el estado al consumidor de datos.