Eventos de desencadenador de servicio

Un servicio puede registrarse para iniciarse o detenerse cuando se produce un evento de desencadenador. Esto elimina la necesidad de que los servicios se inicien cuando se inicia el sistema, o para que los servicios sondee o esperen activamente a un evento; Un servicio puede iniciarse cuando es necesario, en lugar de iniciarse automáticamente si hay o no trabajo que hacer. Algunos ejemplos de eventos de desencadenador predefinidos incluyen la llegada de un dispositivo de una clase de interfaz de dispositivo especificada o la disponibilidad de un puerto de firewall determinado. Un servicio también puede registrarse para un evento de desencadenador personalizado generado por un proveedor de Seguimiento de eventos para Windows (ETW).

Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: Los eventos de desencadenador de servicio no se admiten hasta Windows Server 2008 R2 y Windows 7.

Un desencadenador consta de un tipo de evento de desencadenador, un subtipo de evento de desencadenador, la acción que se realizará en respuesta al evento de desencadenador y (para determinados tipos de eventos de desencadenador) uno o varios elementos de datos específicos del desencadenador. El subtipo y los elementos de datos específicos del desencadenador especifican juntas las condiciones para notificar al servicio del evento. El formato de un elemento de datos depende del tipo de evento de desencadenador; un elemento de datos puede ser datos binarios, una cadena o una cadena múltiple. Las cadenas deben ser Unicode; No se admiten cadenas ANSI.

Para registrarse para eventos desencadenadores, el servicio llama a ChangeServiceConfig2 con SERVICE_CONFIG_TRIGGER_INFO y proporciona una estructura de SERVICE_TRIGGER_INFO . La estructura SERVICE_TRIGGER_INFO apunta a una matriz de estructuras de SERVICE_TRIGGER , cada una de las cuales especifica un desencadenador.

La acción del desencadenador especificada se realiza si la condición del desencadenador es verdadera cuando se inicia el sistema o si la condición del desencadenador se vuelve verdadera mientras se ejecuta el sistema. Por ejemplo, si un servicio se registra para iniciarse cuando un dispositivo determinado está disponible, el servicio se inicia cuando se inicia el sistema si el dispositivo ya está conectado al equipo; el servicio se inicia cuando llega el dispositivo si el usuario conecta el dispositivo mientras se ejecuta el sistema.

Si un desencadenador tiene elementos de datos específicos del desencadenador, la acción del desencadenador solo se realiza si el elemento de datos que acompaña al evento del desencadenador coincide con uno de los elementos de datos especificados por el servicio con el desencadenador. La coincidencia de datos binarios se realiza mediante la comparación bit a bit. La coincidencia de cadenas no distingue mayúsculas de minúsculas. Si el elemento de datos es una cadena múltiple, todas las cadenas de la cadena múltiple deben coincidir.

Cuando se inicia un servicio en respuesta a un evento de desencadenador, el servicio recibe SERVICE_TRIGGER_STARTED_ARGUMENT como argv[1] en su función de devolución de llamada ServiceMain . Argv[0] es siempre el nombre corto del servicio.

Un servicio que se registra para iniciarse en respuesta a un evento de desencadenador podría detenerse después de un tiempo de espera de inactividad cuando el servicio no tiene trabajo. Un servicio que se detiene debe estar preparado para controlar SERVICE_CONTROL_TRIGGEREVENT solicitudes de control que llegan mientras el servicio se detiene. El SCM envía una solicitud de control SERVICE_CONTROL_TRIGGEREVENT cada vez que se produce un nuevo evento de desencadenador mientras el servicio está en estado de ejecución. Para evitar perder eventos de desencadenador, el servicio debe devolver ERROR_SHUTDOWN_IN_PROGRESS para cualquier solicitud de control de SERVICE_CONTROL_TRIGGEREVENT que llegue mientras el servicio pasa de ejecutarse a detenido. Esto indica al SCM que desencadene eventos de desencadenador de cola y espere a que el servicio entre en el estado detenido. A continuación, el SCM realiza la acción asociada al evento desencadenador en cola, como iniciar el servicio.

Cuando el servicio está listo para controlar los eventos desencadenadores de nuevo, establece SERVICE_ACCEPT_TRIGGEREVENT en su máscara aceptada por controles en una llamada a SetServiceStatus. Esto suele hacerse cuando el servicio llama a SetServiceStatus con SERVICE_RUNNING. A continuación, el SCM emite una solicitud de SERVICE_CONTROL_TRIGGEREVENT para cada evento desencadenador en cola hasta que la cola esté vacía.

Un servicio que tiene servicios dependientes que se ejecutan no se puede detener en respuesta a un evento de desencadenador.

Las solicitudes trigger-start y trigger-stop no están garantizadas en condiciones de memoria baja.

Use la función QueryServiceConfig2 para recuperar la configuración de eventos de desencadenador de un servicio.

La herramienta SC (sc.exe) se puede usar para configurar o consultar los eventos desencadenadores de un servicio en el símbolo del sistema. Use la opción triggerinfo para configurar un servicio para iniciar o detener en respuesta a un evento desencadenador. Use la opción qtriggerinfo para consultar la configuración del desencadenador de un servicio.

En el ejemplo siguiente se consulta la configuración del desencadenador del servicio W32time, que se configura para iniciarse cuando el equipo está unido a un dominio y se detiene cuando el equipo sale del dominio.

C:\>sc qtriggerinfo w32time
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: w32time

        START SERVICE
          DOMAIN JOINED STATUS         : 1ce20aba-9851-4421-9430-1ddeb766e809 [DOMAIN JOINED]
        STOP SERVICE
          DOMAIN JOINED STATUS         : ddaf516e-58c2-4866-9574-c3b615d42ea1 [NOT DOMAIN JOINED]

En el ejemplo siguiente se consulta la configuración del desencadenador del servicio de entrada de tableta, que está configurado para iniciarse cuando un dispositivo HID con el GUID {4d1e55b2-f16f-11cf-88cb-001111000030} y cualquiera de los identificadores de dispositivo HID especificados llega.

C:\>sc qtriggerinfo tabletinputservice
[SC] QueryServiceConfig2 SUCCESS

SERVICE_NAME: tabletinputservice

        START SERVICE
          DEVICE INTERFACE ARRIVAL     : 4d1e55b2-f16f-11cf-88cb-001111000030 [INTERFACE CLASS GUID]
            DATA                       : HID_DEVICE_UP:000D_U:0001
            DATA                       : HID_DEVICE_UP:000D_U:0002
            DATA                       : HID_DEVICE_UP:000D_U:0003
            DATA                       : HID_DEVICE_UP:000D_U:0004