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 :
DpWmiQueryReginfo:(Obligatorio) Proporciona información sobre los bloques de datos y eventos registrados por el controlador. WMI llama a la rutina DpWmiQueryReginfo de un controlador para procesar una solicitud de IRP_MN_REGINFO o IRP_MN_REGINFO_EX . Para obtener más información, vea Usar la biblioteca WMI para registrar bloques.
DpWmiQueryDataBlock:(Obligatorio) Devuelve una sola instancia o todas las instancias de un bloque de datos. WMI llama a la rutina DpWmiQueryDataBlock de un controlador para procesar una solicitud de IRP_MN_QUERY_SINGLE_INSTANCE o IRP_MN_QUERY_ALL_DATA .
DpWmiSetDataBlock:(Opcional) Cambia todos los elementos de datos de una sola instancia de un bloque de datos. WMI llama a la rutina DpWmiSetDataBlock de un controlador para procesar una solicitud de IRP_MN_CHANGE_SINGLE_INSTANCE .
DpWmiSetDataItem:(Opcional) Cambia un único elemento de datos en una instancia de un bloque de datos. WMI llama a la rutina DpWmiSetDataItem de un controlador para procesar una solicitud de IRP_MN_CHANGE_SINGLE_ITEM .
DpWmiFunctionControl:(Opcional) Habilita y deshabilita la notificación de eventos y la recopilación de datos para los bloques registrados como costosos de recopilar. WMI llama a la rutina DpWmiFunctionControl de un controlador para procesar una solicitud de IRP_MN_ENABLE_COLLECTION, IRP_MN_DISABLE_COLLECTION, IRP_MN_ENABLE_EVENTS o IRP_MN_DISABLE_EVENTS .
DpWmiExecuteMethod:(Opcional) Ejecuta un método asociado a un bloque de datos. WMI llama a la rutina DpWmiExecuteMethod de un controlador para procesar una solicitud de IRP_MN_EXECUTE_METHOD .
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:
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.
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.
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.
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.
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.