Eventos de gatilho de serviço

Um serviço pode se registrar para ser iniciado ou interrompido quando ocorre um evento de gatilho. Isso elimina a necessidade de que os serviços iniciem quando o sistema for iniciado ou que os serviços pesquisem ou aguardem ativamente por um evento; um serviço pode ser iniciado quando necessário, em vez de iniciar automaticamente se há ou não trabalho a ser feito. Exemplos de eventos de gatilho predefinidos incluem a chegada de um dispositivo de uma classe de interface de dispositivo especificada ou a disponibilidade de uma porta de firewall específica. Um serviço também pode se registrar para um evento de gatilho personalizado gerado por um provedor ETW ( Rastreamento de Eventos para Windows ).

Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: Não há suporte para eventos de gatilho de serviço até o Windows Server 2008 R2 e o Windows 7.

Um gatilho consiste em um tipo de evento de gatilho, um subtipo de evento de gatilho, a ação a ser executada em resposta ao evento de gatilho e (para determinados tipos de evento de gatilho) um ou mais itens de dados específicos do gatilho. O subtipo e os itens de dados específicos do gatilho juntos especificam as condições para notificar o serviço do evento. O formato de um item de dados depende do tipo de evento de gatilho; um item de dados pode ser dados binários, uma cadeia de caracteres ou uma multistring. As cadeias de caracteres devem ser Unicode; Não há suporte para cadeias de caracteres ANSI.

Para se registrar para eventos de gatilho, o serviço chama ChangeServiceConfig2 com SERVICE_CONFIG_TRIGGER_INFO e fornece uma estrutura SERVICE_TRIGGER_INFO . A estrutura SERVICE_TRIGGER_INFO aponta para uma matriz de estruturas SERVICE_TRIGGER , cada uma especificando um gatilho.

A ação de gatilho especificada será tomada se a condição de gatilho for verdadeira quando o sistema for iniciado ou se a condição de gatilho se tornar verdadeira enquanto o sistema estiver em execução. Por exemplo, se um serviço registrar para ser iniciado quando um dispositivo específico estiver disponível, o serviço será iniciado quando o sistema for iniciado se o dispositivo já estiver conectado ao computador; o serviço é iniciado quando o dispositivo chega se o usuário conecta o dispositivo enquanto o sistema está em execução.

Se um gatilho tiver itens de dados específicos do gatilho, a ação de gatilho será tomada somente se o item de dados que acompanha o evento de gatilho corresponder a um dos itens de dados especificados pelo serviço com o gatilho. A correspondência de dados binários é feita por comparação bit a bit. A correspondência de cadeia de caracteres não diferencia maiúsculas de minúsculas. Se o item de dados for uma multistring, todas as cadeias de caracteres na multistring deverão corresponder.

Quando um serviço é iniciado em resposta a um evento de gatilho, o serviço recebe SERVICE_TRIGGER_STARTED_ARGUMENT como argv[1] em sua função de retorno de chamada ServiceMain . Argv[0] é sempre o nome curto do serviço.

Um serviço que se registra para ser iniciado em resposta a um evento de gatilho pode parar após um tempo limite ocioso quando o serviço não tem trabalho a fazer. Um serviço que para por si só deve estar preparado para lidar com SERVICE_CONTROL_TRIGGEREVENT solicitações de controle que chegam enquanto o serviço está parando. O SCM envia uma solicitação de controle SERVICE_CONTROL_TRIGGEREVENT sempre que um novo evento de gatilho ocorre enquanto o serviço está no estado em execução. Para evitar a perda de eventos de gatilho, o serviço deve retornar ERROR_SHUTDOWN_IN_PROGRESS para qualquer solicitação de controle SERVICE_CONTROL_TRIGGEREVENT que chega enquanto o serviço está fazendo a transição da execução para a parada. Isso instrui o SCM a enfileirar eventos de gatilho e aguardar o serviço entrar no estado parado. Em seguida, o SCM executa a ação associada ao evento de gatilho enfileirado, como iniciar o serviço.

Quando o serviço estiver pronto para manipular eventos de gatilho novamente, ele definirá SERVICE_ACCEPT_TRIGGEREVENT em sua máscara aceita por controles em uma chamada para SetServiceStatus. Isso geralmente é feito quando o serviço chama SetServiceStatus com SERVICE_RUNNING. Em seguida, o SCM emite uma solicitação de SERVICE_CONTROL_TRIGGEREVENT para cada evento de gatilho enfileirado até que a fila esteja vazia.

Um serviço que tem serviços dependentes em execução não pode ser interrompido em resposta a um evento de gatilho.

As solicitações trigger-start e trigger-stop não são garantidas em condições de memória insuficiente.

Use a função QueryServiceConfig2 para recuperar a configuração de evento de gatilho de um serviço.

A ferramenta SC (sc.exe) pode ser usada para configurar ou consultar eventos de gatilho de um serviço no prompt de comando. Use a opção triggerinfo para configurar um serviço para iniciar ou parar em resposta a um evento de gatilho. Use a opção qtriggerinfo para consultar a configuração de gatilho de um serviço.

O exemplo a seguir consulta a configuração de gatilho do serviço W32time, que é configurado para iniciar quando o computador é ingressado em um domínio e para quando o computador sai do domínio.

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]

O exemplo a seguir consulta a configuração de gatilho do serviço de entrada de tablet, que é configurado para iniciar quando um dispositivo HID com o GUID {4d1e55b2-f16f-11cf-88cb-001111000030} e qualquer uma das IDs de dispositivo HID especificadas chega.

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