IRP_MN_ENABLE_EVENTS
Cualquier controlador WMI que registre uno o varios bloques de eventos debe controlar este IRP. Un controlador puede controlar los IRP de WMI llamando a WmiSystemControl o controlando el PROPIO IRP, como se describe en Control de solicitudes WMI.
Si un controlador llama a WmiSystemControl para controlar una solicitud de IRP_MN_ENABLE_EVENTS , WMI a su vez llama a la rutina DpWmiFunctionControl del controlador.
Código principal
Cuándo se envió
WMI envía este IRP para informar al controlador de que un consumidor de datos ha solicitado la notificación de un evento.
WMI envía este IRP en IRQL = PASSIVE_LEVEL en un contexto de subproceso arbitrario.
Parámetros de entrada
Parameters.WMI.ProviderId apunta al objeto de dispositivo del controlador que debe responder a la solicitud. Este puntero se encuentra en la ubicación de la pila de E/S del controlador en irP.
Parameters.WMI.DataPath apunta a un GUID que identifica el bloque de eventos que se va a habilitar.
Parameters.WMI.BufferSize indica el tamaño del búfer no paginado en Parameters.WMI.Buffer, que debe ser mayor o igual que sizeof(WNODE_HEADER). Un controlador que no registra bloques de seguimiento (WMIREG_FLAG_TRACED_GUID) puede omitir este parámetro.
Parameters.WMI.Buffer apunta a un WNODE_HEADER que indica si se debe realizar un seguimiento del evento (WMI_FLAGS_TRACED_GUID) y proporciona un identificador al registrador del sistema. Un controlador que no registra bloques de seguimiento (WMIREG_FLAG_TRACED_GUID) puede omitir este parámetro.
Parámetros de salida
Ninguno.
Bloque de estado de entrada/salida
Si el controlador controla el IRP mediante una llamada a WmiSystemControl, WMI establece Irp-IoStatus.Status> e Irp-IoStatus.Information> en el bloque de estado de E/S.
De lo contrario, el controlador establece Irp-IoStatus.Status> en STATUS_SUCCESS o en un estado de error adecuado, como el siguiente:
STATUS_WMI_GUID_NOT_FOUND
STATUS_INVALID_DEVICE_REQUEST
Si se ejecuta correctamente, un controlador establece Irp-IoStatus.Information> en cero.
Operación
Un controlador puede controlar los IRP de WMI llamando a WmiSystemControl o controlando el PROPIO IRP, como se describe en Control de solicitudes WMI.
Si un controlador controla los IRP de WMI llamando a WmiSystemControl, esa rutina llama a la rutina DpWmiFunctionControl del controlador o devuelve STATUS_SUCCESS si el controlador no define la rutina.
Si un controlador controla una solicitud de IRP_MN_ENABLE_EVENTS , solo debe hacerlo si Parameters.WMI.ProviderId apunta al mismo objeto de dispositivo que el puntero que el controlador pasó a IoWMIRegistrationControl. De lo contrario, el controlador debe reenviar la solicitud al controlador inferior siguiente.
Antes de que el controlador controle la solicitud, debe determinar si Parameters.WMI.DataPath apunta a un GUID que admite el controlador. Si no es así, el controlador debe producir un error en el IRP y devolver STATUS_WMI_GUID_NOT_FOUND.
Si el controlador admite el bloque de eventos, habilita el evento para todas las instancias de ese bloque de datos.
No es necesario que el controlador compruebe si los eventos ya están habilitados para el bloque de eventos porque WMI envía una única solicitud para habilitar el bloque de eventos cuando el primer consumidor de datos habilita el evento. WMI no enviará otra solicitud para habilitar sin una solicitud de deshabilitación intermedia.
Un controlador que registra bloques de seguimiento (WMIREG_FLAG_TRACED_GUID) también debe determinar si se debe enviar el evento a WMI o al registrador del sistema para el seguimiento. Si se solicita el seguimiento, Parameters.WMI.Buffer apunta a una estructura de WNODE_HEADER en la que Flags se establece con WNODE_FLAG_TRACED_GUID y HistoricalContext contiene un identificador para el registrador.
Para obtener más información sobre cómo definir bloques de eventos, enviar eventos y seguimiento, consulte Instrumental de administración de Windows.
Requisitos
Encabezado |
Wdm.h (incluya Wdm.h, Ntddk.h o Ntifs.h) |